Redisクラスターモードの簡単な紹介
図00に示すように、クラスターモードの公式に推奨される最小のベストプラクティスソリューションは、6ノード、3マスター、3スレーブのモードです。
キースロットと転送メカニズム
Redisは、キースペースを16,384スロットに分割し、次のアルゴリズムを使用して各キーのスロットを決定します。
CRC16(key) mod 16384
16384 = 2の14乗なので、2の余りをn乗することは、2のn乗から1を引くことと同じです。したがって、最適化は次のとおりです。
CRC16(key) & 16383
キーにハッシュタグ(たとえばkey{sub}1
)が含まれている場合、スロットはサブタグ(つまり、sub)で指定された文字列で計算されるため、key{sub}1
とkey{sub}2
は同じスロットにあります。
クライアントは、任意のスロットを読み取るコマンドを任意のクラスターインスタンスに送信できます。スロットが要求されたインスタンスに属している場合は、それを処理します。それ以外の場合は、スロットの場所をクライアントに通知します。たとえば、次のコマンドがに送信された場合2番目のマスター:
GET key1
返回: MOVED slot ip:port(第一个Master的)
デフォルトでは、すべての読み取りおよび書き込みコマンドはマスターにのみ送信できます。スレーブハンドルを使用して読み取り要求を処理する必要がある場合、クライアントはreadonly
コマンドを実行する必要があります。
マスタースレーブ自動切り替え機構
マスターに障害が発生した場合、スレーブがある場合はマスターに切り替わります。
マスターが失敗したと判断する方法は?Redisクラスター構成には、cluster-node-timeout
クラスターハートビートタイムアウト期間という構成があります。クラスター内のノードが接続を確立すると、スケジュールされたタスクclusterCron関数(ソースコードを参照してください:https://github.com/redis/redis/blob/6.0/src/cluster.c)は、毎秒ハートビートを送信するノードをランダムに選択します。タイムアウト期間(cluster-node-timeout
)内にハートビート応答が受信されない場合、ノードはpfailとしてマークされます。
クラスター内のマスターの半分以上がノードのステータスをpfailとしてマークすると、このノードのステータスは失敗になります。
ノードに障害が発生すると、自動マスタースレーブ切り替えがトリガーされます。マスタースレーブ切り替えのプロセスにも、同様の選択が含まれます。
- マスターが失敗としてマークされている場合、対応するスレーブノードがスケジュールされたタスクclusterCron関数を実行すると、レプリケーションオフセットが選択されます。つまり、マスターとスレーブの同期の進行状況が最大のスレーブが選択され、最新のデータがマスターになろうとします。
- このスレーブは独自のcurrentEpoch + = 1を設定します(通常の状況では、クラスター内のすべてのcurrentEpochは同じであり、各選挙は1ずつ増加し、各currentEpochは1回しか投票できないため、複数のスレーブが同時に選挙を開始することはありません。ほとんどの票を獲得するのは難しい)、そしてすべてのマスターにフェイルオーバー要求を送信し、マスターの過半数が同意した場合、マスタースレーブスイッチが実行されます。
クラスターが利用できない
上記の説明によると、以下の利用できない状況を要約することができます
- マスターノードとスレーブノードの両方がダウンしているスロットにアクセスすると、スロットを取得できないことが報告されます。
- クラスター内のマスターノードの数が3未満の場合、またはクラスター内の使用可能なノードの数が偶数の場合、この失敗の選択メカニズムに基づく自動マスター/スレーブ切り替えプロセスが正しく機能しない可能性があります。障害をマークするプロセス、およびその他異常な可能性がある新しいマスターを選択するプロセスです。
参照
- 公式ドキュメント:https://redis.io/topics/cluster-spec
- ソースコード:[ https://github.com/redis/redis
毎日1回スワイプすると、スキルを簡単にアップグレードして、さまざまなオファーを得ることができます。