Docker を使用して Redis マスター スレーブ レプリケーション クラスターを構築する

Docker を使用して Redis マスター スレーブ レプリケーション クラスターを構築する

マスタースレーブレプリケーションモードのクラスターでは、通常、1 つのマスターノードと 2 つ以上のスレーブノードが存在します。マスターノードに書き込まれたデータはスレーブノードにコピーされます。このようにして、マスターノードに障害が発生した場合、アプリケーションシステムはスレーブノードに切り替えてデータの読み取りと書き込みを行うことができ、システムの可用性を向上させることができます。さらに、マスタースレーブレプリケーションモードでのデフォルトの読み取り/書き込み分離メカニズムを採用すると、システムのキャッシュ読み取り/書き込みパフォーマンスをさらに向上させることができます。したがって、パフォーマンスとリアルタイム要件が低いシステムの場合、マスター/スレーブ レプリケーション モードは、一般的なパフォーマンスとセキュリティの要件を満たすのに十分です。

1 マスタースレーブレプリケーションモードの概要

実際のアプリケーションでは、対応する設定があれば、Redis サーバーにデータを書き込んだ後、そのデータを別の (または複数の) Redis サーバーにコピーすることができます。ここで、データ ソース サーバーはマスター サーバーと呼ばれ、コピーされたデータが配置されているサーバーはスレーブ サーバーと呼ばれます。

このマスタースレーブレプリケーションモードには、2 つの利点があります。まず、書き込み操作をマスターサーバーに集中させ、読み取り操作をスレーブサーバーに集中させることができるため、読み取りと書き込みのパフォーマンスが向上します。次に、データのバックアップにより、データのセキュリティが向上します。たとえば、マスター Redis サーバーに障害が発生した場合、スレーブサーバーからのデータ読み取りにすばやく切り替えることができます。

プロジェクトで同時実行の要件が高くない場合、または Redis キャッシュからデータを読み取れなくてもパフォーマンスに大きなダメージを与えない場合は、マスタースレーブレプリケーションモードを使用できます。効果図を下の図に示します。

1 つのマスターと複数のスレーブのレプリケーション効果を設定することもできます。次の図は、対応する効果図を示しています。つまり、マスター ノードに書き込まれたデータは、2 つのスレーブ ノードに同期されます。その他の 1 つのマスターと複数のスレーブ モードは、これによく似ています。

マスタースレーブレプリケーションモードに関しては、以下の点に注意してください。

まず、マスター サーバーは 1 つ以上のスレーブ サーバーを持つことができ、スレーブ サーバーも別のスレーブ サーバーを持つことができますが、データをコピーする場合、マスター サーバーのデータはスレーブ サーバーにのみコピーでき、その逆はできません。

2 番目に、スレーブ サーバーは 1 つのマスター サーバーにのみ従うことができ、1 つのスレーブと複数のマスターのモードは不可能です。

3 番目に、Redis 2.8 以降のバージョンでは、非同期レプリケーション モードが使用されます。つまり、マスター スレーブ レプリケーションを実行する場合、マスター サーバー上のデータの読み取りおよび書き込み操作には影響しません。

2 コマンドを使用してマスタースレーブクラスタを構築する

ここでは、Docker コンテナを使用して、マスター 1 台とスレーブ 2 台を含むクラスターを構築します。マスターとスレーブの関係を設定するときは、スレーブ ノードで slaveof コマンドを使用する必要があります。具体的な手順は次のとおりです。

最初のステップは、コマンド ウィンドウを開いて次のコマンドを実行し、redis-master という名前の Redis コンテナーを作成することです。ポートは 6379 であることに注意してください。

docker run -itd --name redis-master -p 6379:6379 redis:latest

2 番目のステップでは、新しいコマンド ウィンドウを開き、次のコマンドを実行して redis-slave1 という名前のコンテナーを作成します。ポートは 6380 であることに注意してください。これは 1 台のコンピューター上で実行されているため、ポート番号を使用してマスター Redis コンテナーを他の 2 つのスレーブ Redis コンテナーと区別することに注意してください。実際のプロジェクトでは、複数の Redis サーバーが異なるサーバーにデプロイされるため、それらすべてにポート 6379 を使用できます。

