Redisマスタースレーブレプリケーションの原理の詳細な説明

1.コピープロセス

コピーの処理手順は次のとおりです。

1.スレーブノードはslaveofコマンドを実行します;

2。スレーブノードはslaveofコマンドにマスターノードの情報を保存するだけで、すぐにはレプリケーションを開始しません;

3。スレーブノード内のタイミングタスクは次の情報があることを検出しますマスターノード、およびマスターノードへの接続にソケットの使用を開始します;

4、接続が確立された後、pongコマンドの応答を取得することを期待して、pingコマンドを送信します。それ以外の場合は再接続されます;

5、マスターの場合ノードセットのアクセス許可、次に権限検証の必要性、検証が失敗した場合、レプリケーションの終了、

6、特権検証に合格した後、データ同期が実行されます。これは最も時間のかかる操作です。マスターノードはすべてのデータをに送信します。スレーブノード;

7。マスターノードが現在のデータをスレーブノードに同期した後、レプリケーションの確立が完了します。次に、マスターノードは引き続き書き込みコマンドをスレーブノードに送信して、マスタースレーブデータの整合性を確保します。

ここに画像の説明を挿入

2.データ間の同期

上記のレプリケーションプロセスでは、ステップの1つは「データセットの同期」です。これは、現在話題になっている「データ間の同期」です。

redis同期には2つのコマンドがあります。

syncpsync。前者はredis2.8より前の同期コマンドであり、後者は同期を最適化するためにredis2.8によって設計された新しいコマンドです。2.8psyncコマンドに焦点を当てます。

psyncコマンドには、次の3つのコンポーネントのサポートが必要です。

1.マスターノードとスレーブノードはそれぞれのオフセットを複製します

。2。マスターノードはバックログバッファーを複製します。3。マスターノード

の操作ID。

マスターノードとスレーブノードのそれぞれのレプリケーションオフセット:

1.レプリケーションに参加しているマスターノードとスレーブノードは、独自のレプリケーションオフセットを維持します。

2.マスターノードが書き込みコマンドを処理した後、コマンドのバイト長を累積します。統計情報は、情報レプリケーションのmasterreploffsetインジケーターにあります。

3.スレーブノードはそのレプリケーションオフセットを毎秒マスターノードに報告するため、マスターノードはスレーブノードのレプリケーションオフセットも保存します。

4.スレーブノードは、マスターノードから送信されたコマンドを受信すると、それ自体のオフセットも累積し、統計情報は情報の複製に含まれます。

5.マスターノードとスレーブノードのレプリケーションオフセットを比較することにより、マスターノードとスレーブノードのデータに一貫性があるかどうかを判断できます。

マスターノードレプリケーションバックログバッファー:

1.レプリケーションバックログバッファは、マスターノードに格納されている固定長の先入れ先出しキューです。デフォルトのサイズは1MBです。

2.このキューは、スレーブが接続したときに作成されます。このとき、マスターノードが書き込みコマンドに応答すると、スレーブノードにコマンドを送信するだけでなく、コピーバッファにも書き込みます。

3.彼の役割は、部分的なコピーおよびコピーコマンドの損失を修正することです。情報の複製を通じて関連情報を見ることができます。

マスターノードの実行ID:

1.各redisが開始されると、40ビットの実行IDが生成されます。

2.実行中のIDの主な機能は、Redisノードを識別することです。ip + portメソッドが使用されている場合、マスターノードが再起動してRDB / AOFデータを変更すると、オフセットに基づいてスレーブノードが複製することは安全ではありません。したがって、実行中のIDが変更されると、スレーブノードは完全なレプリケーションを実行します。つまり、redisの再起動後、スレーブノードはデフォルトで完全なレプリケーションを実行します。

再起動中に実行中のIDが変更されない場合はどうなりますか?

1. debug reloadコマンドを使用してRDBをリロードし、実行IDを変更しないでおくことができます。不必要なフルコピーを効果的に回避するため。

