ホームページ >データベース >Redis >Redis のマスター/スレーブ レプリケーションの原理と一般的な問題

Redis のマスター/スレーブ レプリケーションの原理と一般的な問題

咔咔
咔咔オリジナル
2020-08-28 17:20:511902ブラウズ

多くの友人がすでにマスター/スレーブ レプリケーションを構成していると思いますが、Redis マスター/スレーブのワークフローと一般的な問題を深く理解していません。 Redis のマスター/スレーブ レプリケーションに関するすべての知識ポイントを整理するのに 2 日かかりました。

#❝カカはインタビューガイドを作成するためのロードマップをまとめ、そのロードマップに従って記事を書く準備をしました。補足はありませんでした。ナレッジ ポイントは追加中です。また、パートナーが追加を手伝ってくれるのを楽しみにしています。コメント エリアでお会いしましょう!

## ここに図の説明を挿入

# 1. Redis マスター/スレーブ レプリケーションとは何ですか? Redis のマスター/スレーブ レプリケーションの原理と一般的な問題
マスター/スレーブ レプリケーションとは、2 つの Redis サーバーが存在し、1 つの Redis のデータがもう 1 つの Redis データベースに同期されることを意味します。前者をマスターノード、後者をスレーブノードと呼びます。データはマスターからスレーブへの一方向でのみ同期できます。

しかし、実際のプロセスでは、マスター/スレーブ レプリケーションに 2 つの Redis サーバーのみを使用することは不可能です。つまり、各 Redis サーバーはマスター ノード (マスター) と呼ばれる場合があります。

下の図この場合、slave3 はマスターのスレーブ ノードであり、スレーブのマスター ノードでもあります。

まずこの概念を理解してから、以下の詳細な説明を読み続けてください。 Redis のマスター/スレーブ レプリケーションの原理と一般的な問題

2. Redis のマスター/スレーブ レプリケーションが必要な理由は何ですか?

現在、スタンドアロン状態の Redis サーバーがあると仮定します。

この場合に発生する最初の問題はサーバーのダウンタイムであり、これはデータ損失に直接つながります。プロジェクトが人民元に関連している場合、その結果は想像できます。

2 番目の状況はメモリの問題です。サーバーが 1 台しかない場合、メモリは確実にピークに達します。1 台のサーバーを無限にアップグレードすることは不可能です。 Redis のマスター/スレーブ レプリケーションの原理と一般的な問題そこで、上記 2 つの問題に対応して、さらにいくつかのサーバーを用意し、マスター/スレーブ レプリケーションを構成します。データを複数のサーバーに保存します。また、各サーバーのデータが同期されていることを確認します。万が一サーバーがダウンしてもユーザーの利用に影響はありません。 Redis は、データの高可用性と冗長バックアップを引き続き実現できます。

この時点で多くの疑問があると思いますが、マスターとスレーブをどのように接続するか?データを同期するにはどうすればよいですか?マスターサーバーがダウンしたらどうなるでしょうか?心配しないで、少しずつ問題を解決してください。 Redis のマスター/スレーブ レプリケーションの原理と一般的な問題

3. Redis のマスター/スレーブ レプリケーションの役割

Redis を使用する理由について説明しました。マスター/スレーブ レプリケーションについて説明した後、マスター/スレーブ レプリケーションの役割は、それが使用される理由を説明することです。

  1. この図を使って引き続き説明していきます
  2. 最初のポイントは、永続性に加えてデータのホット バックアップを実現するデータの冗長性です。方法。
  3. #2 番目のポイントは、単一マシンの障害についてです。マスターノードに障害が発生した場合、従属であるスレーブノードがサービスを提供することで、障害からの迅速な復旧を実現するサービスの冗長化を実現します。
  4. 3 番目のポイントは読み取りと書き込みの分離であり、マスター サーバーは主に書き込みに使用され、スレーブは主にデータの読み取りに使用され、サーバーの負荷容量を向上させることができます。サーバ。同時に、需要の変化に応じてスレーブノードの数を追加することができます。
  5. 4 番目のポイントは負荷分散です。読み取りと書き込みの分離と併せて、特に次の場合に、マスター ノードが書き込みサービスを提供し、スレーブ ノードが読み取りサービスを提供してサーバーの負荷を共有します。書き込みが減り、読み取りが増えるため、複数のスレーブ ノードで読み取り負荷を共有することで、Redis サーバーの同時実行性と負荷を大幅に改善できます。
  6. 5 番目のポイントは、高可用性の基礎です。マスター/スレーブ レプリケーションは、センチネルとクラスターの実装の基礎です。したがって、マスター/スレーブ レプリケーションが基礎であると言えます。高可用性を実現します。
