Redis の高可用性を実現する 2 つの実装ソリューションとは何ですか?

王林
リリース: 2023-05-27 19:42:12
転載
1018 人が閲覧しました

高可用性 (HA) を実現するために、Redis では次の 2 つの方法が使用されます:

  • マスター/スレーブ レプリケーション データ。

  • センチネルを使用してデータ ノードの動作を監視します。マスター ノードで問題が発生すると、サービスはスレーブ ノードの最上位で継続されます。

マスター/スレーブ レプリケーション

Redis では、マスター ノードとスレーブ ノード間のデータ レプリケーションは、完全レプリケーションと部分レプリケーションに分類できます。

旧バージョンのフルコピー機能の実装

フルコピーはsnycコマンドを使用して実装します。

From サーバーは同期コマンドをメイン サーバーに送信します。
  • sync コマンドを受信した後、マスター サーバーは bgsave コマンドを呼び出して ***rdb ファイルを生成し、このファイルをスレーブ サーバーと同期します。サーバーがrdbファイルをロードすると、メインサーバーがbgsaveコマンドを実行したときと同じ状態になります。
  • マスター サーバーはコマンド バッファに保存された書き込みコマンドをスレーブ サーバーに同期し、スレーブ サーバーはこれらのコマンドを実行することで、スレーブ サーバーのステータスが現在のステータスと一致するようにします。マスターサーバーのステータス。
  • 旧バージョンのフルコピー機能の最大の問題点は、スレーブサーバーを切断して再接続すると、スレーブサーバーにデータが存在していてもフルコピーが行われていないことです。これは効率が非常に低いため、Redis の新しいバージョンではこの部分が改善されています。

新バージョンでの完全コピー機能の実装

Redis の最新バージョンでは、sync コマンドの代わりに psync コマンドが使用されます。完全な同期だけでなく、部分的な同期も可能です。

コピー オフセット

レプリケーションを実行する両方の当事者 (マスター サーバーとスレーブ サーバー) は、それぞれレプリケーション オフセットを維持します:

マスター サーバーが N バイトのデータをスレーブ サーバーに同期するたびに、マスター サーバー自身のレプリケーション オフセット N が変更されます。
  • スレーブ サーバーがマスター サーバーから N バイトのデータを同期するたびに、スレーブ サーバーは自身のレプリケーション オフセット N を変更します。
  • バックログ バッファのコピー

メイン サーバーは、レプリケーション バックログ バッファとして固定長の先入れ先出しキューを内部的に維持します。デフォルトのサイズは 1MB です。

マスター サーバーがコマンドの伝達を実行すると、書き込みコマンドがスレーブ サーバーに同期されるだけでなく、書き込みコマンドがレプリケーション バックログ バッファーにも書き込まれます。

サーバー実行 ID

各 Redis サーバーには実行 ID があります。実行 ID はサーバーの起動時に自動的に生成されます。メイン サーバーは独自の実行 ID を送信します。 ID スレーブ サーバーに送信され、スレーブ サーバーはマスター サーバーの実行 ID を保存します。

スレーブ サーバー Redis が切断され、再接続された後に同期する場合、同期の進行状況は実行 ID に基づいて判断されます。

マスター サーバーの実行 ID が保存されている場合、同期の進行状況は実行 ID に基づいて判断されます。スレーブ サーバー 現在のメイン サーバーの実行 ID と一致する場合、今回切断されて再接続されたメイン サーバーは以前に複製されたメイン サーバーであるとみなされ、メイン サーバーは引き続き部分同期操作を試行できます。
  • それ以外の場合、ID を実行している 2 つのメイン サーバーが異なる場合、完全な同期プロセスは完了したとみなされます。
  • psync コマンド プロセス

これまでの準備ができたら、psync コマンド プロセスの分析を開始しましょう:

スレーブ サーバーが以前にマスター サーバーをレプリケートしたことがない場合、または、slaveof no one コマンドが以前に実行されたことがない場合、スレーブ サーバーは psync? -1 コマンドをマスター サーバーに送信して、マスター サーバーにデータを完全に同期するよう要求します。 。
  • それ以外の場合、スレーブ サーバーが以前に一部のデータを同期している場合、スレーブ サーバーは pync コマンドをマスター サーバーに送信します (runid が最後のマスター)。サーバーの実行 ID、オフセットはサーバーからの現在のレプリケーション オフセットです。
  • 最初の 2 つのケースでメイン サーバーが psync コマンドを受信した後、次の 3 つの可能性が発生します。

メイン サーバーは fullresync を返します。 応答は、マスターサーバーがスレーブサーバーとの完全なデータ同期を必要とすることを示します。メインサーバーの現在実行中の ID は runid で、レプリケーションのオフセットは offset です。
  • マスター サーバーが continue で応答した場合、マスター サーバーとスレーブ サーバーが部分的なデータ同期操作を実行中であり、スレーブ サーバーからの欠落したデータを同期できることを意味します。
  • メイン サーバーが -err で応答した場合、メイン サーバーのバージョンが 2.8 未満であり、psync コマンドを認識できないことを意味します。このとき、スレーブ サーバーは同期を送信します。コマンドをメインサーバーに送信し、全データを完全に実行します。
  • センチネル メカニズムの概要

Redis はセンチネル メカニズムを使用して高可用性 (HA) を実現します。その一般的な動作原理は次のとおりです:

Redis は、一連のセンチネル ノードを使用して、マスター/スレーブ Redis サービスの可用性を監視します。
  • Redis マスター ノードに障害が発生したことが判明すると、センチネル ノードがリーダーとして選出されます。
  • Sentinel*** は、外部関係者にサービスを提供する新しいプライマリ Redis ノードとして、残りのスレーブ Redis ノードから Redis ノードを選択します。
  • 上記では、Redis ノードを 2 つのカテゴリに分類しています:
    • Sentinel ノード (センチネル): ノードの動作の監視を担当します。

    • データ ノード: 通常はクライアントのリクエストを処理する Redis ノードで、マスターとスレーブに分かれています。

    上記は一般的なプロセスですが、このプロセスでは次の問題を解決する必要があります:

    • Redis データ ノードを監視するにはどうすればよいですか?

    • Redis データ ノードが無効かどうかを確認するにはどうすればよいですか?

    • センチネル *** ノードを選択するにはどうすればよいですか?

    • センチネル ノードが新しいプライマリ Redis ノードを選択する根拠は何ですか?

    これらの質問に 1 つずつ答えてみましょう。

    3 つの監視タスク

    センチネル ノードは、スケジュールされた 3 つの監視タスクを通じて Redis データ ノードのサービスの可用性を監視します。

    info コマンド

    10 秒ごとに、各センチネル ノードはマスターおよびスレーブ Redis データ ノードに info コマンドを送信して、新しいトポロジ情報を取得します。

    Redis トポロジ情報には次のものが含まれます:

    • このノードの役割: マスターまたはスレーブ。

    • マスター ノードとスレーブ ノードのアドレスとポート情報。

    このように、センチネルノードは info コマンドからスレーブノードの情報を自動的に取得できるため、明示的な設定を行わなくても、後から追加されたスレーブノードの情報を自動的に検知することができます。

    情報を __sentinel__:hello チャネルに同期する

    各センチネル ノードは 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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!