docker run -itd --name redis-slave1 -p 6380:6380 redis:latest

3 番目の手順は、redis-master コンテナを含むコマンド ウィンドウに戻り、その中で docker inspect redis-master コマンドを実行して、redis-master コンテナの情報を表示することです。コンテナの IP アドレスは、IPAddress 項目から確認できます。ここでは 172.17.0.2 です。実際のプロジェクトでは、Redis サーバーの IP アドレスは固定されており、Docker コンテナによって起動された Redis サーバーの IP アドレスは動的であるため、ここでは上記のコマンドを使用して IP アドレスを取得します。

ステップ 4. redis-master コンテナのコマンド ウィンドウで、docker exec -it redis-master /bin/bash コマンドを実行してコマンド ライン ウィンドウに入ります。redis-cli コマンドを使用して Redis クライアント コマンド ラインに入り、info replication コマンドを使用して現在のマスター/スレーブ モードのステータスを表示します。以下に示すように、いくつかの結果が表示されます。

 c:\work>docker exec -it redis-master /bin/bash
 ルート@9433cd584d80:/data# redis-cli
 127.0.0.1:6379> 情報レプリケーション
 # レプリケーション
 役割:マスター
 接続されたスレーブ:0

5 行目の出力から、マスタースレーブ モードの現在の reids-master コンテナの役割は「マスター サーバー」であることがわかります。6 行目の出力から、マスター サーバーには現在スレーブ サーバーがないことがわかります。

同様に、redis-slave1 コンテナのコマンド ウィンドウで、docker exec -it redis-slave1 /bin/bash コマンドを使用してコンテナのコマンド ライン ウィンドウに入り、redis-cli コマンドを使用してクライアント コマンド ラインに入り、info replication コマンドを使用して Redis サーバーのマスター/スレーブ モードのステータスを表示します。結果の一部を以下に示します。

 c:\work>docker exec -it redis-slave1 /bin/bash
 ルート@2e3237c60211:/data# redis-cli
 127.0.0.1:6379> 情報レプリケーション
 # レプリケーション
 役割:マスター
 接続されたスレーブ:0

現時点ではコマンド ラインでマスター スレーブ モードが設定されていないため、5 行目と 6 行目の出力結果には、現在のサーバーが「マスター サーバー」であり、スレーブ サーバーが存在しないことが示されています。

ステップ 5. redis-slave1 コンテナのコマンド ウィンドウで、次の slaveof コマンドを実行して、現在の Redis サーバーをスレーブ サーバーとして指定します。このコマンドの形式は、slaveof IP アドレス ポート番号であり、172.17.0.2:6379 のマスター サーバーを参照します。

スレーブ 172.17.0.2 6379

コマンドを実行した後、redis-slave1 クライアントで info replication を再度実行すると、以下に示すような結果が表示されます。 3 行目の結果から、redis-slave1 サーバーがスレーブ サーバーになったことがわかり、4 行目と 5 行目の出力から、スレーブ サーバーが 172.17.0.2:6379 の Redis マスター サーバーに従属していることを確認できます。

127.0.0.1:6379> 情報レプリケーション
 # レプリケーション
 役割:スレーブ
 マスターホスト:172.17.0.2
 マスターポート:6379

この時点で、redis-master コンテナのコマンド ウィンドウに戻り、Redis クライアントで info replication コマンドを再度実行して、マスター/スレーブ ステータスを表示します。以下に示すように、いくつかの結果が表示されます。 4 行目の出力から、Redis マスター サーバーにはすでにスレーブ サーバーが存在することがわかります。

 127.0.0.1:6379> 情報レプリケーション
 # レプリケーション
 役割:マスター
 接続スレーブ:1

ステップ 6. 新しいコマンド ウィンドウを開き、次のコマンドを実行して、redis-slave2 という名前の新しい Redis コンテナーを起動します。ポートは 6381 であることに注意してください。

