Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Redis Clusterはノード障害をどのように処理しますか


Redis Clusterはノード障害をどのように処理しますか


Redis Clusterは、障害検出、レプリカプロモーション、およびクラスター状態管理の組み合わせにより、ノードの障害を処理し、継続的な操作とデータの可用性を確保します。到達不能なマスターを自動的に促進して、到達不能なマスターを置き換え、データの損失のリスクを最小限に抑えながらキースペースの完全性を維持することにより、いくつかのノードの障害に耐えるように設計されています。

###クラスター通信と障害検出

Redisクラスターノードは、Redisクラスターバスと呼ばれる専用のTCPベースのバイナリプロトコルを介して通信します。各ノードは、このバスを使用してクラスター内の他のすべてのノードとの接続を維持し、継続的な健康チェックと状態伝播を可能にします。ノードは定期的にPingパケットを送信して、ピアの運用状況を確認し、クラスターの状態に関する情報を共有します。この通信は、ゴシッププロトコルを使用して、ノード障害の検出を支援するクラスター情報を効率的に広めます。

ノードは、アクティブなPingメカニズムを使用してピアを監視します。ノードが構成されたタイムアウト期間内(node_timeout)内にpingに応答しない場合、pfailステータスで故障する可能性があるとフラグが付けられます。これは暫定的な障害の兆候です。つまり、ノードは到達不可またはダウンがない可能性がありますが、まだ確認されていません。 PFAIL条件が持続し、マスターノードの大部分によって確認されている場合、ノードは故障としてマークされ、クラスターによって到達不可または減少と見なされていることを示します。このコンセンサスベースの障害検出メカニズムは、失敗したノードを識別する際の誤検知を防ぐのに役立ちます。

###マスターノードの障害を処理します

マスターノードが故障としてフラグが付けられると、Redisクラスターはフェールオーバープロセスを開始して、レプリカの1つを宣伝して新しいマスターになります。このプロセスは、管理上の介入なしにクラスターの障害検出器によって自動的にトリガーされます。昇格したレプリカは、以前に失敗したマスターによって管理されていたハッシュスロットを提供する責任を引き継ぎ、クラスターが手動再構成なしでリクエストを提供し続けることができるようにします。

フェールオーバーは、少なくとも1つのレプリカが利用可能で昇進しやすい場合にのみ発生します。適切なレプリカが存在しない場合、クラスターはエラー状態に入り、そこで一貫性のないデータの提供を防ぐためにクエリの受け入れを停止します。これは、高可用性を維持するために、各マスターにレプリカを構成することの重要性を強調しています。

###フェイルオーバーメカニックと安全

フェールオーバー中、レプリカは、置き換えているマスターと完全に同期するのを待ち、データの損失を回避するためにすべての保留中の更新を処理したことを確認します。これは、マスターの役割を引き受ける前に、複製オフセットをマスターとマスターと一致させることで達成します。

同期すると、レプリカはマスターの大多数から新しい構成エポックを要求します。エポックは、クラスターの構成の変更を追跡するために使用される論理的なタイムスタンプです。コンセンサスを取得した後、レプリカは更新された構成をすべてのノードにブロードキャストし、マスターへのプロモーションと古いマスターのレプリカまたは削除への降格を発表します。

古いマスターは、それが回復するとき、この構成の更新を受け取り、マスターとしてクエリの提供を停止します。クライアントのリクエストを新しいマスターにリダイレクトし、クライアントが手動介入なしにクラスターと透過的に対話し続けるようにします。

###ネットワークパーティションとスプリットブレインシナリオの処理

Redis Clusterは、過半数ベースのコンセンサスを使用して、ネットワークパーティション中の分割脳の問題を回避します。マスターは、クラスター内のマスターの半数以上が到達できない場合にのみ失敗します。多数派と通信できないマスターは、書き込みの受け入れを停止し、パーティション間の多様なデータ状態を妨げます。

ただし、少数派のパーティションに、フェールオーバー前にマスターに書き込みを続けるクライアントが含まれている場合、書き込み損失の可能性があります。 Redisは、タイムアウト後の少数派側と、到達不可能なマスターを迅速に失敗することでマジョリティ側と多数派の執筆を拒否することにより、このリスクを軽減します。

これらの予防策にもかかわらず、Redisはマスターとレプリカの間で非同期レプリケーションを使用するため、フェールオーバーウィンドウ中に執筆が失われる可能性があります。コマンドとレプリケーションの更新を書くための返信はほぼ同時に送信されるため、紛失した書き込みのウィンドウは非常に狭いですが、不可能ではありません。

###故障処理に影響する構成オプション

Redisクラスターには、ノード障害中の可用性と動作に影響を与える構成オプションが含まれています。

- `Cluster-Require-full-coverage`(デフォルトはyes):クラスターは、ノードの障害のためにキースペースの一部が発見された場合に書き込みを受け入れ、データの一貫性が強いことを保証します。
- `Cluster-allow-reads-when-down`(デフォルト番号):クラスターが故障状態にあるときに読み取りが許可されるかどうかを制御します。これを有効にすると、部分的な障害中でもノードから読み取りが可能になりますが、古いデータが提供されるリスクがあります。

これらの設定により、管理者はアプリケーション要件に基づいて可用性と一貫性のバランスをとることができます。

###マニュアルフェールオーバーサポート

自動フェールオーバーに加えて、Redis Clusterは、レプリカノードで発行できる手動フェールオーバーコマンドを提供します。これは、実際の失敗イベントを待たずに管理者がマスターの役割を交換したいと考えているシナリオのメンテナンスやテストに役立ちます。

手動フェールオーバーは、現在のマスターでクライアントをブロックし、レプリカが完全に追いつくのを待ってから、スムーズな原子遷移でレプリカを宣伝することで機能します。これにより、役割の変更中にデータの損失がなくなり、クライアントへの最小限の混乱が保証されます。

### まとめ

Redisクラスターは、R​​edisクラスターバスとゴシッププロトコルを介した継続的なモニタリングに基づいた障害検出およびフェールオーバーシステムを介して主にノード障害を処理します。ノードは、到達不可能なマスターを検出し、コンセンサスプロセスの後にレプリカを自動的に宣伝します。フェイルオーバーは、プロモーション前にレプリカが完全に同期されるようにすることにより、データの損失を最小限に抑えるように設計されています。ネットワークパーティションは、分割脳の状態を防ぐために多数派ベースの決定を介して管理されますが、非同期の複製により書き込み損失の狭いウィンドウが発生する場合があります。構成オプションにより、故障中の一貫性の調整を可能にし、手動フェールオーバーコマンドにより、オペレーターがメンテナンスのために制御できます。

このアーキテクチャにより、Redisクラスターは、マスターノード障害からの自動回復により、高可用性とパーティション許容度を提供し、障害シナリオの下でクラスターが動作し、一貫性を保つことができます。