Amazon ElastiCache for Redis を使用しています。Redis クライアントの読み込みリクエストが常にシャードのプライマリノードから読み込まれるか、シャードのプライマリノードにリダイレクトされる理由は何ですか?
解決方法
Redis クラスターのどのノードも、Redis クライアントからクエリを受信できます。クライアントがレプリカノードに読み取り/書き込みクエリを送信すると、ノードはリクエストを分析して、シャードの同じハッシュスロットに属する単一のキーまたは複数キーのオペレーションであるかどうかを確認します。クラスターモードが有効なクラスターのレプリカノードでのデフォルト動作では、すべてのクライアントの読み取り/書き込みリクエストが、キーのハッシュスロットに属するシャードで権限を持っているプライマリノードにリダイレクトされます。レプリカノードは、そのシャードがハッシュスロットに属していて、クライアントによって読み取り専用のコマンドが開始される場合にのみ、読み取りリクエストを処理します。つまり、リクエストの前にクライアントによって読み取り専用が発行された場合にのみ、レプリカノードはリクエストを処理します。それ以外の場合、リクエストはハッシュスロットが属するシャードのプライマリノードにリダイレクトされます。
例
1. クラスターにログインしてキーを設定します。
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>
2. レプリカノードに接続します。
次の例では、読み取り専用コマンドは送信されず、リクエストはプライマリノードにリダイレクトされます。
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 エラーの詳細については、Redis.io ウェブサイトの Redis cluster specification - Redirection and resharding を参照してください。
次の例では、読み取り専用コマンドが最初に送信されるため、レプリカノードはプライマリノードにリダイレクトする代わりにリクエストを処理します。
172.31.30.175:6379> readonly
OK
172.31.30.175:6379> get key8
"This is testing for readonly"
172.31.30.175:6379>
読み取り専用コマンドは、クライアントがノードに初めて接続するときに発行する必要があります。このコマンドがアクティブであるのは、クライアントが同じノードからキーを読み取るまでのみです。クライアントが同じまたは異なるシャード内の別のレプリカノードに接続する場合は、新しい読み取り専用コマンドを発行する必要があります。