Redis クライアントの読み取りリクエストが Amazon ElastiCache for Redis のレプリカノードではなくシャードのプライマリノードにリダイレクトされる問題を解決したいと考えています。
簡単な説明
ElastiCache for Redis クラスター内のどのノードでも Redis クライアントからクエリを受信できます。クライアントがレプリカノードに読み取り/書き込みクエリを送信すると、ノードはリクエストが単一キー操作かマルチキー操作かを確認します。シングルキーまたはマルチキー操作は、シャードの同じハッシュスロットに属している必要があります。デフォルトでは、クラスターモードがオンになっているレプリカノードは、すべての読み取りおよび書き込みリクエストをプライマリノードにリダイレクトします。読み取りおよび書き込みリクエストは、キーのハッシュスロットに属するシャードの権限のあるプライマリノードにリダイレクトされます。シャードがハッシュスロットに属していて、readonly コマンドが最初に開始された場合、レプリカノードは読み取り要求のみを完了します。レプリカノードは、クライアントによって最初に readonly コマンドが発行された場合にのみ読み取り要求を処理します。readonly リクエストが最初に送信されない場合、レプリカノードはリクエストをプライマリノードにリダイレクトします。
解決策
Redis クライアントの読み取りリクエストがレプリカノードで確実に読み取られるようにするには、次の手順を実行します。
-
クラスターにログインし、キーを設定します。例:
172.31.21.72:6379> set key8 "This is testing for readonly"
-> Redirected to slot [13004] located at 172.31.21.72:6379
OK
172.31.21.72:6379>
-
レプリカノードに接続します。必ず readonly コマンドを実行してください。例: **注:**次の例は、最初に送信されない readonly コマンドで、リクエストがプライマリノードにリダイレクトされることを示しています。
172.31.30.175:6379> info replication
# Replication
role:slave
master_host:172.31.21.72
master_port:6379
master_link_status:up
172.31.30.175:637> CLUSTER KEYSLOT key8
(integer) 13004
172.31.30.175:637> get key8
(error) MOVED 13004 172.31.21.72:6379
172.31.30.175:637> get key8
-> Redirected to slot [13004] located at 172.31.21.72:6379
"This is testing for readonly"
172.31.21.72:6379>
**注:**前の例に示した MOVED エラーは、Redis クラスタークライアントがプライマリノードへのリダイレクトリクエストを処理できない場合に発生します。MOVED エラーについての詳細は、「MOVED リダイレクト」 (Redis ウェブサイト) を参照してください。
例:
**注:**次の例は、最初に送信される readonly コマンドを示しています。これにより、レプリカノードはリクエストを処理でき、リクエストをプライマリノードにリダイレクトしなくても済みます。
172.31.30.175:6379> readonly
OK
172.31.30.175:6379> get key8
"This is testing for readonly"
172.31.30.175:6379>
**注:**クライアントが初めてノードに接続するときは、必ず readonly コマンドを発行してください。このコマンドは、クライアントが同じノードからキーを読み取るまでのみ有効です。クライアントが同じシャードまたは異なるシャード内の別のレプリカノードに接続する場合は、readonly コマンドが発行されていることを確認してください。