docker run -itd --name redis-slave2 -p 6381:6381 redis:latest

次に、docker exec -it redis-slave2 /bin/bash コマンドを実行してコンテナのコマンドライン ウィンドウに入り、redis-cli コマンドを使用してクライアントに入り、slaveof 172.17.0.2 6379 コマンドを実行して、この Redis サーバーをスレーブ サーバーとして設定し、redis-master コンテナが配置されているマスター Redis サーバーに接続します。

接続が完了したら、redis-master コンテナが配置されているコマンドライン ウィンドウに戻り、info replication コマンドを実行します。次の部分的な出力が表示されます。4 行目の出力から、マスター サーバーが現在 2 つのスレーブ サーバーに接続されていることがわかります。

127.0.0.1:6379> 情報レプリケーション
 # レプリケーション
 役割:マスター
 接続スレーブ:2

ここまでで、マスター 1 台とスレーブ 2 台のマスター スレーブ モードが設定されました。この時点で、2 台のスレーブ サーバーで get name コマンドを実行すると、戻り値は空です。redis-master コンテナーが配置されているコマンド ライン ウィンドウに移動し、その中で set name Peter を実行してから、2 台のスレーブ サーバーで get name コマンドを実行すると、戻り値を確認できます。これは、マスタースレーブモードが正常に構成され、マスターサーバーのデータが各スレーブサーバーに自動的に同期されることを意味します。

3. 構成を通じてマスタースレーブクラスタを構築する

プロジェクトでは、slaveof コマンドを使用してマスタースレーブ クラスターを構築することも、構成パラメータを使用して構築することもできます。具体的な手順は次のとおりです。

最初のステップは、メイン サーバー redis-master のコマンドを構築することです。次のコマンドは引き続き使用され、ポート 6379 は引き続きここで使用されます。

docker run -itd --name redis-master -p 6379:6379 redis:latest

docker inspect redis-master コマンドを使用して、Redis サーバーが配置されているコンテナの IP アドレスがまだ 172.17.0.2 であることを確認します。

2 番目の手順は、C:\work\redis\redisConf ディレクトリに移動し、構成ファイル redisSlave1.conf を作成し、そこに次の内容を記述することです。

ポート 6380

スレーブ 172.17.0.2 6379

1 行目のコマンドを使用して、Redis ポートを 6380 に設定します。2 行目の slaveof 構成を使用して、Redis サーバーを「スレーブ モード」に設定し、redis-master が配置されているマスター サーバーに接続します。

3 番目の手順では、新しいコマンド ウィンドウで次のコマンドを実行して、redids-slave1 という名前の Redis サーバーを作成します。サーバーの動作ポートは 6380 であり、redis-server の後のパラメータは、Redis サーバーの起動時に redisSlave1.conf 構成ファイルをロードすることを指定します。

docker run -itd --name redis-slave1 -v C:\work\redis\redisConf:/redisConfig:rw -p 6380:6380 redis:latest redis-server /redisConfig/redisSlave1.conf

次に、docker exec -it redis-slave1 /bin/bash コマンドを使用して、コンテナのコマンドラインに入ります。ここでの Redis の動作ポートは 6380 になっているため、redis-cli -h 127.0.0.1 -p 6380 コマンドを使用して Redis クライアントに入る必要があります。その中で info replication コマンドを実行すると、次の部分的な結果が表示され、redis-slave1 サーバーが redis-master サーバーの配下であることがさらに確認できます。

 ルート@80e7ae14a322:/data# redis-cli -h 127.0.0.1 -p 6380
 127.0.0.1:6380> 情報レプリケーション
 # レプリケーション
 役割:スレーブ
 マスターホスト:172.17.0.2
 マスターポート:6379

ステップ 4. C:\work\redis\redisConf ディレクトリに移動し、設定ファイル redisSlave2.conf を作成し、次の内容を記述します。

ポート 6381

スレーブ 172.17.0.2 6379

