元のテキストのアドレスが更新され、読書効果が向上しました。
マスター/スレーブ アーキテクチャを構築する
シングルノード Redis の同時実行能力には上限があり、Redis の同時実行能力をさらに向上させるには、マスター/スレーブ クラスターを構築して読み取りと書き込みの分離を実現する必要があります。
Redis 5.0 より前では、スレーブ ノードはスレーブと呼ばれていましたが、バージョン 5.0 以降ではレプリカと呼ばれていましたが、これらは本質的には同じものです。
# 1. クラスター構造
私たちが構築したマスター/スレーブ クラスター構造を次の図に示します。
1 つのマスター ノードと 2 つのスレーブ ノードの合計 3 つのノードがあります。
ここでは、同じ仮想マシン内で 3 つの Redis インスタンスを開いて、マスター/スレーブ クラスターをシミュレートします。
IP | ポート | 役割 |
---|---|---|
192.168.150.101 | 7001 | マスター |
192.168.150.101 | 7002 | 奴隷 |
192.168.150.101 | 7003 | 奴隷 |
# 2. インスタンスと構成を準備する
同じ仮想マシン上で 3 つのインスタンスを起動するには、3 つの異なる設定ファイルとディレクトリを用意する必要があり、設定ファイルが配置されているディレクトリは作業ディレクトリでもあります。
- ディレクトリを作成する
7001、7002、7003 という名前の 3 つのフォルダーを作成します。
<span style="color:#2c3e50"><code><span style="color:#a0a1a7"><em># 进入/tmp目录</em></span>
<span style="color:#50a14f">cd</span> /tmp
<span style="color:#a0a1a7"><em># 创建目录</em></span>
<span style="color:#4078f2">mkdir</span> <span style="color:#b76b01">7001</span> <span style="color:#b76b01">7002</span> <span style="color:#b76b01">7003</span>
</code></span>
- 元の構成を復元する
redis-6.2.4/redis.conf ファイルを変更し、永続モードをデフォルトの RDB モードに変更し、AOF をオフのままにします。
<span style="color:#2c3e50"><code><span style="color:#a0a1a7"><em># 开启RDB</em></span>
<span style="color:#a0a1a7"><em># save ""</em></span>
<span style="color:#b76b01">save</span> <span style="color:#50a14f">3600 1</span>
<span style="color:#b76b01">save</span> <span style="color:#50a14f">300 100</span>
<span style="color:#b76b01">save</span> <span style="color:#50a14f">60 10000</span>
<span style="color:#a0a1a7"><em># 关闭AOF</em></span>
<span style="color:#b76b01">appendonly</span> <span style="color:#50a14f">no</span>
</code></span>
- 構成ファイルを各インスタンス ディレクトリにコピーする
次に、redis-6.2.4/redis.conf ファイルを 3 つのディレクトリにコピーします (/tmp ディレクトリで次のコマンドを実行します)。
<span style="color:#2c3e50"><code><span style="color:#a0a1a7"><em># 方式一:逐个拷贝</em></span>
<span style="color:#4078f2">cp</span> redis-6.2.4/redis.conf <span style="color:#b76b01">7001</span>
<span style="color:#4078f2">cp</span> redis-6.2.4/redis.conf <span style="color:#b76b01">7002</span>
<span style="color:#4078f2">cp</span> redis-6.2.4/redis.conf <span style="color:#b76b01">7003</span>
<span style="color:#a0a1a7"><em># 方式二:管道组合命令,一键拷贝</em></span>
<span style="color:#50a14f">echo</span> <span style="color:#b76b01">7001</span> <span style="color:#b76b01">7002</span> <span style="color:#b76b01">7003</span> <span style="color:#4078f2">|</span> <span style="color:#4078f2">xargs</span> <span style="color:#4078f2">-t</span> <span style="color:#4078f2">-n</span> <span style="color:#b76b01">1</span> <span style="color:#4078f2">cp</span> redis-6.2.4/redis.conf
</code></span>
- 各インスタンスのポートと作業ディレクトリを変更します。
各フォルダー内の構成ファイルを変更し、ポートをそれぞれ 7001、7002、および 7003 に変更し、rdb ファイルの保存場所を独自のディレクトリに変更します (/tmp ディレクトリで次のコマンドを実行します)。
<span style="color:#2c3e50"><code><span style="color:#4078f2">sed</span> <span style="color:#4078f2">-i</span> <span style="color:#4078f2">-e</span> <span style="color:#50a14f">'s/6379/7001/g'</span> <span style="color:#4078f2">-e</span> <span style="color:#50a14f">'s/dir .\//dir \/tmp\/7001\//g'</span> <span style="color:#b76b01">7001</span>/redis.conf
<span style="color:#4078f2">sed</span> <span style="color:#4078f2">-i</span> <span style="color:#4078f2">-e</span> <span style="color:#50a14f">'s/6379/7002/g'</span> <span style="color:#4078f2">-e</span> <span style="color:#50a14f">'s/dir .\//dir \/tmp\/7002\//g'</span> <span style="color:#b76b01">7002</span>/redis.conf
<span style="color:#4078f2">sed</span> <span style="color:#4078f2">-i</span> <span style="color:#4078f2">-e</span> <span style="color:#50a14f">'s/6379/7003/g'</span> <span style="color:#4078f2">-e</span> <span style="color:#50a14f">'s/dir .\//dir \/tmp\/7003\//g'</span> <span style="color:#b76b01">7003</span>/redis.conf
</code></span>
- 各インスタンスの宣言された IP を変更する
仮想マシン自体には複数の IP があります。将来の混乱を避けるために、redis.conf ファイルで各インスタンスのバインド IP 情報を指定する必要があります。形式は次のとおりです。
<span style="color:#2c3e50"><code><span style="color:#a0a1a7"><em># redis实例的声明 IP</em></span>
<span style="color:#b76b01">replica-announce-ip</span> <span style="color:#50a14f">192.168.150.101</span>
</code></span>
各ディレクトリを変更する必要がありますが、ワンクリックで変更を完了できます (/tmp ディレクトリで次のコマンドを実行します)。
<span style="color:#2c3e50"><code><span style="color:#a0a1a7"><em># 逐一执行</em></span>
<span style="color:#4078f2">sed</span> <span style="color:#4078f2">-i</span> <span style="color:#50a14f">'1a replica-announce-ip 192.168.150.101'</span> <span style="color:#b76b01">7001</span>/redis.conf
<span style="color:#4078f2">sed</span> <span style="color:#4078f2">-i</span> <span style="color:#50a14f">'1a replica-announce-ip 192.168.150.101'</span> <span style="color:#b76b01">7002</span>/redis.conf
<span style="color:#4078f2">sed</span> <span style="color:#4078f2">-i</span> <span style="color:#50a14f">'1a replica-announce-ip 192.168.150.101'</span> <span style="color:#b76b01">7003</span>/redis.conf
<span style="color:#a0a1a7"><em># 或者一键修改</em></span>
<span style="color:#50a14f">printf</span> <span style="color:#50a14f">'%s\n'</span> <span style="color:#b76b01">7001</span> <span style="color:#b76b01">7002</span> <span style="color:#b76b01">7003</span> <span style="color:#4078f2">|</span> <span style="color:#4078f2">xargs</span> -I<span style="color:#383a42">{</span><span style="color:#383a42">}</span> <span style="color:#4078f2">-t</span> <span style="color:#4078f2">sed</span> <span style="color:#4078f2">-i</span> <span style="color:#50a14f">'1a replica-announce-ip 192.168.150.101'</span> <span style="color:#383a42">{</span><span style="color:#383a42">}</span>/redis.conf
</code></span>
# 3. スタート
ログを簡単に表示するために、3 つの SSH ウィンドウを開き、それぞれ 3 つの Redis インスタンスを起動して、コマンドを開始します。
<span style="color:#2c3e50"><code><span style="color:#a0a1a7"><em># 第1个</em></span>
redis-server <span style="color:#b76b01">7001</span>/redis.conf
<span style="color:#a0a1a7"><em># 第2个</em></span>
redis-server <span style="color:#b76b01">7002</span>/redis.conf
<span style="color:#a0a1a7"><em># 第3个</em></span>
redis-server <span style="color:#b76b01">7003</span>/redis.conf
</code></span>
1 つのキーで停止したい場合は、次のコマンドを実行できます。
<span style="color:#2c3e50"><code><span style="color:#50a14f">printf</span> <span style="color:#50a14f">'%s\n'</span> <span style="color:#b76b01">7001</span> <span style="color:#b76b01">7002</span> <span style="color:#b76b01">7003</span> <span style="color:#4078f2">|</span> <span style="color:#4078f2">xargs</span> -I<span style="color:#383a42">{</span><span style="color:#383a42">}</span> <span style="color:#4078f2">-t</span> redis-cli <span style="color:#4078f2">-p</span> <span style="color:#383a42">{</span><span style="color:#383a42">}</span> <span style="color:#4078f2">shutdown</span>
</code></span>
# 4. 主従関係を開く
これで、3 つのインスタンスは互いに関係がなく、マスター/スレーブを構成するには、replicaof または smileof (5.0 より前) コマンドを使用できます。
一時モードと永続モードの 2 つのモードがあります。
-
構成ファイルを変更します(永続的)
- redis.conf に構成の行を追加します。
slaveof <masterip> <masterport>
- redis.conf に構成の行を追加します。
-
redis-cli クライアントを使用して redis サービスに接続し、slaveof コマンドを実行します (再起動後に失敗します)。
slaveof <masterip> <masterport>
注意: コマンドreplicaofは5.0以降に追加されており、salveofと同じ効果があります。
ここでは、デモンストレーションの便宜上、2 番目の方法を使用します。
redis-cli コマンドを使用して 7002 に接続し、次のコマンドを実行します。
<span style="color:#2c3e50"><code><span style="color:#a0a1a7"><em># 连接 7002</em></span>
redis-cli <span style="color:#4078f2">-p</span> <span style="color:#b76b01">7002</span>
<span style="color:#a0a1a7"><em># 执行slaveof</em></span>
slaveof <span style="color:#b76b01">192.168</span>.150.101 <span style="color:#b76b01">7001</span>
</code></span>
redis-cli コマンドを使用して 7003 に接続し、次のコマンドを実行します。
<span style="color:#2c3e50"><code><span style="color:#a0a1a7"><em># 连接 7003</em></span>
redis-cli <span style="color:#4078f2">-p</span> <span style="color:#b76b01">7003</span>
<span style="color:#a0a1a7"><em># 执行slaveof</em></span>
slaveof <span style="color:#b76b01">192.168</span>.150.101 <span style="color:#b76b01">7001</span>
</code></span>
次に、ノード 7001 に接続してクラスターのステータスを表示します。
<span style="color:#2c3e50"><code><span style="color:#a0a1a7"><em># 连接 7001</em></span>
redis-cli <span style="color:#4078f2">-p</span> <span style="color:#b76b01">7001</span>
<span style="color:#a0a1a7"><em># 查看状态</em></span>
info replication
</code></span>
# 5. テスト
テストするには次の手順を実行します。
-
redis-cli を使用して 7001 に接続し、実行します
set num 123
-
redis-cli を使用して 7002 に接続し、 を
get num
実行してから、set num 666
-
redis-cli を使用して 7003 に接続し、 を
get num
実行してから、set num 888
マスタノード7001のみが書き込み動作を実行でき、2つのスレーブノード7002および7003は読み取り動作のみを実行できることがわかる。
#データ同期原理
#完全同期
最初のマスター/スレーブ同期は完全同期です。
マスターはスレーブが初めてデータを同期しているかどうかをどのように判断しますか? ここでは 2 つの重要な概念が使用されています。
-
レプリケーション ID: Replid は略してデータ セットのマークであり、ID が一致していれば、それが同じデータ セットであることを意味します。各マスターには置き換えられた replid があり、スレーブはマスター ノードの replid を継承します。
-
オフセット: オフセット。repl_baklog に記録されるデータが増加するにつれて徐々に増加します。スレーブは同期を完了すると、現在の同期オフセットも記録します。スレーブのオフセットがマスターのオフセットより小さい場合、スレーブ データがマスターより遅れているため、更新する必要があることを意味します。
したがって、スレーブがデータ同期を実行するときは、マスターがどのデータを同期する必要があるかを判断できるように、独自のレプリケーション ID とオフセットをマスターに宣言する必要があります。
まずレプリケーションIDが同じかどうかを判断し、次にオフセットの大小関係を判断します。
完全な同期プロセス
- スレーブノードは増分同期を要求します
- マスターノードはReplidを判断し、不一致を見つけて増分同期を拒否します。
- マスターは完全なメモリデータを含む RDB を生成し、RDB をスレーブに送信します
- スレーブはローカルデータをクリアし、マスターのRDBをロードします。
- マスターは、RDB 期間中のコマンドを repl_baklog に記録し、ログ内のコマンドを継続的にスレーブに送信します。
- スレーブは受け付けられたコマンドを受信し、マスターとの同期を維持します。
#増分同期
最初のマスターとスレーブの同期は完全同期ですが、スレーブが事後同期をフラッシュすると、増分同期が実行されます。
知らせ
repl_baklog のサイズには上限があり、いっぱいになると古いデータから上書きされます。スレーブが長時間切断され、データが上書きされた場合、増分同期は達成できず、完全同期のみを再度実行できます。
Redis マスター/スレーブ クラスターは、次の側面から最適化できます。
- マスターで repl_diskless-sync yes を構成すると、ディスクレス レプリケーションが有効になり、完全同期中のディスク IO が回避されます。一般に、ネットワーク帯域幅が大きい場合に適用できます。
- RDB によって引き起こされる過剰なディスク IO を削減するには、Redis 単一ノードのメモリ使用量が大きすぎないようにする必要があります。
- repl_baklog のサイズを適切に増やし、スレーブダウン時にできるだけ早く障害回復を実現し、完全同期を可能な限り回避します。
- マスター上のスレーブ ノードの数を制限します。スレーブが多すぎる場合は、マスター-スレーブ-スレーブ チェーン構造を使用してマスターへの負担を軽減できます。
#まとめ_
完全同期と増分同期の違いを簡単に説明してください。
- 完全同期: マスターは完全なメモリ データを含む RDB を生成し、その RDB をスレーブに送信します。後続のコマンドは repl_baklog に記録され、1 つずつスレーブに送信されます。
- インクリメンタル同期: スレーブは独自のオフセットをマスターに送信し、マスターは repl_baklog 内のオフセットの後のコマンドをスレーブに取得します。
完全同期をいつ実行するか?
- スレーブノードが初めてマスターノードに接続するとき。
- スレーブ ノードが長時間切断されていたため、repl_baklog のオフセットが上書きされました
増分同期はいつ実行されますか?
- スレーブ ノードが切断されて復元されたとき、オフセットは repl_baklog で確認できます。