Redis のマスター/スレーブ レプリケーションの原理と一般的な問題
ここに画像の説明を挿入

#ここまで述べましたが、まずマスター/スレーブ レプリケーションのケースを簡単に構成してから、実装の原則について説明します。

Redis ストレージ パスは次のとおりです: usr/local/redis

ログと構成ファイルは次の場所に保存されます: usr/local/redis/data

最初に、redis6379.conf と redis6380.conf という 2 つの構成ファイルを構成します。Redis のマスター/スレーブ レプリケーションの原理と一般的な問題主にポートを変更するために、構成ファイルを変更します。表示しやすいように、ログ ファイルと永続ファイルの名前はそれぞれのポートで識別されます。 Redis のマスター/スレーブ レプリケーションの原理と一般的な問題次に、2 つの Redis サービスをそれぞれ開きます。1 つのポートは 6379、もう 1 つのポートは 6380 です。コマンド redis-server redis6380.conf を実行し、redis-cli -p 6380 を使用して接続します。redis のデフォルトのポートは 6379 であるため、別の redis サーバーを起動して、直接 redis-server redis6379.conf 次に、redis-cli を使用して直接接続します。 Redis のマスター/スレーブ レプリケーションの原理と一般的な問題現時点では、2 つの Redis サービス (1 つは 6380、もう 1 つは 6379) が正常に構成されました。これはデモンストレーションのためだけです。実際の作業では、2 つの異なるサーバー上で構成する必要があります。

Redis のマスター/スレーブ レプリケーションの原理と一般的な問題
#ここに画像の説明を挿入

##1. クライアント コマンド ラインの使用を開始しますまず概念を理解する必要があります。つまり、マスター/スレーブ レプリケーションを構成する場合、すべての操作はスレーブ ノード (スレーブ) で実行されるということです。

次に、スレーブ ノードで slaveof 127.0.0.1 6379 としてコマンドを実行します。実行後、接続されたことを意味します。 Redis のマスター/スレーブ レプリケーションの原理と一般的な問題 まず、マスター/スレーブ レプリケーションが実装されているかどうかをテストしてみましょう。マスター サーバー上で 2 つの set kaka 123 と set master 127.0.0.1 を実行すると、slave6380 ポートが正常に取得できます。これは、マスター/スレーブ レプリケーションが構成されたことを意味します。ただし、運用環境の実装で終わりではなく、その後、高可用性が達成されるまでマスター/スレーブ レプリケーションがさらに最適化されます。

Redis のマスター/スレーブ レプリケーションの原理と一般的な問題
#ここに画像の説明を挿入

2. 構成ファイルを使用して を有効にします

構成ファイルを使用してマスター/スレーブ レプリケーションを開始する前に!まず、クライアント コマンド ラインを使用して以前の接続を切断し、スレーブ ホストで

slaveof no one を実行してマスター/スレーブ レプリケーションを切断する必要があります。 スレーブノードがマスターノードから切断されたことはどこで確認できますか?表示するには、マスター ノードのクライアントでコマンド ライン Redis のマスター/スレーブ レプリケーションの原理と一般的な問題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に関する情報。 Redis のマスター/スレーブ レプリケーションの原理と一般的な問題この画像は、スレーブ ノードが slaveof no one を実行した後にマスター ノードに印刷される info で、スレーブ ノードがマスター ノードから切断されたことを示します。 Redis のマスター/スレーブ レプリケーションの原理と一般的な問題設定ファイル redis-server redis6380.conf に従って redis サービスを開始します。スレーブ ノードが再起動された後、スレーブ ノードの接続情報を直接表示できます。マスターノード。

マスター ノードによって書き込まれたテスト データは、スレーブ ノードによって自動的に同期されます。

Redis のマスター/スレーブ レプリケーションの原理と一般的な問題Redis のマスター/スレーブ レプリケーションの原理と一般的な問題

#3. Redis サーバーの起動時に開始しますこの構成も非常に簡単です。 Redis サーバーを使用して、マスター/スレーブ レプリケーションを直接開始し、コマンド