ここではポート 6381 が使用され、redis-master サーバーに接続するために slaveof コマンドも使用されます。次に、新しいコマンド ウィンドウで次のコマンドを実行して、redids-slave2 という名前の Redis サーバーを作成します。サーバーの動作ポートは 6381 であり、redis-server の後のパラメータは、Redis サーバーの起動時に redisSlave2.conf 構成ファイルがロードされることを指定するために使用されます。

docker run -itd --name redis-slave2 -v C:\work\redis\redisConf:/redisConfig:rw -p 6381:6381 redis:latest redis-server /redisConfig/redisSlave2.conf

次に、docker exec -it redis-slave2 /bin/bash コマンドを使用して、コンテナのコマンドラインに入ります。Redis の動作ポートは 6381 になったため、redis-cli -h 127.0.0.1 -p 6381 コマンドを使用して Redis クライアントに入る必要があります。ここで、info replication コマンドを使用して、構成の効果を確認できます。実行結果の一部を以下に示します。

ルート@6017108b97c4:/data# redis-cli -h 127.0.0.1 -p 6381
 127.0.0.1:6381> 情報レプリケーション
 # レプリケーション
 役割:スレーブ
 マスターホスト:172.17.0.2
 マスターポート:6379

ここまでで、設定ファイルを使用したマスタースレーブレプリケーションクラスタの設定が完了しました。このとき、マスターサーバー redis-master が配置されているクライアントで set age 18 コマンドを実行し、次に 2 つのスレーブサーバー redis-slave1 と redis-slave2 で get age コマンドを実行すると、age の値が表示され、マスターサーバーとスレーブサーバー間でデータが同期できることを改めて確認できます。

4 読み取りと書き込みの分離効果の設定

上記で設定した 2 つのスレーブ サーバー redis-slave1 と redis-slave2 で info replication コマンドを実行すると、"slave_read_only:1" という設定も確認できます。これは、スレーブ サーバーがデフォルトで "読み取り専用" であることを意味します。redis-slave1 の Redis クライアント コマンド ラインに set val 1 と入力すると、以下の 2 行目に示すエラーが表示され、Redis サーバーの "読み取り専用" 属性をさらに確認できます。

127.0.0.1:6380> 値1を設定

(エラー) READONLY 読み取り専用レプリカに対しては書き込むことはできません。

Redis スレーブ サーバーの場合、プロジェクトでは通常、データ同期先としての「スレーブ サーバー」にデータが書き込まれないため、デフォルトの「読み取り専用」構成を使用することをお勧めします。業務上どうしても必要な場合は、以下の手順で「読み書き可能」効果を設定できます。

最初のステップは、上記の redisSlave2.conf 構成ファイルに「slave-read-only no」構成の行を追加して、サーバーが読み取りおよび書き込み可能であることを指定することです。

2 番目のステップでは、上記の redis-slave2 コンテナがまだアクティブな場合は、docker stop redis-slave2 でコンテナを停止し、docker rm redis-slave2 コマンドでコンテナを削除する必要があります。その後、次のコマンドで redis-slave2 コンテナを再度作成できます。

docker run -itd --name redis-slave2 -v C:\work\redis\redisConf:/redisConfig:rw -p 6381:6381 redis:latest redis-server /redisConfig/redisSlave2.conf

redis-server コマンドに続く redisSlave2.conf 構成ファイルでは、「slave-read-only no」構成項目を使用して、「読み取り可能および書き込み可能」モードが設定されています。

3番目のステップでは、docker exec -it redis-slave2 /bin/bashコマンドを使用してコンテナのコマンドラインに入り、redis-cli -h 127.0.0.1 -p 6381コマンドを使用してRedisクライアントに入ります。このとき、set val 1コマンドを再度実行すると、データを正常に書き込むことができます。

5. ハートビートメカニズムを使用してマスタースレーブレプリケーションの信頼性を向上させる

