Redis クラスターがノード障害を処理する方法を次に示します。
自動フェイルオーバー
Redis クラスターのマスター ノードに障害が発生すると、クラスターはそのマスターのレプリカ ノードの 1 つを新しいマスターに自動的に昇格させます。このフェイルオーバー プロセスは、手動介入なしで自動的に行われます。
フェイルオーバー プロセスの主な手順は次のとおりです。
1. クラスター内の他のノードは、クラスター ゴシップ プロトコルを通じて、またはノードへの接続を試みることにより、マスター ノードに障害が発生したことを検出します。
2. 次に、クラスターはそのマスターのレプリカ ノード間で選択を行います。最新のデータを持つレプリカが新しいマスターとして選択されます。
3. 選択されたレプリカ ノードが新しいマスターに昇格します。その後、他のレプリカは新しいマスターから複製するように再構成されます。
4. クライアントは、新しいスロットからノードへのマッピングを含む「MOVED」エラー応答を使用して、新しいマスター ノードにリダイレクトされます。
スロット カバレッジ
ノード障害時に可用性を維持するには、Redis Cluster では大部分のマスター ノードが利用可能であり、通信できる必要があります。これは、「スロット カバレッジ」の維持と呼ばれます。
クラスター内の各マスター ノードは、16,384 のハッシュ スロットのサブセットを担当します。大部分のマスターが利用可能であり、割り当てられたスロットにサービスを提供できる限り、クラスターは動作を継続できます。
障害が発生したマスター ノードが多すぎて、残りのマスターがハッシュ スロット範囲全体をカバーできない場合、障害が発生したノードが回復するか交換されるまで、クラスターは使用できなくなります。
レプリカのプロモーション
Redis クラスターはレプリカ ノードに依存して高可用性を提供します。マスターに障害が発生すると、そのレプリカ ノードの 1 つが自動的に新しいマスターに昇格します。
最新のデータを持つレプリカが新しいマスターとして選択されます。これにより、フェイルオーバー プロセス中にデータの一貫性が確実に維持されます。
スプリットブレインの処理
Redis Cluster は、クォーラムベースのアプローチを使用してネットワーク分割を処理し、クラスターが複数の独立したクラスターに分割される「スプリット ブレイン」シナリオを回避します。
大部分のマスターが使用できなくなった場合、残りのノードはパーティションが解決されるまでクライアントの要求を拒否します。これにより、データの一貫性が確保されます。
これらの自動フェイルオーバーとクォーラムベースのメカニズムを活用することで、Redis Cluster はノード障害やネットワーク分断に直面した場合でも高可用性と復元力を提供できます。
引用:[1] https://yifan-online.com/en/km/article/detail/16750
[2] https://stackoverflow.com/questions/63878562/two-failure-support-in-3-node-redis-cluster
[3] https://redis.io/docs/latest/operate/oss_and_stack/management/scaling/
[4] https://redis.io/docs/latest/commands/cluster-nodes/
[5] https://github.com/lettuce-io/lettuce-core/issues/2318