Redisの高可用性予備マスター/スレーブレプリケーションの原則

Redisの高可用性予備マスター/スレーブレプリケーションの原則

(1)マスタースレーブレプリケーションとは

マスター/スレーブレプリケーションとは、1つのRedisサーバーのデータを他のRedisサーバーにコピーすることです。前者はマスターと呼ばれ、後者はスレーブと呼ばれます。データ複製は一方向で、マスターノードからスレーブノードへのみです。マスターノードは書き込み操作を担当し、スレーブノードは読み取り操作を担当します。マスタースレーブレプリケーションは、データの複数のコピーを他のノードに展開することで、Redisの高可用性を実現し、データの冗長バックアップを実現し、データとサービスの高い信頼性を確保します。

ここに画像の説明を挿入

簡単に言うと、マスタースレーブレプリケーションの主な機能は、データの信頼性を確保することです。停電やハードディスクの損傷によるサーバーのダウンタイムの場合、マスタースレーブレプリケーションのマルチノードデータバックアップは、データリカバリに非常に便利で高速です。信頼性を確保することに加えて、マスター/スレーブレプリケーションには他の機能があります。

1.データの冗長性:マスタースレーブレプリケーションは、データのホットバックアップを実現します。これは、永続性に加えて、データの冗長性の方法です。
2.障害回復:マスターノードに問題がある場合、スレーブノードは迅速な障害回復を実現するサービスを提供できます。
3.負荷分散:マスターとスレーブのレプリケーションに基づいて、読み取りと書き込みを分離すると、マスターノードは書き込みサービスを提供でき、スレーブノードは読み取りサービスを提供して、特に書き込みが少なく読み取りが多いシナリオでサーバーの負荷を共有します。スレーブノードは読み取り負荷を共有するため、Redisサーバーの同時実行性が大幅に向上します。
4.高可用性の基礎:マスタースレーブレプリケーションはセンチネルとクラスターの実装の基礎となるため、マスタースレーブレプリケーションはRedisの高可用性の基礎です。

(2)マスター/スレーブレプリケーションの3つの段階

マスタースレーブレプリケーションの完全なワークフローは、次の3つの段階に分かれており、それぞれに独自の内部ワークフローがあります。次に、これらの3つのプロセスについて検討します。

  1. 接続を確立するプロセス:スレーブをマスターに接続するプロセス
  2. データ同期プロセス:マスターからスレーブにデータを同期するプロセス
  3. コマンド伝播プロセス:マスターは繰り返しデータをスレーブに同期します

ここに画像の説明を挿入

1.接続プロセスの確立

接続の確立は、マスタースレーブ複製の最初のステップです。接続確立フェーズのワークフローについて簡単に説明します。

  1. スレーブはマスターのアドレスとポートを設定し、マスターの情報を保存します
  2. ソケット接続を確立する
  3. pingコマンドを継続的に送信する
  4. 認証
  5. マスターにスレーブポート情報を送信する

明らかに、接続を確立するプロセスで、スレーブノードはマスターのアドレスとポートを保存し、マスターノードマスターはスレーブノードのポートを保存します。次にフローチャートを示します。

ここに画像の説明を挿入

2.データ同期プロセス

スレーブノードが初めてマスターノードに接続すると、最初にフルコピーが実行されます。フルコピーは非常に多くのリソースを消費しますが、このフルコピーは避けられません。フルコピーが実行された後、マスターノードはコピーバッファー内のデータをスレーブノードに送信し、スレーブノードはbgrewriteaofコマンドを実行してデータを復元します。これも部分的なコピーです。次にフローチャートを示します。

ここに画像の説明を挿入

3.コマンド伝搬フェーズ

マスターデータベースが変更され、マスターサーバーとスレーブサーバーのデータに不整合がある場合、マスターデータとスレーブデータは同期され、この時点で整合性が保たれます。このプロセスはコマンド伝播と呼ばれます。マスターは受信したデータ変更コマンドをスレーブに送信し、スレーブはコマンドを受信した後にコマンドを実行して、マスターとスレーブのデータを整合させます。

(3)完全コピーと部分コピー

以下で、完全コピーと部分コピーについて詳しく説明します。

ここに画像の説明を挿入

  1. スレーブノードはコマンドpsync?1 psync runid offsetを送信して、データを要求するために対応するrunidのノードを見つけますが、ここに問題があります。スレーブノードが初めて接続するとき、マスターノードのrunidとオフセットはまったくわかりません。したがって、最初に送信されるコマンドはpsyncですか?1.これは、マスターノードのすべてのデータを同期する必要があることを意味します。
  2. マスターノードはbgsaveの実行を開始してRDBファイルを生成し、現在のコピーオフセットオフセットを記録します。
  3. マスターノードは、+ FULLRESYNC runid offsetコマンドを使用してそのrunidとオフセットをスレーブノードに送信し、次にRDBファイルをソケットを介してスレーブノードに送信します。この段階で、マスターノードはクライアントからの指示を受け取る可能性があり、オフセットが変更されました。
  4. スレーブノードは、マスターノードのrunidとオフセットを受信して​​保存し、データベース内のすべての現在のデータをクリアし、ソケットを介してRDBファイルを受信し、RDBデータ(フルコピー)の復元を開始します。
  5. 完全な複製後、スレーブノードはマスターノードのrunidとオフセットを取得し、コマンドpsync runid offsetの送信を開始します。
  6. マスターノードはコマンドを受け取り、runidが一致するかどうかを判断し、オフセットがコピーバッファーにあるかどうかを判断します。
  7. マスターノードはrunidとオフセットを判断し、それが満たされない場合は、ステップ2に戻って完全なレプリケーションを続行します。ここでのrunidの不一致の原因は、スレーブノードの予期しない再起動である可能性があり、オフセット(オフセット)の不一致は、コピーバッファーのオーバーフローが原因です。runidまたはオフセットチェックに合格した場合、スレーブノードのオフセットがマスターノードのオフセットと同じであれば無視されます。スレーブノードのオフセットがマスターノードのオフセットと同じでない場合、マスターノードは+ CONTINUEオフセット(マスターノードのこのオフセット)を送信します)ノードオフセットからコピーバッファーのマスターノードオフセットにソケットを介して操作を送信するコマンド(実際には、スレーブノードはマスターノードよりも少ない操作を実行します)。
  8. スレーブノードは、マスターノードによって送信されたオフセットを受信し、ソケットを介して情報を受信した後、bgrewriteaofを実行してデータを復元します。

