❝多くの友人がすでにマスター/スレーブ レプリケーションを構成していると思いますが、Redis マスター/スレーブのワークフローと一般的な問題を深く理解していません。 Redis のマスター/スレーブ レプリケーションに関するすべての知識ポイントを整理するのに 2 日かかりました。
## ここに図の説明を挿入
しかし、実際のプロセスでは、マスター/スレーブ レプリケーションに 2 つの Redis サーバーのみを使用することは不可能です。つまり、各 Redis サーバーはマスター ノード (マスター) と呼ばれる場合があります。
下の図この場合、slave3 はマスターのスレーブ ノードであり、スレーブのマスター ノードでもあります。
まずこの概念を理解してから、以下の詳細な説明を読み続けてください。
現在、スタンドアロン状態の Redis サーバーがあると仮定します。
この場合に発生する最初の問題はサーバーのダウンタイムであり、これはデータ損失に直接つながります。プロジェクトが人民元に関連している場合、その結果は想像できます。
2 番目の状況はメモリの問題です。サーバーが 1 台しかない場合、メモリは確実にピークに達します。1 台のサーバーを無限にアップグレードすることは不可能です。 そこで、上記 2 つの問題に対応して、さらにいくつかのサーバーを用意し、マスター/スレーブ レプリケーションを構成します。データを複数のサーバーに保存します。また、各サーバーのデータが同期されていることを確認します。万が一サーバーがダウンしてもユーザーの利用に影響はありません。 Redis は、データの高可用性と冗長バックアップを引き続き実現できます。
この時点で多くの疑問があると思いますが、マスターとスレーブをどのように接続するか?データを同期するにはどうすればよいですか?マスターサーバーがダウンしたらどうなるでしょうか?心配しないで、少しずつ問題を解決してください。
Redis を使用する理由について説明しました。マスター/スレーブ レプリケーションについて説明した後、マスター/スレーブ レプリケーションの役割は、それが使用される理由を説明することです。
Redis ストレージ パスは次のとおりです: usr/local/redis
ログと構成ファイルは次の場所に保存されます: usr/local/redis/data
最初に、redis6379.conf と redis6380.conf という 2 つの構成ファイルを構成します。主にポートを変更するために、構成ファイルを変更します。表示しやすいように、ログ ファイルと永続ファイルの名前はそれぞれのポートで識別されます。 次に、2 つの Redis サービスをそれぞれ開きます。1 つのポートは 6379、もう 1 つのポートは 6380 です。コマンド redis-server redis6380.conf
を実行し、redis-cli -p 6380
を使用して接続します。redis のデフォルトのポートは 6379 であるため、別の redis サーバーを起動して、直接 redis-server redis6379.conf
次に、redis-cli
を使用して直接接続します。 現時点では、2 つの Redis サービス (1 つは 6380、もう 1 つは 6379) が正常に構成されました。これはデモンストレーションのためだけです。実際の作業では、2 つの異なるサーバー上で構成する必要があります。
次に、スレーブ ノードで slaveof 127.0.0.1 6379
としてコマンドを実行します。実行後、接続されたことを意味します。 まず、マスター/スレーブ レプリケーションが実装されているかどうかをテストしてみましょう。マスター サーバー上で 2 つの set kaka 123 と set master 127.0.0.1
を実行すると、slave6380 ポートが正常に取得できます。これは、マスター/スレーブ レプリケーションが構成されたことを意味します。ただし、運用環境の実装で終わりではなく、その後、高可用性が達成されるまでマスター/スレーブ レプリケーションがさらに最適化されます。
slaveof no one を実行してマスター/スレーブ レプリケーションを切断する必要があります。
スレーブノードがマスターノードから切断されたことはどこで確認できますか?表示するには、マスター ノードのクライアントでコマンド ライン info を入力します。<p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; margin-top: 10px; margin-bottom: 10px; font-size: 14px; word-spacing: 2px;">この図は、クライアント コマンド ラインを使用してスレーブ ノードを使用してマスター ノードに接続した後、マスター ノードのクライアントで <code style="overflow-wrap: break-word; margin: 0px 2px; font-family: " operator mono consolas monaco menlo monospace word-break: break-all color: rgb background: rgba padding: border-radius: height: line-height:>info
と入力して出力された情報を示しています。スレーブ0に関する情報。 この画像は、スレーブ ノードが slaveof no one
を実行した後にマスター ノードに印刷される info
で、スレーブ ノードがマスター ノードから切断されたことを示します。 設定ファイル redis-server redis6380.conf に従って redis サービスを開始します。
スレーブ ノードが再起動された後、スレーブ ノードの接続情報を直接表示できます。マスターノード。
を実行します。 <h2 data-tool="mdnice编辑器" style="margin-top: 30px; margin-bottom: 15px; padding: 0px; color: black; font-size: 22px; border-bottom: 4px solid rgb(64, 184, 250);">
<span class="prefix" style="display: flex; width: 20px; height: 20px; background-size: 20px 20px; background-image: url(https://my-wechat.mdnice.com/fullstack-1.png); margin-bottom: -22px;"></span><span class="content" style="display: flex; color: #40B8FA; font-size: 20px; margin-left: 25px;">4. マスター/スレーブ レプリケーション開始後のログ情報の表示</span><span class="suffix" style="display: flex; box-sizing: border-box; width: 200px; height: 10px; border-top-left-radius: 20px; background: RGBA(64, 184, 250, .5); color: rgb(255, 255, 255); font-size: 16px; letter-spacing: 0.544px; justify-content: flex-end; float: right; margin-top: -10px; box-sizing: border-box !important; overflow-wrap: break-word !important;"></span>
</h2>
<p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; margin-top: 10px; margin-bottom: 10px; font-size: 14px; word-spacing: 2px;">マスター ノードのログ情報です。 <img src="https://img-blog.csdnimg.cn/2020053122205371.png" alt="Redis のマスター/スレーブ レプリケーションの原理と一般的な問題" style="max-width:90%">これは、マスターノードの接続情報を含むスレーブノードの情報と、RDB スナップショットの保存です。 <img src="https://img-blog.csdnimg.cn/2020053122221369.png" alt="Redis のマスター/スレーブ レプリケーションの原理と一般的な問題" style="max-width:90%"></p>
<h1 data-tool="mdnice编辑器" style="margin-top: 30px; margin-bottom: 15px; padding: 0px; color: black; font-size: 25px;">
<span class="prefix" style="color: rgb(64, 184, 250); display: none;"></span><span class="content" style="display: inline-block; color: rgb(64, 184, 250);">#5. マスター/スレーブ レプリケーションの動作原理</span><span class="suffix" style="display: inline-block; color: rgb(64, 184, 250);"></span>
</h1>
<h2 data-tool="mdnice编辑器" style="margin-top: 30px; margin-bottom: 15px; padding: 0px; color: black; font-size: 22px; border-bottom: 4px solid rgb(64, 184, 250);">
<span class="prefix" style="display: flex; width: 20px; height: 20px; background-size: 20px 20px; background-image: url(https://my-wechat.mdnice.com/fullstack-1.png); margin-bottom: -22px;"></span><span class="content" style="display: flex; color: #40B8FA; font-size: 20px; margin-left: 25px;">1 . マスター/スレーブ レプリケーションの 3 つの段階</span><span class="suffix" style="display: flex; box-sizing: border-box; width: 200px; height: 10px; border-top-left-radius: 20px; background: RGBA(64, 184, 250, .5); color: rgb(255, 255, 255); font-size: 16px; letter-spacing: 0.544px; justify-content: flex-end; float: right; margin-top: -10px; box-sizing: border-box !important; overflow-wrap: break-word !important;"></span>
</h2>
<p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; margin-top: 10px; margin-bottom: 10px; font-size: 14px; word-spacing: 2px;">マスター/スレーブ レプリケーションの完全なワークフローは、次の 3 つの段階に分かれています。各セグメントには独自の内部ワークフローがあるため、これら 3 つのプロセスについて説明します。 </p>
<ul data-tool="mdnice编辑器" style="margin-top: 8px; margin-bottom: 8px; padding-left: 25px; font-size: 15px; color: #595959; list-style-type: circle;">
<li><section style="margin-top: 5px; margin-bottom: 5px; line-height: 26px; font-size: 14px;">コネクション確立処理: スレーブをマスターに接続する処理です。</section></li>
<li><section style="margin-top: 5px; margin-bottom: 5px; line-height: 26px; font-size: 14px;">データ同期処理: マスターがデータを同期する処理です。スレーブへ</section></li>
<li><section style="margin-top: 5px; margin-bottom: 5px; line-height: 26px; font-size: 14px;">コマンド伝播プロセス: データ同期の繰り返し<img src="https://img-blog.csdnimg.cn/20200531230125375.png" alt="Redis のマスター/スレーブ レプリケーションの原理と一般的な問題" style="max-width:90%"></section></li>
</ul>
<h2 data-tool="mdnice编辑器" style="margin-top: 30px; margin-bottom: 15px; padding: 0px; color: black; font-size: 22px; border-bottom: 4px solid rgb(64, 184, 250);">
<span class="prefix" style="display: flex; width: 20px; height: 20px; background-size: 20px 20px; background-image: url(https://my-wechat.mdnice.com/fullstack-1.png); margin-bottom: -22px;"></span><span class="content" style="display: flex; color: #40B8FA; font-size: 20px; margin-left: 25px;">##2. 第 1 段階: 接続確立プロセス</span><span class="suffix" style="display: flex; box-sizing: border-box; width: 200px; height: 10px; border-top-left-radius: 20px; background: RGBA(64, 184, 250, .5); color: rgb(255, 255, 255); font-size: 16px; letter-spacing: 0.544px; justify-content: flex-end; float: right; margin-top: -10px; box-sizing: border-box !important; overflow-wrap: break-word !important;"></span>
</h2>
<p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; margin-top: 10px; margin-bottom: 10px; font-size: 14px; word-spacing: 2px;"><img src="https://img-blog.csdnimg.cn/20200531233524414.png" alt="Redis のマスター/スレーブ レプリケーションの原理と一般的な問題" style="max-width:90%">上の図は、完全なマスター/スレーブ レプリケーション接続確立ワークフローです。次に、短い言葉を使って上記のワークフローを説明します。 </p>
<ol data-tool="mdnice编辑器" style="margin-top: 8px; margin-bottom: 8px; padding-left: 25px; font-size: 15px; color: rgb(89, 89, 89);">
<li>#マスターのアドレスとポートを設定し、マスターの情報を保存します<section style="margin-top: 5px; margin-bottom: 5px; line-height: 26px; font-size: 14px;"></section>
</li>#ソケット接続を確立します (この接続が何を行うかは以下で説明します)<li><section style="margin-top: 5px; margin-bottom: 5px; line-height: 26px; font-size: 14px;"></section></li>ping コマンドの連続送信<li><section style="margin-top: 5px; margin-bottom: 5px; line-height: 26px; font-size: 14px;"></section></li>認証<li><section style="margin-top: 5px; margin-bottom: 5px; line-height: 26px; font-size: 14px;"></section></li>スレーブ ポート情報の送信<li><section style="margin-top: 5px; margin-bottom: 5px; line-height: 26px; font-size: 14px;"> </section></li>接続を確立するプロセス中に、スレーブ ノードはマスターのアドレスとポートを保存し、マスター ノードのマスターはスレーブ ノードのポートを保存します。 </ol>
<p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; margin-top: 10px; margin-bottom: 10px; font-size: 14px; word-spacing: 2px;"></p>
<h2 data-tool="mdnice编辑器" style="margin-top: 30px; margin-bottom: 15px; padding: 0px; color: black; font-size: 22px; border-bottom: 4px solid rgb(64, 184, 250);">
<span class="prefix" style="display: flex; width: 20px; height: 20px; background-size: 20px 20px; background-image: url(https://my-wechat.mdnice.com/fullstack-1.png); margin-bottom: -22px;">3. 第 2 段階: データ同期段階のプロセス </span><span class="content" style="display: flex; color: #40B8FA; font-size: 20px; margin-left: 25px;"></span><span class="suffix" style="display: flex; box-sizing: border-box; width: 200px; height: 10px; border-top-left-radius: 20px; background: RGBA(64, 184, 250, .5); color: rgb(255, 255, 255); font-size: 16px; letter-spacing: 0.544px; justify-content: flex-end; float: right; margin-top: -10px; box-sizing: border-box !important; overflow-wrap: break-word !important;"></span>
</h2>この図は、次の詳細な説明です。最初のスレーブ ノードがマスター ノードに接続するときのデータ同期プロセス。 <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; margin-top: 10px; margin-bottom: 10px; font-size: 14px; word-spacing: 2px;"></p>
<p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; margin-top: 10px; margin-bottom: 10px; font-size: 14px; word-spacing: 2px;">スレーブ ノードが初めてマスター ノードに接続すると、最初にフル コピーが実行されますが、このフル コピーは避けられません。 </p>
<p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; margin-top: 10px; margin-bottom: 10px; font-size: 14px; word-spacing: 2px;">完全レプリケーションが完了すると、マスター ノードはレプリケーション バックログ バッファ内のデータを送信し、スレーブ ノードは bgrewriteaof を実行してデータを復元します。これも部分レプリケーションです。 </p>
<p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; margin-top: 10px; margin-bottom: 10px; font-size: 14px; word-spacing: 2px;">この段階では、フル コピー、部分コピー、およびコピー バッファー バックログ領域の 3 つの新しい点について言及します。これらの点については、以下の FAQ で詳しく説明します。 </p>
<h2 data-tool="mdnice编辑器" style="margin-top: 30px; margin-bottom: 15px; padding: 0px; color: black; font-size: 22px; border-bottom: 4px solid rgb(64, 184, 250);">
<span class="prefix" style="display: flex; width: 20px; height: 20px; background-size: 20px 20px; background-image: url(https://my-wechat.mdnice.com/fullstack-1.png); margin-bottom: -22px;"></span><span class="content" style="display: flex; color: #40B8FA; font-size: 20px; margin-left: 25px;">4. 3 番目のフェーズ: コマンド伝播フェーズ</span><span class="suffix" style="display: flex; box-sizing: border-box; width: 200px; height: 10px; border-top-left-radius: 20px; background: RGBA(64, 184, 250, .5); color: rgb(255, 255, 255); font-size: 16px; letter-spacing: 0.544px; justify-content: flex-end; float: right; margin-top: -10px; box-sizing: border-box !important; overflow-wrap: break-word !important;"></span>
</h2>
<p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; margin-top: 10px; margin-bottom: 10px; font-size: 14px; word-spacing: 2px;">マスター データベースが変更されると、マスターとスレーブがサーバー データの不整合が発生した後、マスターとスレーブのデータが同期されて整合性が保たれます。このプロセスはコマンド伝播と呼ばれます。 </p>
<p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; margin-top: 10px; margin-bottom: 10px; font-size: 14px; word-spacing: 2px;">マスタは受信したデータ変更コマンドをスレーブに送信し、スレーブはコマンド受信後にコマンドを実行してマスタとスレーブのデータを整合させます。 </p>
<p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; margin-top: 10px; margin-bottom: 10px; font-size: 14px; word-spacing: 2px;"><strong style="color: rgb(53, 148, 247);">「コマンド伝播フェーズでの部分レプリケーション」</strong></p>
<ul data-tool="mdnice编辑器" style="margin-top: 8px; margin-bottom: 8px; padding-left: 25px; font-size: 15px; color: #595959; list-style-type: circle;">
<li><section style="margin-top: 5px; margin-bottom: 5px; line-height: 26px; font-size: 14px;"><p style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; color: rgb(43, 43, 43); margin-top: 10px; margin-bottom: 10px; word-spacing: 2px;">コマンド伝播フェーズ中に、ネットワークが切断されたり、ネットワークがジッターしたりした場合接続が切断されます (接続が失われます) </p></section></li>
<li>
<section style="margin-top: 5px; margin-bottom: 5px; line-height: 26px; font-size: 14px;"><p style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; color: rgb(43, 43, 43); margin-top: 10px; margin-bottom: 10px; word-spacing: 2px;">#この時点で、マスター ノードのマスターは replbackbuffer (レプリケーション バッファーのバックログ領域) にデータを書き込み続けます。 )</p></section> </li>
<li><section style="margin-top: 5px; margin-bottom: 5px; line-height: 26px; font-size: 14px;"><p style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; color: rgb(43, 43, 43); margin-top: 10px; margin-bottom: 10px; word-spacing: 2px;">スレーブ ノードは引き続きマスターへの接続を試みます </p></section></li>
<li><section style="margin-top: 5px; margin-bottom: 5px; line-height: 26px; font-size: 14px;"><p style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; color: rgb(43, 43, 43); margin-top: 10px; margin-bottom: 10px; word-spacing: 2px;">いつスレーブ ノードは runid を入力し、レプリケーション オフセットがマスター ノードに送信され、pysnc コマンドが実行されて同期されます。</p></section></li>
<li><section style="margin-top: 5px; margin-bottom: 5px; line-height: 26px; font-size: 14px;"><p style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; color: rgb(43, 43, 43); margin-top: 10px; margin-bottom: 10px; word-spacing: 2px;">マスターがオフセットを決定した場合、レプリケーション バッファの範囲内にある場合は、Continue Order を返します。そして、コピーバッファ内のデータをスレーブノードに送信します。 </p></section></li>
<li><section style="margin-top: 5px; margin-bottom: 5px; line-height: 26px; font-size: 14px;"><p style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; color: rgb(43, 43, 43); margin-top: 10px; margin-bottom: 10px; word-spacing: 2px;">#ノードからデータを受信し、bgrewriteaof を実行してデータを復元します</p></section></li>
</ul>
<h1 data-tool="mdnice编辑器" style="margin-top: 30px; margin-bottom: 15px; padding: 0px; color: black; font-size: 25px;">
<span class="prefix" style="color: rgb(64, 184, 250); display: none;"></span>## 6. マスター/スレーブ レプリケーションの原理の詳細な紹介 (完全コピーと部分コピー)<span class="content" style="display: inline-block; color: rgb(64, 184, 250);"></span><span class="suffix" style="display: inline-block; color: rgb(64, 184, 250);"></span>
</h1>
<p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; margin-top: 10px; margin-bottom: 10px; font-size: 14px; word-spacing: 2px;">このプロセスは、マスター/スレーブ レプリケーションの最も完全なプロセスの説明です。 。それでは、プロセスの各ステップを簡単に紹介しましょう<img src="https://img-blog.csdnimg.cn/20200601170651307.png" alt="Redis のマスター/スレーブ レプリケーションの原理と一般的な問題" style="max-width:90%"></p>
<ol data-tool="mdnice编辑器" style="margin-top: 8px; margin-bottom: 8px; padding-left: 25px; font-size: 15px; color: rgb(89, 89, 89);">
<li><section style="margin-top: 5px; margin-bottom: 5px; line-height: 26px; font-size: 14px;">ノードから命令を送信します<code style="overflow-wrap: break-word; margin: 0px 2px; font-family: " operator mono consolas monaco menlo monospace word-break: break-all color: rgb background: rgba padding: border-radius: height: line-height:>psync ? 1 psync runid offset
データを要求するために対応する runid
を見つけます。ただし、ここでは、スレーブ ノードが初めて接続するとき、マスター ノードの runid と offset
をまったく知らないと考えることができます。最初に送信されるコマンドは psync ですか? 1
は、マスターノードのすべてのデータが必要であることを意味します。
に戻って完全レプリケーションの実行を続行します。ここでの runid の不一致は、スレーブ ノードの再起動によってのみ発生する可能性があります。この問題は後で解決されます。オフセット (オフセット) の不一致は、レプリケーション バックログ バッファ オーバーフローによって発生します。 runid または offset チェックに合格し、スレーブ ノードのオフセットがマスター ノードのオフセットと同じである場合、そのオフセットは無視されます。 runid または offset チェックに合格し、スレーブ ノードのオフセットがオフセットと異なる場合、CONTINUE offset (このオフセットはマスター ノードに属します) が送信され、スレーブ ノードのオフセットからマスター ノードのオフセットへのデータが送信されます。レプリケーション バッファはソケット経由で送信されます。
「1 ~ 4 は完全コピー、5 ~ 8 は部分コピー」
マスター ノードのステップ 3 では、マスター ノードはマスター/スレーブ レプリケーション期間中にクライアント データを受信しており、マスター ノードのオフセットが変化しています。変更のみが各スレーブに送信されます。この送信プロセスはハートビート メカニズムと呼ばれます
##コマンド伝播段階では常にマスターノードとスレーブノード間の情報交換が必要となり、マスターノードとスレーブノード間の接続をオンラインに保つためのメンテナンスとしてハートビート機構が使用されます。
マスター ハートビート
構成調整には 2 つのパラメータがあります: min-slaves-to-write 2
min-slaves-max-lag 8
これら 2 つパラメータがスレーブ ノードが 2 つしか残っていないことを示している場合、またはスレーブ ノードの遅延が 8 秒を超えている場合、マスター ノードはマスター機能を強制的にオフにし、データ同期を停止します。
それでは、マスター ノードはどのようにしてハングアップしたスレーブ ノードの数と遅延時間を知るのでしょうか?ハートビート メカニズムでは、スレーブは perlconf ack コマンドを毎秒送信します。このコマンドには、オフセット、スレーブ ノードの遅延時間、およびスレーブ ノードの数が含まれます。
# まずはこの実行 ID について見てみましょう。info コマンドを実行すると確認できます。上記の起動ログ情報を見ると、このこともわかります。
Redis は起動時にランダム ID を自動的に生成します (ID は起動するたびに異なることに注意してください)。これは 40 個のランダムな 16 進文字列で構成されます。 Redis ノードを一意に識別します。
マスター/スレーブ レプリケーションが最初に開始されると、マスターはその runid をスレーブに送信し、スレーブはマスターの ID を保存します。これを表示するには info コマンドを使用できます。
接続が切断されて再接続されると、スレーブはこの ID をマスターに送信します。スレーブによって保存された runid がマスターの現在の runid と同じ場合、マスターは部分コピーの使用を試みます (このブロックが正常にコピーできるかどうかのもう 1 つの要素はオフセットです)。スレーブによって保存された runid がマスターの現在の runid と異なる場合、完全コピーが直接実行されます。
#コピー バッファ バックログは先入れ先出しキューであり、ユーザーマスターコマンドレコードによって収集されたデータを保存します。コピーバッファのデフォルトのストレージ容量は 1M です。
設定ファイルの repl-backlog-size 1mb
を変更して、バッファ サイズを制御できます。この比率は、独自のサーバー メモリに応じて変更できます。Kaka は約 30 % を予約しました。
「コピー バッファには正確に何が格納されているのですか?」
コマンドを set name kaka
として実行すると、永続化ファイルを表示できます。 View そうすると、コピー バックログ バッファーは、バイトごとに区切られた永続データが保存され、各バイトには独自のオフセットがあります。このオフセットはコピー オフセット (オフセット) でもあります。「では、なぜコピー バッファーのバックログがフル コピーを引き起こす可能性があると言われているのですか?」
コマンド伝播段階では、マスターがノードは収集したデータをレプリケーション バッファに保存し、スレーブ ノードに送信します。ここで問題が発生し、マスターノード上のデータ量が瞬間的に非常に多くなり、レプリケーションバッファのメモリを超えると、一部のデータが圧迫され、マスターノードとスレーブ間でデータの不整合が発生します。ノード。完全なコピーを作成するには。バッファサイズを無理に設定すると無限ループが発生する可能性があり、スレーブノードは必ず全コピー→データクリア→全コピーを繰り返します。
マスター ノードのレプリケーション オフセットがスレーブ ノードに送信されます 1 回記録します、スレーブノードはレコードを 1 回受信します。
は、情報を同期し、マスター ノードとスレーブ ノードの違いを比較し、スレーブが切断されたときにデータ使用量を復元するために使用されます。
この値は、コピー バッファー バックログからのオフセットです。
マスター ノードが再起動すると、runid の値が変更され、すべてのスレーブ ノードで完全なレプリケーションが実行されます。
この問題を考慮する必要はありません。システムがどのように最適化されるかを知る必要があるだけです。
マスター/スレーブ レプリケーションが確立された後、マスター ノードはマスター - リプリッド変数を作成します。生成された戦略は runid と同じで、長さは 41 ビット、runid の長さは 40 ビットです。そしてスレーブノードに送信されます。
マスターノードでshutdown saveコマンドを実行すると、RDB永続化が実行され、runidとoffsetがRDBファイルに保存されます。コマンド redis-check-rdb を使用して、この情報を表示できます。
マスターノードの再起動後にRDBファイルをロードし、ファイル内のrepl-idとrepl-offsetをメモリにロードします。すべてのスレーブ ノードが以前のマスター ノードであるとみなされる場合でも。
ネットワーク環境が悪いため、スレーブ ノード ネットワークが中断されます。レプリケーション バックログ バッファ メモリが小さすぎるため、データ オーバーフローが発生します。スレーブ ノード オフセットが境界を越えると、完全レプリケーションが発生します。これにより、完全なコピーが繰り返される可能性があります。
解決策: レプリケーション バックログ バッファーのサイズを変更します: repl-backlog-size
設定の提案: マスター ノードがスレーブ ノードに接続する時間をテストし、平均合計を取得します。 1 秒あたりマスター ノードによって生成されるコマンドの数 量 write_size_per_second
コピー バッファー領域の設定 = 2 * マスター/スレーブ接続時間 * 1 秒あたりマスター ノードによって生成されるデータの合計量
ネットワーク要因により、複数のスレーブ ノードのデータが不整合になります。この要因を回避する方法はありません。
この問題には 2 つの解決策があります:
最初のデータは一貫性が高く、redis サーバーを構成し、読み取りと書き込みの両方に 1 つのサーバーを使用する必要があります。この方法は、少量のデータであり、データには高度な一貫性が必要です。
2 番目はマスター/スレーブ ノードのオフセットを監視し、スレーブ ノードの遅延が大きすぎる場合、クライアントのスレーブ ノードへのアクセスは一時的にブロックされます。パラメータをslave-serve-stale-data yes|noに設定します。このパラメータが設定されると、info smileof などのいくつかのコマンドにのみ応答できるようになります。
#この問題は、クライアント上で利用可能なノードのリストを直接管理します。スレーブ ノード 障害が発生した場合は、他のノードに切り替えて作業します。この問題については、クラスタで後ほど説明します。
この記事では主にマスター/スレーブ レプリケーションとは何か、マスターの 3 つの主要な側面について説明します。 -slave replication: ステージ、ワークフロー、および部分レプリケーションの 3 つのコア コンポーネント。コマンド伝播フェーズ中のハートビート メカニズム。最後に、マスター/スレーブ レプリケーションに関する一般的な問題について説明します。
この記事を書くのに 2 日かかりました。これは、Kaka が最近書いた最長の記事でもあります。Kaka が今後公開する記事はこのようになるものと予想されます。複数の記事は公開しません1 つの問題については個別に記事で説明しますが、すべてを 1 つの記事で説明します。不完全な知識ポイントや間違った知識ポイントは、カカの知識ポイントが増加するにつれて改善されます。この記事は主にカカレビューの便宜を目的としています。ご質問がある場合は、コメントセクションをご覧ください。
カカは、誰もがコミュニケーションを取り、一緒に学ぶことができることを望んでいます。何か間違っている場合は、それを指摘してください。気に入らない場合は、批判しないでください。
❝学習の継続、ブログの継続、共有の継続は、カカがそのキャリア以来常に支持してきた信念です。巨大なインターネット上のカカの記事があなたに何かをもたらすことを願っています。少しお手伝いします。また次回お会いしましょう。
❞
推奨: "redis チュートリアル "
以上がRedis のマスター/スレーブ レプリケーションの原理と一般的な問題の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。