redis-server --slaveof host port

を実行します。 <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 は、マスターノードのすべてのデータが必要であることを意味します。

  • マスター ノードは、bgsave の実行を開始して RDB ファイルを生成し、現在のレプリケーション オフセット offset を記録します。
  • マスター ノードは、独自のレプリケーション オフセットを記録します。このときの runid と offset は、FULLRESYNC runid offset コマンドを通じてソケット経由で RDB ファイルをスレーブ ノードに送信します。
  • スレーブ ノードは FULLRESYNC を受信し、マスター ノードの runid とオフセットを保存した後、現在のデータをすべてクリアし、ソケット経由で RDB ファイルを受信し、RDB データの復元を開始します。
  • #完全レプリケーションの後、スレーブ ノードはマスター ノードの runid とオフセットを取得し、命令の送信を開始します。
    psync runid offset
  • #マスター ノードは命令を受け取り、runid が一致するかどうかを判断し、オフセットがコピー バッファーにあるかどうかを判断します。
  • マスター ノードは、runid とオフセットのいずれかが満たされていないと判断し、ステップ
    2 に戻って完全レプリケーションの実行を続行します。ここでの runid の不一致は、スレーブ ノードの再起動によってのみ発生する可能性があります。この問題は後で解決されます。オフセット (オフセット) の不一致は、レプリケーション バックログ バッファ オーバーフローによって発生します。 runid または offset チェックに合格し、スレーブ ノードのオフセットがマスター ノードのオフセットと同じである場合、そのオフセットは無視されます。 runid または offset チェックに合格し、スレーブ ノードのオフセットがオフセットと異なる場合、CONTINUE offset (このオフセットはマスター ノードに属します) が送信され、スレーブ ノードのオフセットからマスター ノードのオフセットへのデータが送信されます。レプリケーション バッファはソケット経由で送信されます。
  • ノードから CONTINUE を受信し、マスターのオフセットを保存し、ソケット経由で情報を受信後、bgrewriteaof を実行してデータを復元します。
  • 「1 ~ 4 は完全コピー、5 ~ 8 は部分コピー」

    マスター ノードのステップ 3 では、マスター ノードはマスター/スレーブ レプリケーション期間中にクライアント データを受信して​​おり、マスター ノードのオフセットが変化しています。変更のみが各スレーブに送信されます。この送信プロセスはハートビート メカニズムと呼ばれます

    7. ハートビート メカニズム

    ##コマンド伝播段階では常にマスターノードとスレーブノード間の情報交換が必要となり、マスターノードとスレーブノード間の接続をオンラインに保つためのメンテナンスとしてハートビート機構が使用されます。

    • マスター ハートビート

      • コマンド: ping
      • デフォルトは 10 秒です。これはパラメータ repl-ping-slave-period によって決定されます
      • #主に行うべきことは、スレーブ ノードがオンラインであるかどうかを判断することです
      • #info replication が利用できます。 スレーブノードからレンタル後の接続時間の間隔を確認し、ラグが 0 または 1 であれば正常です。
    • #スレーブ ハートビート タスク
    • コマンド: replconf ack {offset}
      • 1 秒に 1 回実行
      • #主な動作は、独自のレプリケーション オフセットをマスター ノードに送信し、マスターから最新のデータ変更コマンドを取得することです。ノードのもう 1 つの処理は、マスター ノードがオンラインかどうかを判断することです。
      「ハートビートフェーズ中の注意事項」
    • データの安定性を確保するために、マスターノードはレイテンシが高すぎる場合、 。すべての情報の同期は拒否されます。

    構成調整には 2 つのパラメータがあります: min-slaves-to-write 2

    min-slaves-max-lag 8

    これら 2 つパラメータがスレーブ ノードが 2 つしか残っていないことを示している場合、またはスレーブ ノードの遅延が 8 秒を超えている場合、マスター ノードはマスター機能を強制的にオフにし、データ同期を停止します。

    それでは、マスター ノードはどのようにしてハングアップしたスレーブ ノードの数と遅延時間を知るのでしょうか?ハートビート メカニズムでは、スレーブは perlconf ack コマンドを毎秒送信します。このコマンドには、オフセット、スレーブ ノードの遅延時間、およびスレーブ ノードの数が含まれます。

    8. 部分レプリケーションの 3 つのコア要素

    1. サーバーの実行 ID (run id)

    # まずはこの実行 ID について見てみましょう。info コマンドを実行すると確認できます。上記の起動ログ情報を見ると、このこともわかります。

    Redis のマスター/スレーブ レプリケーションの原理と一般的な問題Redis は起動時にランダム ID を自動的に生成します (ID は起動するたびに異なることに注意してください)。これは 40 個のランダムな 16 進文字列で構成されます。 Redis ノードを一意に識別します。

    マスター/スレーブ レプリケーションが最初に開始されると、マスターはその runid をスレーブに送信し、スレーブはマスターの ID を保存します。これを表示するには info コマンドを使用できます。

    Redis のマスター/スレーブ レプリケーションの原理と一般的な問題
    ここに画像の説明を挿入

    接続が切断されて再接続されると、スレーブはこの ID をマスターに送信します。スレーブによって保存された runid がマスターの現在の runid と同じ場合、マスターは部分コピーの使用を試みます (このブロックが正常にコピーできるかどうかのもう 1 つの要素はオフセットです)。スレーブによって保存された runid がマスターの現在の runid と異なる場合、完全コピーが直接実行されます。

    #2. コピー バックログ バッファ

    #コピー バッファ バックログは先入れ先出しキューであり、ユーザーマスターコマンドレコードによって収集されたデータを保存します。コピーバッファのデフォルトのストレージ容量は 1M です。

    設定ファイルの repl-backlog-size 1mb を変更して、バッファ サイズを制御できます。この比率は、独自のサーバー メモリに応じて変更できます。Kaka は約 30 % を予約しました。

    「コピー バッファには正確に何が格納されているのですか?」

    コマンドを set name kaka として実行すると、永続化ファイルを表示できます。 ViewRedis のマスター/スレーブ レプリケーションの原理と一般的な問題 そうすると、コピー バックログ バッファーは、バイトごとに区切られた永続データが保存され、各バイトには独自のオフセットがあります。このオフセットはコピー オフセット (オフセット) でもあります。Redis のマスター/スレーブ レプリケーションの原理と一般的な問題「では、なぜコピー バッファーのバックログがフル コピーを引き起こす可能性があると言われているのですか?」

    コマンド伝播段階では、マスターがノードは収集したデータをレプリケーション バッファに保存し、スレーブ ノードに送信します。ここで問題が発生し、マスターノード上のデータ量が瞬間的に非常に多くなり、レプリケーションバッファのメモリを超えると、一部のデータが圧迫され、マスターノードとスレーブ間でデータの不整合が発生します。ノード。完全なコピーを作成するには。バッファサイズを無理に設定すると無限ループが発生する可能性があり、スレーブノードは必ず全コピー→データクリア→全コピーを繰り返します。

    3. レプリケーション オフセット (オフセット)

    Redis のマスター/スレーブ レプリケーションの原理と一般的な問題マスター ノードのレプリケーション オフセットがスレーブ ノードに送信されます 1 回記録します、スレーブノードはレコードを 1 回受信します。

    は、情報を同期し、マスター ノードとスレーブ ノードの違いを比較し、スレーブが切断されたときにデータ使用量を復元するために使用されます。

    この値は、コピー バッファー バックログからのオフセットです。

    #9. マスター/スレーブ レプリケーションに関する一般的な問題

    1。マスター ノードの再起動の問題 (内部最適化)

    マスター ノードが再起動すると、runid の値が変更され、すべてのスレーブ ノードで完全なレプリケーションが実行されます。

    この問題を考慮する必要はありません。システムがどのように最適化されるかを知る必要があるだけです。

    マスター/スレーブ レプリケーションが確立された後、マスター ノードはマスター - リプリッド変数を作成します。生成された戦略は runid と同じで、長さは 41 ビット、runid の長さは 40 ビットです。そしてスレーブノードに送信されます。

    マスターノードでshutdown saveコマンドを実行すると、RDB永続化が実行され、runidとoffsetがRDBファイルに保存されます。コマンド redis-check-rdb を使用して、この情報を表示できます。

    Redis のマスター/スレーブ レプリケーションの原理と一般的な問題マスターノードの再起動後にRDBファイルをロードし、ファイル内のrepl-idとrepl-offsetをメモリにロードします。すべてのスレーブ ノードが以前のマスター ノードであるとみなされる場合でも。

    2. スレーブ ノード ネットワークが中断され、オフセットが境界を越えるため、完全なレプリケーションが発生します。

    ネットワーク環境が悪いため、スレーブ ノード ネットワークが中断されます。レプリケーション バックログ バッファ メモリが小さすぎるため、データ オーバーフローが発生します。スレーブ ノード オフセットが境界を越えると、完全レプリケーションが発生します。これにより、完全なコピーが繰り返される可能性があります。

    解決策: レプリケーション バックログ バッファーのサイズを変更します: repl-backlog-size

    設定の提案: マスター ノードがスレーブ ノードに接続する時間をテストし、平均合計を取得します。 1 秒あたりマスター ノードによって生成されるコマンドの数 量 write_size_per_second

    コピー バッファー領域の設定 = 2 * マスター/スレーブ接続時間 * 1 秒あたりマスター ノードによって生成されるデータの合計量

    ##3. 頻繁にネットワークが切断される

    マスターノードのCPU使用率が高すぎるため、またはスレーブノードが頻繁に切断されるため、接続されています。この状況の結果、バッファ、帯域幅、接続などを含む (ただしこれらに限定されない)、マスター ノードのさまざまなリソースが大幅に占有されます。

    マスター ノードのリソースが深刻に占有されているのはなぜですか?

    ハートビート メカニズムでは、スレーブ ノードはコマンド replconf ack コマンドをマスター ノードに毎秒送信します。 スレーブ ノードで低速のクエリが実行され、大量の CPU が占有されました。 マスター ノードがレプリケーション タイミング関数 replicationCron を 1 秒ごとに呼び出しますが、スレーブ ノードは長時間応答しません。

    解決策:

    スレーブ ノードのタイムアウト リリースを設定します

    パラメータを設定します: repl-timeout

    このパラメータのデフォルトは 60 秒です。 60 秒後、スレーブを解放します。

    4. データの不整合の問題

    ネットワーク要因により、複数のスレーブ ノードのデータが不整合になります。この要因を回避する方法はありません。

    この問題には 2 つの解決策があります:

    最初のデータは一貫性が高く、redis サーバーを構成し、読み取りと書き込みの両方に 1 つのサーバーを使用する必要があります。この方法は、少量のデータであり、データには高度な一貫性が必要です。

    2 番目はマスター/スレーブ ノードのオフセットを監視し、スレーブ ノードの遅延が大きすぎる場合、クライアントのスレーブ ノードへのアクセスは一時的にブロックされます。パラメータをslave-serve-stale-data yes|noに設定します。このパラメータが設定されると、info smileof などのいくつかのコマンドにのみ応答できるようになります。

    #5. スレーブ ノードの障害

    #この問題は、クライアント上で利用可能なノードのリストを直接管理します。スレーブ ノード 障害が発生した場合は、他のノードに切り替えて作業します。この問題については、クラスタで後ほど説明します。

    #10. 概要

    この記事では主にマスター/スレーブ レプリケーションとは何か、マスターの 3 つの主要な側面について説明します。 -slave replication: ステージ、ワークフロー、および部分レプリケーションの 3 つのコア コンポーネント。コマンド伝播フェーズ中のハートビート メカニズム。最後に、マスター/スレーブ レプリケーションに関する一般的な問題について説明します。

    この記事を書くのに 2 日かかりました。これは、Kaka が最近書いた最長の記事でもあります。Kaka が今後公開する記事はこのようになるものと予想されます。複数の記事は公開しません1 つの問題については個別に記事で説明しますが、すべてを 1 つの記事で説明します。不完全な知識ポイントや間違った知識ポイントは、カカの知識ポイントが増加するにつれて改善されます。この記事は主にカカレビューの便宜を目的としています。ご質問がある場合は、コメントセクションをご覧ください。

    カカは、誰もがコミュニケーションを取り、一緒に学ぶことができることを望んでいます。何か間違っている場合は、それを指摘してください。気に入らない場合は、批判しないでください。

    学習の継続、ブログの継続、共有の継続は、カカがそのキャリア以来常に支持してきた信念です。巨大なインターネット上のカカの記事があなたに何かをもたらすことを願っています。少しお手伝いします。また次回お会いしましょう。

    推奨: "redis チュートリアル "

    以上がRedis のマスター/スレーブ レプリケーションの原理と一般的な問題の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。