明らかに、部分コピーは完全コピーよりもはるかに複雑であることがわかったので、部分コピーの詳細をいくつか見てみましょう。

1. Runid

このrunidは上記で何度も言及されています。実際、runidは、開始時にredisが自動的に生成するランダムIDです(ここで、IDは開始するたびに異なることに注意してください)。これは40のランダムな16進数で構成されます。これは、redisノードを一意に識別するシステム文字列で構成されています。

マスター/スレーブレプリケーションが初めて開始されると、マスターはそのrunidをスレーブに送信し、スレーブはマスターのIDを保存します。スレーブが切断されて再接続されると、スレーブはこのIDをマスターに送信します。スレーブによって保存されたrunidがマスターの現在のrunidと同じである場合、マスターは部分レプリケーションを使用しようとします(前述のように、レプリケーションが成功するための他の要素はオフセットされます)。 。スレーブによって保存されたrunidがマスターの現在のrunidと異なる場合、フルコピーが直接実行されます。

2.バッファをコピーする

コピーバッファーは、マスターのコマンドレコードを格納してデータを収集するために使用される先入れ先出しのキューです。コピーバッファのデフォルトのストレージスペースは1Mです。構成ファイルのrepl-backlog-size 1mbを変更して、バッファーサイズを制御できます。

ここに画像の説明を挿入

実際、コピーバッファは保存されたAOF永続データであり(aof永続レコードはクライアントによって発行されたコマンドを記録します)、バイトで区切られ、各バイトには独自のオフセットがあります。このオフセット量は、前述のコピーオフセット(オフセット)です。

前述のように、コピーバッファスペースが不足していると、フルコピーになる可能性がありますが、その理由は何ですか。コマンド伝播フェーズでは、マスターノードは収集したコマンドをコピーバッファーに格納し、スレーブノードに送信します。ここで問題が発生します。マスターノードがクライアントから受信したコマンドの数が瞬時に非常に多く、コピーバッファーのメモリが超過すると、一部のデータが絞り出され、マスターノードとスレーブノードからのコマンドが発生します。一貫性がないため、完全なコピー。バッファサイズを不当に設定すると、無限ループが発生する可能性が高くなり、スレーブノードは常に完全にコピーし、データを空にして、完全にコピーします。

3.オフセットをコピーする

マスターノードのコピーオフセットは、レコードをスレーブノードに1回送信することであり、スレーブノードはレコードを1回受信します。情報を同期し、マスターノードとスレーブノードの違いを比較し、スレーブが切断されたときにデータ使用を復元するために使用されます。この値は、コピーバッファバックログ領域のオフセットからも得られます。

ここに画像の説明を挿入

(4)ハートビートのメカニズム

問題を考えることができます。マスター/スレーブレプリケーションのプロセスでは、マスターノードとスレーブノードがオンラインで正常に動作しているかどうかを知る必要があります。特定のノードの待ち時間が長いか応答がない場合は、次のような対応策を講じる必要があります。マスター/スレーブレプリケーションなどを停止してから、各ノードは他のノードがオンラインかどうかをどのようにして知るのでしょうか。

コマンド伝播フェーズでは、マスターノードとスレーブノードは常に情報を交換する必要があります。この情報交換では、メンテナンスにハートビートメカニズムを使用して、マスターノードとスレーブノード間の接続の相互認識を実現します。マスターノードのハートビートとスレーブノードのハートビートの役割を見てみましょう。

1.マスターハートビート

指示:pingは
デフォルトで10秒ごとに実行されます。これは、パラメーターrepl-ping-slave-periodによって決定されます。
主に、スレーブノードがオンラインかどうかを判断します。
情報レプリケーションを使用して、スレーブノードがリースされた後の接続時間の間隔を表示できます。ラグは0または1です。通常のステータス。

2.スレーブハートビート

指示:replconf ack {offset}
は1秒に1回実行されます。
主なことは、独自のレプリケーションオフセットをマスターノードに送信し、マスターノードから最新のデータ変更コマンドを取得し、マスターノードがオンラインかどうかを判断することです。

注:データの安定性を確保するために、ハングしているスレーブノードの数が設定値を超えた場合、または遅延が大きすぎる場合、マスターノードはすべての情報の同期を拒否します。構成および調整できるパラメーターは2つあります。

  • min-slaves-to-write 2
  • min-slaves-max-lag 8

これらの2つのパラメーターは、残りのスレーブノードが2つしかないこと、またはスレーブノードの遅延が8秒を超えると、マスターノードが強制的にマスト機能を閉じてデータ同期を停止することを示しています。では、マスターノードはスレーブノードの数と遅延時間をどのようにして知るのでしょうか。上記のように、ハートビートメカニズムでは、スレーブはperlconf ackコマンドを毎秒送信しますこのコマンドは、オフセット、スレーブノードの遅延時間、およびスレーブノードの数を伝達できます。

2020年9月15日

おすすめ

転載: blog.csdn.net/weixin_43907422/article/details/105835347