高可用性 (HA) を実現するために、Redis では次の 2 つの方法が使用されます:
マスター/スレーブ レプリケーション データ。
センチネルを使用してデータ ノードの動作を監視します。マスター ノードで問題が発生すると、サービスはスレーブ ノードの最上位で継続されます。
Redis では、マスター ノードとスレーブ ノード間のデータ レプリケーションは、完全レプリケーションと部分レプリケーションに分類できます。
フルコピーはsnycコマンドを使用して実装します。
From サーバーは同期コマンドをメイン サーバーに送信します。新バージョンでの完全コピー機能の実装
コピー オフセット
サーバー実行 ID
スレーブ サーバーが以前にマスター サーバーをレプリケートしたことがない場合、または、slaveof no one コマンドが以前に実行されたことがない場合、スレーブ サーバーは psync? -1 コマンドをマスター サーバーに送信して、マスター サーバーにデータを完全に同期するよう要求します。 。
Sentinel ノード (センチネル): ノードの動作の監視を担当します。
データ ノード: 通常はクライアントのリクエストを処理する Redis ノードで、マスターとスレーブに分かれています。
上記は一般的なプロセスですが、このプロセスでは次の問題を解決する必要があります:
Redis データ ノードを監視するにはどうすればよいですか?
Redis データ ノードが無効かどうかを確認するにはどうすればよいですか?
センチネル *** ノードを選択するにはどうすればよいですか?
センチネル ノードが新しいプライマリ Redis ノードを選択する根拠は何ですか?
これらの質問に 1 つずつ答えてみましょう。
センチネル ノードは、スケジュールされた 3 つの監視タスクを通じて Redis データ ノードのサービスの可用性を監視します。
10 秒ごとに、各センチネル ノードはマスターおよびスレーブ Redis データ ノードに info コマンドを送信して、新しいトポロジ情報を取得します。
Redis トポロジ情報には次のものが含まれます:
このノードの役割: マスターまたはスレーブ。
マスター ノードとスレーブ ノードのアドレスとポート情報。
このように、センチネルノードは info コマンドからスレーブノードの情報を自動的に取得できるため、明示的な設定を行わなくても、後から追加されたスレーブノードの情報を自動的に検知することができます。
各センチネル ノードは 2 秒ごとに、マスターを取得するために Redis データ ノードの __sentinel__:hello チャネルに同期します。他のセンチネル ノードもこのチャネルに加入しているため、この操作によりマスター ノードとセンチネル ノードに関する情報をセンチネル ノード間で実際に交換できます。
この操作では実際に 2 つのことを実行します。 * 新しいセンチネル ノードの検出: 新しいセンチネル ノードが参加すると、この時点で新しいセンチネル ノードの情報が保存され、その後センチネル ノードとの接続が確立されます。 . .次のように書き換えます。 * 後でマスターノードがオフラインであるかどうかを客観的に判断できるように、マスターノードのステータス情報を交換します。
各センチネル ノードは 1 秒ごとに、ハートビート検出のためにマスター データ ノードとスレーブ データ ノードおよび他のセンチネル ノードに ping コマンドを送信します。このハートビートの検出は、データ ノードがオフラインであるというその後の主観的な判断の基礎となります。
上記 3 つの監視タスクの 3 番目 ハートビート タスクの検出 (次の場合)設定されたミリ秒後のダウン後に有効な応答が受信されない場合、データ ノードは「主観的にオフライン (sdown)」とみなされます。
なぜ「主観オフライン」と呼ばれるのでしょうか?分散システムでは複数のマシンが連携して動作するため、ネットワーク内でさまざまな状況が発生する可能性があります。データノードがオフラインであるとみなすには、1 つのノードだけの判断だけでは十分ではありません。これには、その後の「客観的なオフライン」プロセスが必要です。 。
センチネル ノードがマスター ノードが主観的にオフラインであると考える場合、センチネル ノードは「sentinel is-master-down-by addr」を渡す必要があります。 " コマンド 他のセンチネル ノードにマスター ノードがオフラインかどうかを尋ねます。半数以上のセンチネル ノードがオフラインであると回答した場合、マスター ノードは「客観的にオフライン」であるとみなされます。
マスター ノードが客観的にオフラインになった場合、その後の選挙を完了するにはセンチネル ノードをセンチネルとして選出する必要があります***新しいもの マスターノードの仕事。
この選挙の一般的な考え方は次のとおりです:
各センチネル ノードは、「sentinel is-master-down-by addr」を送信することでセンチネル ノードになることを申請します。 " コマンドを他のセンチネル ノードに送信します。sentinel***。
各センチネル ノードが「sentinel is-master-down-by addr」コマンドを受信すると、*** ノードにのみ投票できます。他のノードのこのコマンドは、拒否される。
センチネル ノードが承認投票の過半数を獲得した場合、そのノードはセンチネル***になります。
最初の 3 つのステップで一定期間内にセンチネル*** が選択されなかった場合、次の選挙が再び開始されます。
ご覧のとおり、*** を選出するプロセスは、raft のリーダーを選出するプロセスと非常によく似ています。
残りの Redis スレーブ ノードの中から、次の順序で新しいマスター ノードを選択します。
「異常な」データ ノードをフィルタリングして除外します。たとえば、主観的にオフラインまたは切断されているスレーブ ノード、センチネル ノードの ping コマンドに 5 秒以内に応答しなかったノード、マスター ノードとの接続が失われたスレーブ ノードなどです。
スレーブ優先度***のスレーブノードが存在する場合はそのノードを返却し、存在しない場合は以降の処理を継続します。
コピー オフセット *** を持つスレーブ ノードを選択します。これは、このスレーブ ノード上のデータが最も完全であることを意味します。存在する場合は、存在しない場合は戻ります。後続のプロセスを続行します。
この時点では、残りのすべてのスレーブ ノードのステータスは同じなので、最小の runid を持つスレーブ ノードを選択します。
新しいマスター ノードを選択した後、ノードを新しいノードにするための *** プロセスが必要ですマスターノード:
Sentinel***前の手順で選択したスレーブ ノードに「slaveof no one」コマンドを発行して、このノードをマスター ノードにします。
Sentinel*** は残りのスレーブ ノードにコマンドを送信して、それらを新しいマスター ノードのスレーブ ノードにします。
センチネル ノード セットは、元のマスター ノードをスレーブ ノードに更新し、回復すると、新しいマスター ノードのデータをコピーするように命令されます。
以上がRedis の高可用性を実現する 2 つの実装ソリューションとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。