Redis マスタースレーブ レプリケーション モードでは、マスター サーバーとスレーブ サーバーの間でデータが同期されている場合、スレーブ サーバーはデフォルトで 1 秒に 1 回、マスター サーバーに REPLCONF ACK コマンドを送信して、両者間の接続がスムーズであることを確認します。接続を確実にするために定期的に対話型コマンドを送信するこのメカニズムは、「ハートビート」メカニズムと呼ばれます。上記で開いた redis-master マスター サーバーのコマンド ラインで、info replication コマンドを実行すると、スレーブ サーバーの「ハートビート」ステータスを確認できます。

 127.0.0.1:6379> 情報レプリケーション
 2 # レプリケーション
 3 役割:マスター
 4 つの接続スレーブ:2
 5 スレーブ0:ip=172.17.0.3、ポート=6380、状態=オンライン、オフセット=16185、ラグ=1
 6 スレーブ1:ip=172.17.0.4、ポート=6381、状態=オンライン、オフセット=16185、ラグ=1

5 行目と 6 行目では、スレーブ サーバーが REPLCONF ACK コマンドを送信するのにかかる時間がラグ (1 秒) で表されており、2 つのスレーブ サーバーとマスター サーバー間の接続がスムーズであることを示しています。

ここで、スレーブ サーバーがダウンすると、マスター スレーブ レプリケーションは無意味になることが想像できます。このため、次の手順を使用して、ハートビート メカニズムをアクティブなレプリケーション アクションに関連付けることができます。

最初のステップは、C:\work\redis\redisConf ディレクトリに新しい redisMaster.conf ファイルを作成し、そこに次のコードを記述することです。

書き込み可能なスレーブの最小数 2

最小スレーブ最大ラグ 15

最初の行のパラメータは、マスター スレーブ レプリケーションを実装するために必要なスレーブ サーバーの最小数が 2 であることを示しています。2 行目のパラメータは、最初の行のパラメータで指定されたスレーブ サーバーの数 (ここでは 2) のハートビート遅延 (つまり、ラグ値) が 15 秒を超える場合、マスター スレーブ レプリケーションは実行されないことを示しています。

これら 2 つの条件は「または」関係にあります。つまり、スレーブ サーバーの数が 2 未満であるか、2 つのスレーブ サーバー間のハートビート遅延が 15 秒を超える限り、マスター サーバーはマスター スレーブ レプリケーション操作を停止します。

2 番目のステップでは、次のコマンドで redis-master コンテナを起動します。この時点で Redis サーバーの起動時に上記の設定が読み込まれているため、Redis マスター サーバーはマスター スレーブ レプリケーションを実行するときに、最初のステップで設定した条件を検出します。これにより、マスター スレーブ レプリケーションの信頼性が向上します。

docker run -itd --name redis-master -v C:\work\redis\redisConf:/redisConfig:rw -p 6379:6379 redis:latest redis-server /redisConfig/redisMaster.conf

6 オフセットを使用してデータの一貫性をチェックする

上記で開いた redis-master マスター サーバーのコマンド ラインで、info replication コマンドを実行すると、以下の 6 行目に示すように、複製されたデータのオフセットを表す master_repl_offset データも表示されます。ここでのデータは 276 で、マスター サーバーからスレーブ サーバーに送信されたデータのバイト数を示します。

127.0.0.1:6379> 情報レプリケーション
 # レプリケーション
 役割:マスター
 接続スレーブ:1
 …
 マスター_repl_オフセット:276

同様に、redis-slave1 スレーブ サーバーのコマンド ラインにアクセスすると、以下の 7 行目に示すように、info replication を通じてオフセットを表示することもできます。

127.0.0.1:6380> 情報レプリケーション
 # レプリケーション
 役割:スレーブ
 マスターホスト:172.17.0.2
 マスターポート:6379
 …
 スレーブ_repl_オフセット:276

スレーブ サーバーでは、このデータはマスター サーバーから受信したデータ バイト数を示します。マスター サーバーとスレーブ サーバーのデータが一致している場合、マスター サーバーとスレーブ サーバー間のデータが同期されていることを意味します。