2.彼の欠点は次のとおりです。debugreloadコマンドは現在のRedisノードのメインスレッドをブロックするため、大量のデータを含むメインノードまたはブロックを許容できないノードには注意して使用する必要があります。この問題は通常、フェイルオーバーメカニズムによって解決できます。

psyncコマンドの使用方法:

命令格式为:   psync{
    
    runId}{
    
    offset}

runId:スレーブノードからコピーされたマスターノードの実行ID
オフセット:スレーブノードからコピーされた現在のデータのオフセット

psync実行プロセス:
ここに画像の説明を挿入
プロセスの説明:スレーブノードはpsyncコマンドをマスターノードに送信します。runIdはターゲットマスターノードのIDです。デフォルトが-1でない場合、offsetはスレーブノードによって保存されたコピーオフセットです。これは最初のコピーであり、-1です。

マスターノードは、runidとoffsetに従って結果を返すことを決定します。

1. + FULLRESYNC {runId} {offset}と応答すると、スレーブノードがフルコピープロセスをトリガーします。

2. + CONTINUEと応答すると、スレーブノードは部分レプリケーションをトリガーします。

3. + ERRと応答すると、マスターノードが2.8のpsyncコマンドをサポートせず、同期を使用して完全な複製を実行することを意味します。

この時点まで、データ間の同期はほぼ同じであり、長さは比較的長いです。主にpsyncコマンド間の導入用です。

3.完全なコピー

完全レプリケーションは、Redisでサポートされている最も初期のレプリケーション方法であり、マスターとスレーブが最初にレプリケーションを確立するときに実行する必要がある段階でもあります。完全レプリケーションをトリガーするコマンドは、syncとpsyncです。前に述べたように、これら2つのコマンドの分水界バージョンは2.8です。redis2.8より前では、syncは完全な違いしか実行できません。2.8以降は、完全同期と部分同期の両方をサポートします。

プロセスは次のとおりです。
ここに画像の説明を挿入

上の図の手順を紹介します。
次の太字の部分は、完全同期全体の中で時間のかかる部分です。

1. psyncコマンド(spync?-1)を送信し
ます。2。マスターノードはコマンドに従ってFULLRESYNCを返します。3。
スレーブノードはマスターノードIDとオフセットを記録します。4
マスターノードはbgsaveし、RDBをローカル
5に保存しますマスターノードはRBDファイルをスレーブノードに送信します
6。、スレーブノードはRDBファイルを受信して​​メモリにロードします
。7。マスターノードは、次の期間中に新しいデータを「コピークライアントバッファ」に保存しますスレーブノードはデータを受信します。スレーブノードがRDBファイルのロードを完了すると、データが送信されます。(スレーブノードに時間がかかりすぎると、バッファオーバーフローが発生し、最終的に完全同期が失敗します)
8 。ノードからデータをクリアした後にRDBファイルをロードします。RDBファイルが大きい場合、この手順はまだ時間です。 -consuming。クライアントがアクセスした場合、それは、データの矛盾が発生します、あなたはそれを閉じるために、構成スレーブサーバ古くなったデータを使用することができます。
9. AOFがオンになっている場合RBDが正常意志bgrewriteaof、ノードからロードされた後すぐに実行されます。

注意:

1. RDBファイルが6GBより大きく、ギガビットネットワークカードの場合、Redisのデフォルトのタイムアウトメカニズム(60秒)により、フルコピーが失敗します。この問題は、repl-timeoutパラメーターを増やすことで解決できます。

2. Redisはディスクレスレプリケーションをサポートしています。つまり、ネットワークを介してスレーブノードに直接送信されますが、機能は完全ではないため、実稼働環境では注意して使用してください。

4.部分的なコピー

スレーブノードがマスターノードを複製しているときに、ネットワークの中断やその他の異常が発生した場合、スレーブノードはマスターノードに不足しているコマンドデータを再発行させます。マスターノードは、複製バッファー内のデータをスレーブに送信するだけで済みます。データを確保するためのノード。一貫性は、フルコピーと比較して、コストがはるかに低くなります。

