Aは、マスター・スレーブレプリケーションの原理をRedisの
マスタ-スレーブ同期戦略をRedisの:スレーブだけクラスタがトリガする接合同期の全額(フルボリュームコピー)。同期の全額た後、増分コピー。スレーブ優先順位は、増分同期は全額がマスターノードから複製しようとした場合、増分同期に失敗しました。
全額をコピーします。スレーブの初期化フェーズ
図のように。
- スレーブ・サーバに接続された第一のマスターノードは、SYNCコマンドを送信します。
- マスターノードは、書き込み要求がマスターのキャッシュされている間、SYNCコマンド開始コマンドBGSAVE(遅延書き込み、読み込み、正常)コマンドはRDB(スナップショット)ファイルを生成し、受信します。
- RDBは、マスターRDBは、全てのスレーブに送信され、生成されました。
- スレーブは、古いデータファイルがRDBの前に放棄されて受信し、新しいRDBをロードします。
- マスターセンドは完全なRDB、書き込みコマンドは、ブロッキングの前に実行され、これらのコマンドは、スレーブノードに同期。(インクリメンタルコピー)
- 上記の手順は、適切に動作するマスタとスレーブを完了した後。
これは、マスター・スレーブレプリケーションの全額が、ノンブロッキング、非同期レプリケーションされていることは注目に値します。
インクリメンタルコピー:マスター各書き込みコマンドはスレーブに同期されます、スレーブが対応するコマンドを実行するためのコマンドを受信します。
HTTP:ネットワーク障害におけるスレーブへステップ3ステップのプロセスにおいてファイル、マスター送信は、再接続後に、(オフセットで記録)のみマスタースレーブ欠落部分にコピーされます。
マスターノードはバックログ、マスターとスレーブがオフセット、オフセットレプリカマスター実行IDを保持するメモリで維持のバックログに格納されます。マスターとスレーブのネットワーク接続が切断した場合、スレーブ・マスターは、最後のオフセットレプリカからコピーを開始していきます対応するオフセットが見つからない場合、それは再同期を実行します。
メモリのうちマスタースレーブのレプリケーション戦略:スレーブが期限切れのキーを排除するためのイニシアチブを取ることはありません、マスターが期限切れのキーを処分、デルは、同期データのうち、スレーブにコマンドを送信します。
ハートビートデータ:マスターは、デフォルトのハートビート、スレーブノードごとに1秒で10秒ごとに一度送られたが、ハートビートを送信します。
マスタスレーブアーキテクチャならば、それは永続のマスターノードを回しすることを推奨しますが、永続化マスターをオフにした場合、その場合には、マスターがダウンしている可能性があるため、マスターノードのホットバックアップデータとしてスレーブノードを使用することはお勧めできませんのでご注意コピーを経ることがあり、データが空の場合、再起動、および、スレーブノードのデータも失われます。
また、さまざまなバックアップソリューションのマスターは、彼らが行う必要があります。あなたが不足しているすべてのローカルファイル、およびバックアップから復元するマスターRDBの選択の場合には、スタートアップを保証するように、データも高可用性メカニズムと、そこにある、スレーブノードが自動的にマスターノードを引き継ぐが、またしてもよいことができます検出されないマスター障害、マスタノード自動的に再起動、またはデータがクリアされ、上記スレーブノードの全てをもたらすことができるがセンチネル。
第二に、メカニズムセンチネル
アーキテクチャからの主な見張りを手動で独自のマスターまたはスレーブノードを構成するために、それぞれの設定ファイルに要求される前。(構成がバックプロパゲーションの理解促進)
マスターノードがダウンしたときのRedisのメインプログラムの使用は、その後、スタンバイ切替処理が手動操作や保守要員を必要とする場合が完了すると、人工的なフェイルオーバーは非常に時間がかかり、オペアンプであります非常に高い保守要員が必要です。
だから、高可用性アーキテクチャのためのRedisのセンチネル(センチネル)メカニズムに基づいてそこに構築されます。
1、センチネル
中国の歩哨。Sentinelは、主に以下の機能では、Redisのクラスタ構成で非常に重要な機関です。
- 監視クラスター:マスタとスレーブが正常に動作しているプロセスを監視する責任があるのRedis。
- メッセージ通知:Redisのインスタンスが失敗した場合は、管理者にアラーム通知としてメッセージを送信するための責任を見張り。
- フェイルオーバー:マスターノードハングした場合、自動的にスレーブノードに転送されます。
- コンフィギュレーション・センター:フェールオーバーが発生した場合、クライアントに新しいマスタアドレスをクライアントに通知します。
お互いが一緒に動作するようにとのRedisが配布され、それ自体をクラスタ化するための高可用性を実現SENTINEL、歩哨は、クラスタとして動作します。
- フェイルオーバー、マスターノードがダウンしたかどうかを判断するが、警備員のほとんどはそれに同意を必要としている、それが分散選挙の問題になります。
- 高可用性メカニズム自体の重要な一環として、フェールオーバーシステムは、単一のポイントがある場合ので、いくつかのセンチネルリンパ節ハング、センチネルクラスタがまだ、正常に動作することができたとしても、それは非常にピットの父になります。
2、コア知識
- Sentinelはその堅牢性を確保するために、少なくとも3つのインスタンスが必要です。
- センチネル+は、展開アーキテクチャマスター・スレーブが保証データ損失ゼロではありませんRedisの唯一の高可用性のRedisクラスターを確保することができます。
- この複雑なデプロイメントのセンチネル+ Redisのマスター・スレーブ・アーキテクチャの場合、可能な限り、テスト環境と本番環境のように、我々は十分なテストや訓練を行いました。
3、フェイルオーバー
- SDOWNのダウンタイムは、彼らはマスターがダウンしていると感じた場合、それはセンチネルで、主観的なものであるので、主観的なダウンタイムがあります
- センチネルの定足数の数はマスターがダウンしていると感じた場合odown目的は、ダウンしているので、ダウンタイムの目的は、
条件は達成するためにSDOWNセンチネルピングマスター、ミリ秒数以上であるマスター・ダウンミリ秒後に、主観視点マスターに指定された後にダウンしている場合、非常に簡単です。センチネル指定された時間内に、定足数を受けた場合他の警備員の数もマスターがSDOWNされていることを信じて、odownであると考えられています。
三、slave->マスター選択アルゴリズム
マスターは、それodownとみなされ、センチネルの数の過半数が切り替えを可能にする、それはスレーブを選出するためにまずこの時点で、歩哨スタンバイスイッチング動作を実行する場合、情報のいくつかのスレーブが考慮されます。
- 長いのマスターとの接続を切断するとき
- スレーブ優先
- オフセットコピー
- 実行ID
スレーブマスターディスコネクトで接続時間が10倍以上後のミリ秒ダウン、プラスマスターの長さがダウンした場合、スレーブはマスタに選挙のために適切であると考えられていませんでした。
(ダウン後のミリ秒* 10 )+ milliseconds_since_master_is_in_SDOWN_state
次は、ソートされた奴隷になります。
- スレーブは、優先度が高い、スレーブの優先度より低い優先度でソート。
- スレーブ優先度が同じであれば、見た目のレプリカより、高い優先度で相殺した後、複数のスレーブのコピーデータにある、オフセット。
- 上記2つの条件が同一である場合には、実行ID比較的小さいものスレーブを選択します。
定足数と過半数:
スイッチオーバーを行うには歩哨、センチネルの最初のクォーラムに必要な数がodown考えるたびに、その後、センチネルを行うには、スイッチに選出され、センチネル歩哨の大半も、正式なハンドオーバーを実行するために許可する必要があります。
定足数<大部分、例えば5つのセンチネル、大部分が3である場合、定足数は、次の3つのセンチネルがハンドオーバ承認を行うことができ、2に設定されています。
しかし、定足数> =大多数の場合は、例えば5センチネルなど歩哨の承認定足数の数は、定足数は5である、あなたはスイッチングを実行するために5人の警備員を承認することに合意している必要がありますしている必要があります。
データ損失によるスタンバイスイッチング
データ損失の2例:
- によるデータ損失の非同期レプリケーション
マスター - >スレーブレプリケーションは非同期であるため、ので、いくつかのデータをスレーブにコピーされていないがあるかもしれない、それがダウンしたマスターは、その後、このデータの一部は失われます。
- 脳の分割によるデータ損失
言うことであるスプリットブレイン、突然、通常のネットワークの外に、マシンが他のスレーブに接続することはできませんが、実際にはマスターにも実行されているマスターマシン。このとき、センチネルは、マスターがダウンしていると思いますし、その後の選挙を回すかもしれない、他のスレーブスイッチがマスターになりました。今回は、クラスタは2つのマスター、いわゆるスプリットブレインを持つことになります。
このとき、スレーブは切り替えているが、マスターになりましたが、クライアントは新しいマスターへの切り替えに時間を過ごしましたが、また、古いマスターへの書き込みデータを継続していないことがあります。古いマスターが再び回復したときにそう、それは新しいマスターをハングアップするために奴隷のようになります、あなたのデータは、新しいマスタからのデータを再コピーし、クリアされます。このデータの一部が失われますので、新しいマスタデータ以降のクライアントは、書いていません。
ソリューション:
次のとおりです。
1分-スレーブ・ツー・ライト1 2分-スレーブ-MAX-ラグ10
彼は、表し、少なくともスレーブ、データレプリケーションと同期遅延が10秒を超えてはならない必要です。
すべてのスレーブ、データレプリケーションと同期の遅延10秒以上のため、この時点一度場合、マスターはすべての要求を受信しません。
- データの非同期レプリケーションの損失を低減
この構成を最小奴隷-MAXは遅れを使用すると、データとACK遅延をコピーするスレーブが長すぎると、彼らはあまりにも多くのデータをすることができますので、書き込み要求を拒否し、その後、ダウンタイムの損失を習得できると思いますことを確認することができますデータの一部は、制御可能範囲マスタダウンの減少に起因する失われたスレーブデータに同期されないように。
- データの損失を低減するためのスプリットブレイン
他のスレーブ失われた接続で、マスターの脳分割があった場合には、2つの構成性を保証以上、それはスレーブの指定された数にデータを送信し続けた場合にはできない、と自分自身を与えるためにこれ以上の10秒よりもスレーブが直接拒否され、メッセージを確認応答しないことクライアントの要求を記述します。そのため、スプリットブレインシナリオでは、データの10秒までは失われます。
第四に、自動検出メカニズムのクラスタセンチネル
Sentinelはお互いを見つけ、Redisのパブ/サブシステムによって達成され、各Sentinelは__sentinel __行きます。こんにちは、このチャネルメッセージを送るが、今回はニュースに他のすべての警備員を消費することができ、他の認知をセンティネルの存在。
あなたのホスト、IPを言うメッセージを送信するには、ハローチャネルをし、このマスター構成を監視するためにRUNID:2秒ごとには、彼自身の警備員で、それぞれ__ __sentinelを対応するマスター+スレーブを監視します。
各Sentinelは、対応する各マスター+ __sentinel __奴隷を監視し、独自のを監視する:ハローチャンネルを、リスナーのセンチネルの他のマスター+スレーブの存在下で同じことを知覚します。
各センチネルサーベイランスは、同期用に構成され、それぞれを監視、センチネルのマスターの他の構成で交換されます。
五、コンフィギュレーション・伝播
ハンドオーバが完了した後、Sentinelは、独自のローカルマスター構成に最新世代を更新し、その後、他のセンチネルに同期がパブ/サブメッセージングによって、前に言われています。
メッセージのすべての種類は、新しいスイッチを完了するために、そう歩哨後、掲載してチャネルを介してに耳を傾けているので、ここではバージョン番号は、非常に重要である前に、新しいマスター構成は、新しいバージョン番号が続いています。他の歩哨は、そのマスター構成を更新するには、バージョン番号の大きさに基づいています。
参考文献:
https://github.com/hello-shf/advanced-java
https://www.cnblogs.com/daofaziran/p/10978628.html
間違った場所であればまた、メッセージ補正を残してください。
します。https://www.cnblogs.com/hello-shf/p/12059902.html元は容易ではありません、元のアドレスを記入してください