マスターサーバー redis-master で set nextVal 1 コマンドを実行し、info replication を使用して master_repl_offset 値を表示すると、変更があることがわかります。このとき、redis-slave1 スレーブサーバーで info replication コマンドを実行すると、スレーブサーバーの master_repl_offset 値がマスターサーバーの値と一致していることがわかります。これは、set nextVal 1 コマンドを使用してマスターサーバーに追加されたデータがスレーブサーバーに正常に同期されたことを示しています。つまり、Redis に問題が発生した場合、master_repl_offset 値を使用して同期されたデータが正しいかどうかを確認し、さらに問題のトラブルシューティングを行うことができます。

要約する

これで、Docker を使用して Redis マスター スレーブ レプリケーション クラスターを構築する方法についての記事は終了です。Docker を使用して Redis マスター スレーブ レプリケーション クラスターを構築する方法の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • redisクラスタを構築するためのdockerの環境構築を詳しく解説
  • docker ベースの redis-sentinel クラスターの構築例
  • Docker ベースの Redis クラスターの構築方法
  • 5分でDockerを使ってRedisのクラスターモードとセンチネルモードを構築する方法を教えます
  • Docker 上で Redis クラスターを構築する
  • Docker ベースの Redis マスタースレーブ クラスタの実装
  • Docker 経由で Redis 6.x クラスターをデプロイする方法
  • Docker-swarmを使用してRedisクラスターを素早く構築する方法

<<:  vue ルーティング ビュー router-view のネストされたジャンプの実装

>>:  MySql への新しいユーザーの追加、ユーザー用のデータベースの作成、ユーザーへの権限の割り当ての概要

推薦する

ホバープロンプトにはvue2+elementuiを使用する

Vue2+elementui のホバー プロンプトは、外部と内部に分かれています。内部のものは el...

Linuxでファイルを削除してもスペースが解放されない問題の対処方法

問題の背景業務システムのサーバ監視システムからディスク使用率が90%に達したという早期警告通知が来た...

MySQLのロック機構に関する最も包括的な説明

目次序文グローバルロック完全なデータベース論理バックアップFTWRL と set global re...

MySQL ルートパスワードを変更する複数の方法 (推奨)

方法1: SET PASSWORDコマンドを使用する MySQL -u ルート mysql> ...

Nginx 仮想ホスト (IP ベース) を構成する 3 つの方法の詳細な説明

Nginx は、IP ベースの仮想ホスト構成、ポート ベースの仮想ホスト構成、ドメイン名ベースの仮想...

Windows での Apache+Tomcat7 負荷分散構成方法の詳細な説明

準備Windows Server 2008 R2 Enterprise (2.40GH、8GB、64...

Vueはボールのスライディングクロス効果を実現します

この記事の例では、ボールのスライドとクロスの効果を実現するためのVueの具体的なコードを共有していま...

React サーバーサイドレンダリング原則の分析と実践

ほとんどの人は、サーバーサイド レンダリング (SSR と呼んでいます) の概念について聞いたことが...

nginxの基礎を学ぶ

目次1. nginx とは何ですか? 2. nginx で何ができるのか? 2.1 フォワードプロキ...

nginx-ingress-controller ログ永続化ソリューションのソリューション

最近、nginx-ingress-controller のアプリケーションについて説明した公開アカウ...

MYSQLは継続サインイン機能を実装しており、サインイン後1日経過すると最初から開始します(SQL文)

1. テストテーブルを作成する テーブル `testsign` を作成します ( `userid`...

Linux システム ディレクトリ sys、tmp、usr、var の詳細な説明。

Linux 初心者から Linux マスターへの成長の道: Linux システム ディレクトリ s...

Navicat がデータベース データ構造をインポートする際に発生するエラー datetime(0) の SQL レポートの問題を解決します。

エラー発生: MySQL 5.7 から SQL にデータベースをエクスポートし、それを MySQL ...

操作例 MySQL ショートリンク

MySQL ショートリンクの設定方法1. mysql 接続番号ステートメントコマンドを確認します。 ...

Promiseの紹介と基本的な使い方の簡単な分析

Promise は、ES6 で導入された非同期プログラミングのための新しいソリューションです。 Pr...