次のように実行します。
ここに画像の説明を挿入

1.スレーブノードでネットワークが中断され、repl-timeout時間が経過すると、マスターノードはレプリケーション接続を中断します。

2.マスターノードは、要求されたデータを「レプリケーションバックログバッファ」(デフォルトでは1MB)に書き込みます。

3.スレーブノードが回復してマスターノードに再接続すると、スレーブノードはオフセットとマスターノードIDをマスターノードに送信します

。4 マスターノードがチェックした後、オフセット後のデータがバッファーにあるかどうかを確認し、送信します。応答を継続します-部分レプリケーションが可能であることを示します

。5。マスターノードは、バッファ内のデータをスレーブノードに送信して、マスタースレーブレプリケーションの通常の状態を確認します。

5.ハートビート

マスターノードとスレーブノードはレプリケーションを確立した後、長い接続を維持し、ハートビートコマンドを相互に送信します。

ハートビートの主なメカニズムは次のとおりです。

1.ミドルとスレーブの両方にハートビート検出メカニズムがあり、それぞれが通信する相手側のクライアントとしてシミュレートし、clientlistコマンドを使用してレプリケーション関連のクライアント情報を表示します。マスターノードの接続ステータスはflags =です。 Mであり、スレーブノードの接続ステータスはflags = Sです。

2.デフォルトでは、マスターノードは10秒ごとにスレーブノードにpingコマンドを送信し、repl-ping-slave-periodを変更して送信頻度を制御できます。

3.スレーブノードは、メインスレッドでreplconf ack {offset}コマンドを毎秒送信して、現在のレプリケーションオフセットをマスターノードに報告します。

4. replconf情報を受信した後、マスターノードはスレーブノードのタイムアウト時間を判断します。repl-timeoutが60秒を超えると、ノードがオフラインであると判断します。

ここに画像の説明を挿入
注:マスタースレーブの遅延を減らすために、redisマスタースレーブノードは通常、同じコンピュータールーム/同じ都市のコンピュータールームに配置され、ネットワーク遅延によって引き起こされるネットワークパーティションによって引き起こされるハートビートの中断を回避します。

6.非同期レプリケーション

マスターノードは、データの読み取りと書き込みだけでなく、書き込みコマンドをスレーブノードに同期する役割も果たします。書き込みコマンドの送信プロセスは非同期で完了します。つまり、マスターノードは書き込みを処理した直後にクライアントに戻ります。コマンドを実行し、スレーブノードのレプリケーションが完了するのを待ちません。

非同期レプリケーションの手順は、次のように非常に簡単です。

1.マスターノードは処理コマンドを受け入れます

。2。マスターノードは処理後に応答結果を返します。3。

変更コマンドの場合、マスターノードは非同期でスレーブノードに送信され、スレーブノードはコピーされたコマンドをメインスレッドで実行します。 。

ここに画像の説明を挿入

総括する

この記事では主に、レプリケーションプロセス、データ間の同期、完全レプリケーションプロセス、部分レプリケーションプロセス、ハートビートデザイン、非同期レプリケーションプロセスなど、Redisのレプリケーション原理を分析します。

その中でも、RDBデータ間の同期には非常に時間がかかることがわかります。したがって、Redisはバージョン2.8のインクリメンタルレプリケーションと同様にpsyncコマンドを終了しました。Redisマスタースレーブがネットワークの中断に直接遭遇した場合、完全なレプリケーションは実行されませんが、データはバッファー(デフォルトは1MB)に配置されます。バッファ内のデータがオーバーフローするかどうかを判断するためのコピーオフセット。オーバーフローがない場合は、バッファデータのみを送信する必要があり、コストは低くなります。それ以外の場合は、フルコピーが必要です。したがって、を制御することが非常に重要です。バッファサイズ。

おすすめ

転載: blog.csdn.net/QiuHaoqian/article/details/110938329
おすすめ