【SpringBoot】RedisReadOnlyExceptionの発生原因と解決に向けて

RedisSystemException(ハンドリングできてなくて500エラー)が発生!中身見てみるとRedisReadOnlyException。。。。

READONLY You can't write against a read only replica.

なんじゃこりゃ!となることでしょう

今回は「Redis」の簡単な説明と「RedisReadOnlyException」の原因と解決に向けてまとめていきます


1. Redisとは

RedisはRemote Dictionary Serverの略で、メモリ内データ構造ストアとして広く使用されています

主な特徴は以下の通りです

  • 高速
    • メモリ内で動作するため、データの読み書きが非常に高速です
  • データ構造
    • 文字列、リスト、セット、ハッシュ、ソート済みセットなど、さまざまなデータ構造をサポートしています
  • 多用途
    • キャッシュ、セッションストア、メッセージブローカー、リアルタイム分析など、さまざまな用途で使用されます
  • 永続化
    • メモリ内のデータをディスクに保存する機能を持っています。
  • 分散システム
    • レプリケーションやクラスタリングをサポートし、スケーラビリティと高可用性を実現します

↓ こちら分かりやすいかもです

■ 【Qiita】初心者による初心者のためのRedis解説
https://qiita.com/keinko/items/60c844bcf329bd3f4af8


2. RedisReadOnlyExceptionの原因

RedisReadOnlyExceptionはRedisサーバーが読み取り専用モードに設定されている場合に発生します

レプリカ(スレーブ)モード

Redisにはマスター-スレーブレプリケーションの機能があり、スレーブノードはマスターノードのデータを複製します

スレーブノードはデフォルトで読み取り専用です

読み取り専用に設定している状態でスレーブノードに対して書き込み操作を行おうとすると、RedisReadOnlyExceptionが発生します

運用モードの変更

Redisサーバーが何らかの理由で読み取り専用モードに切り替えられた場合
この場合、意図的に設定を変更したか、フェイルオーバーなどのシステムイベントによりモードが変更された可能性があります

アクセス制限

特定のクライアントや接続に対して書き込みを禁止する設定が施されている場合


3. 解決に向けて

この例外を解決するための以下アプローチ!

接続先の確認

まず、アプリケーションが接続しているRedisノードがマスターであることを確認します
スレーブノードに接続している場合はマスターに接続を切り替えます

設定の確認

Redisの設定ファイル(redis.conf)や起動時のオプションで読み取り専用モードが有効になっていないか確認します

例えば、スレーブモードの場合は設定を変更するか、書き込みが必要な場合はマスターに接続するようにします

Redisクラスタ

Redisがクラスタ構成になっている場合、適切なノードに接続していることを確認します

Redisクラスタでは、特定のキーに対する操作が適切なノードで行われるようにルーティングされます

フェイルオーバーの確認

最近のフェイルオーバーイベントが発生した場合、フェイルオーバー後の新しいマスターノードに接続する必要があります


これらの点を確認し、適切なノードに接続するように設定を見直すことで、RedisReadOnlyExceptionを解消できるかもしれません

是非フォローしてください

最新の情報をお伝えします