5分でDockerを使ってRedisのクラスターモードとセンチネルモードを構築する方法を教えます

5分でDockerを使ってRedisのクラスターモードとセンチネルモードを構築する方法を教えます

開発環境とテスト環境にそれぞれセンチネルとクラスター モードの Redis を設定するように求められた場合、最速でどのくらいの時間がかかりますか? おそらく 1 日かかるでしょうか? 2時間?実のところ、もっと短くすることもできます。 はい、ご想像のとおり、Docker を使用したデプロイには実際には 12 分しかかかりません。

1. 準備

Redisイメージを取得する

次のコマンドを実行します。

docker pull redis

このコマンドで取得されるイメージは公式イメージです。もちろん、他のイメージを検索することもできます。ここではイメージの状況については詳しく説明しません。

2. Redis Sentinel マスタースレーブモードをデプロイする

セントリーモードとは何ですか? --百度をお願いします

1. Docker Compose とは何ですか?

Docker Compose は、複数のコンテナを実行する方法と構成を強化するものとして理解できます。

最も単純な例を挙げると、アプリケーション コンテナ用に MySQL コンテナと Redis コンテナを準備する場合、起動のたびに、まず MySQL コンテナと Redis コンテナを起動し、次にアプリケーション コンテナを実行する必要があります。アプリケーション コンテナを作成するときは、アプリケーションが接続してデータを交換できるように、コンテナ ネットワークを MySQL コンテナと Redis コンテナに接続することを忘れないでください。

これだけじゃ十分ではありません。コンテナにさまざまな設定を行った場合は、次回直接使用できるように、コンテナの作成と設定のコマンドを保存しておく方がよいでしょう。

このような状況に対応するために、私たちの開発で最もよく使われるマルチコンテナ定義・実行ソフトウェア、つまり Docker Compose を導入する必要があります。

2. reids master-slave docker-compose.yml を書く

バージョン: '3.7'
サービス:
  マスター:
    画像: redis
    コンテナ名: redis-master
    再起動: 常に
    コマンド: redis-server --requirepass redispwd --appendonly yes
    ポート:
      -6379:6379
    ボリューム:
      - ./data1:/データ
  スレーブ1:
    画像: redis
    コンテナ名: redis-slave-1
    再起動: 常に
    コマンド: redis-server --slaveof redis-master 6379 --requirepass redispwd --masterauth redispwd --appendonly yes
    ポート:
      -6380:6379
    ボリューム:
      - ./data2:/データ
  スレーブ2:
    画像: redis
    コンテナ名: redis-slave-2
    再起動: 常に
    コマンド: redis-server --slaveof redis-master 6379 --requirepass redispwd --masterauth redispwd --appendonly yes
    ポート:
      -6381:6379
    ボリューム:
      - ./data3:/データ

用語集:

3. マスタースレーブRedisを起動する

redis に対応する docker-compose.yml のディレクトリに入り、次のコマンドを実行します。

docker-compose を起動 -d

-d はバックグラウンドで実行することを意味します。起動結果を表示するには、docker ps コマンドを使用します。


操作が成功したことを示すスクリーンショットが表示されます

4. Sentinel docker-compose.yml を書く

バージョン: '3.7'
サービス:
  センチネル1:
    画像: redis
    コンテナ名: redis-sentinel-1
    再起動: 常に
    ポート:
      -26379:26379
    コマンド: redis-sentinel /usr/local/etc/redis/sentinel.conf
    ボリューム:
      - ./sentinel1.conf:/usr/local/etc/redis/sentinel.conf
  センチネル2:
    画像: redis
    コンテナ名: redis-sentinel-2
    再起動: 常に
    ポート:
    -26380:26379
    コマンド: redis-sentinel /usr/local/etc/redis/sentinel.conf
    ボリューム:
      - ./sentinel2.conf:/usr/local/etc/redis/sentinel.conf
  センチネル3:
    画像: redis
    コンテナ名: redis-sentinel-3
    ポート:
      -26381:26379
    コマンド: redis-sentinel /usr/local/etc/redis/sentinel.conf
    ボリューム:
      - ./sentinel3.conf:/usr/local/etc/redis/sentinel.conf
ネットワーク:
  デフォルト:
    外部の:
      名前: redis_default

5. sentinel.confを書く

# クラスター名をカスタマイズします。172.19.0.3 は redis-master の IP アドレス、6379 は redis-master のポート番号、2 は最小投票数です (Sentinel が 3 つあるため、2 に設定できます)
ポート 26379
ディレクトリ /tmp
センチネルモニター mymaster 172.19.0.3 6379 2
センチネル ダウン後 ミリ秒 mymaster 30000
センチネル並列同期 mymaster 1
センチネル認証パス mymaster 再表示
センチネルフェイルオーバータイムアウト mymaster 180000
センチネル拒否スクリプト再構成はい

上記のファイルを3つにコピーし、docker-compose.ymlの設定ファイルに対応するようにsentinel1.conf、sentinel2.conf、sentinel3.confという名前を付け、Sentinelのdocker-compose.ymlと同じディレクトリに配置します。

6. Sentinelを起動する

センチネル docker-compose.yml が配置されているディレクトリに移動し、次のコマンドを実行します。

docker-compose を起動 -d

コンテナを確認すると、Sentinel とマスタースレーブ Redis が起動していることがわかります。

6.1 Sentinel 起動ログ


上記のログからわかるように、Sentinelはマスターノードとスレーブノードを監視します。

6.2 マスターノードをシャットダウンする

次のコマンドでRedisマスターノードを停止します。

docker stop redis-master 


上記のログから、sdown、odown がわかりますが、これらは何を意味するのでしょうか?
Sdown は主観的なダウンタイムです。センチネルがマスターがダウンしていると判断した場合、それは主観的なダウンタイムです。
odown は客観的なダウンタイムです。センチネルのクォーラムがマスターがクラッシュしたと判断した場合、それは客観的なダウンタイムとなり、選出が始まります。ログから、2 つのセンチネルが同じスレーブ ノードを選択したことがわかります。この時点で、設定した最小投票数が満たされ、このスレーブが新しい​​マスターとして選択されます。

6.3 マスターノードを再起動する


上記のログは、Sentinel が元のマスターが再起動したことを検出し、元のマスター ノードを新しいマスターのスレーブ ノードに変更したことを示しています。

3. Redis クラスターモードをデプロイする

1. ディレクトリとファイルを作成する

├── docker-compose.yml
├── レディス-6371
│ ├── 会議
│ │ └── redis.conf
│ └── データ
├── レディス-6372
│ ├── 会議
│ │ └── redis.conf
│ └── データ
├── レディス-6373
│ ├── 会議
│ │ └── redis.conf
│ └── データ
├── レディス-6374
│ ├── 会議
│ │ └── redis.conf
│ └── データ
├── レディス-6375
│ ├── 会議
│ │ └── redis.conf
│ └── データ
└── レディス-6376
    ├── 会議
    │ └── redis.conf
    └── データ

2. redis.conf 設定ファイル

ポート 6371
クラスタ対応 はい
クラスター構成ファイル nodes-6371.conf
クラスターノードタイムアウト 5000
追加のみ はい
保護モードなし
要求パス 1234
マスター認証 1234
cluster-announce-ip 10.12.12.10 # これはホストIPです
クラスターアナウンスポート 6371
クラスターアナウンスバスポート 16371

各ノードの構成では、ポートを変更するだけです。

3. Docker-compose 設定ファイル

バージョン: "3"

# サービスを定義します。複数のサービスを持つことができます。
  redis-6371: # サービス名image: redis # コンテナを作成するときに必要なイメージcontainer_name: redis-6371 # コンテナ名restart: always # コンテナは常に再起動しますvolumes: # データボリューム、ディレクトリ mount- ./redis-6371/conf/redis.conf:/usr/local/etc/redis/redis.conf
      - ./redis-6371/データ:/データ
    ポート:
      -6371:6371
      -16371:16371
    指示:
      redis-server /usr/local/etc/redis/redis.conf

  redis-6372:
    画像: redis
    コンテナ名: redis-6372
    ボリューム:
      - ./redis-6372/conf/redis.conf:/usr/local/etc/redis/redis.conf
      - ./redis-6372/データ:/データ
    ポート:
      -6372:6372
      - 16372:16372
    指示:
      redis-server /usr/local/etc/redis/redis.conf

  redis-6373:
    画像: redis
    コンテナ名: redis-6373
    ボリューム:
      - ./redis-6373/conf/redis.conf:/usr/local/etc/redis/redis.conf
      - ./redis-6373/データ:/データ
    ポート:
      -6373:6373
      -16373:16373
    指示:
      redis-server /usr/local/etc/redis/redis.conf
      
  redis-6374:
    画像: redis
    コンテナ名: redis-6374
    再起動: 常に
    ボリューム:
      - ./redis-6374/conf/redis.conf:/usr/local/etc/redis/redis.conf
      - ./redis-6374/データ:/データ
    ポート:
      -6374:6374
      -16374:16374
    指示:
      redis-server /usr/local/etc/redis/redis.conf

  redis-6375:
    画像: redis
    コンテナ名: redis-6375
    ボリューム:
      - ./redis-6375/conf/redis.conf:/usr/local/etc/redis/redis.conf
      - ./redis-6375/データ:/データ
    ポート:
      -6375:6375
      -16375:16375
    指示:
      redis-server /usr/local/etc/redis/redis.conf

  redis-6376:
    画像: redis
    コンテナ名: redis-6376
    ボリューム:
      - ./redis-6376/conf/redis.conf:/usr/local/etc/redis/redis.conf
      - ./redis-6376/データ:/データ
    ポート:
      -6376:6376
      -16376:16376
    指示:
      redis-server /usr/local/etc/redis/redis.conf

書き込んだら、docker-compose up -d でコンテナを起動します。ここではホストモードは使用しませんが、ホストモードだと外部クライアントが接続できなくなる可能性があるため、NAT モードを使用します。

4. コンテナに入り、クラスターを作成する

上記では、6 つの Redis インスタンスのみが起動され、クラスターは構築されません。
Redis ノード コンテナーに入るには、docker exec -it redis-6371 bash を実行します。どれでもかまいません。
次のコマンドを実行してクラスターを作成します。

# クラスター作成コマンド redis-cli -a 1234 --cluster create 10.35.30.39:6371 10.35.30.39:6372 10.35.30.39:6373 10.35.30.39:6374 10.35.30.39:6375 10.35.30.39:6376 --cluster-replicas 1
# 実行後、次の出力が表示されます: 警告: コマンドライン インターフェイスで '-a' または '-u' オプションを使用してパスワードを使用すると、安全でない可能性があります。
>>> 6 つのノードでハッシュ スロットの割り当てを実行しています...
マスター[0] -> スロット0 - 5460
マスター[1] -> スロット5461 - 10922
マスター[2] -> スロット 10923 - 16383
レプリカ 10.35.30.39:6375 を 10.35.30.39:6371 に追加しています
レプリカ 10.35.30.39:6376 を 10.35.30.39:6372 に追加しています
レプリカ 10.35.30.39:6374 を 10.35.30.39:6373 に追加しています
>>> 反アフィニティのスレーブ割り当てを最適化しようとしています
[警告] 一部のスレーブはマスターと同じホストにあります
ママ: e9a35d6a9d203830556de89f06a3be2e2ab4eee1 10.35.30.39:6371
   スロット:[0-5460] (5461スロット) マスター
0c8755144fe6a200a46716371495b04f8ab9d4c8 10.35.30.39:6372
   スロット:[5461-10922] (5462スロット) マスター
マクロ: fcb83b0097d2a0a87a76c0d782de12147bc86291 10.35.30.39:6373
   スロット:[10923-16383] (5461 スロット) マスター
s: b9819797e98fcd49f263cec1f77563537709bcb8 10.35.30.39:6374
   fcb83b0097d2a0a87a76c0d782de12147bc86291 を複製します
s: f4660f264f12786d81bcf0b18bc7287947ec8a1b 10.35.30.39:6375
   複製 e9a35d6a9d203830556de89f06a3be2e2ab4eee1
s: d2b9f265ef7dbb4a612275def57a9cc24eb2fd5d 10.35.30.39:6376
   0c8755144fe6a200a46716371495b04f8ab9d4c8 を複製します
上記の構成を設定できますか? (承認するには「はい」と入力してください): yes # ここで「はい」と入力して Enter キーを押すと、ノードのマスター/スレーブ ID とハッシュ スロットの割り当てが確認されます >>> ノードの構成が更新されました
>>> 各ノードに異なる構成エポックを割り当てる
>>> クラスターに参加するためにCLUSTER MEETメッセージを送信する
クラスターの参加を待機中
。
>>> クラスター チェックを実行しています (ノード 10.35.30.39:6371 を使用)
ママ: e9a35d6a9d203830556de89f06a3be2e2ab4eee1 10.35.30.39:6371
   スロット:[0-5460] (5461スロット) マスター
   追加のレプリカ 1 個
0c8755144fe6a200a46716371495b04f8ab9d4c8 10.35.30.39:6372
   スロット:[5461-10922] (5462スロット) マスター
   追加のレプリカ 1 個
s: b9819797e98fcd49f263cec1f77563537709bcb8 10.35.30.39:6374
   スロット: (0 スロット) スレーブ
   fcb83b0097d2a0a87a76c0d782de12147bc86291 を複製します
マクロ: fcb83b0097d2a0a87a76c0d782de12147bc86291 10.35.30.39:6373
   スロット:[10923-16383] (5461 スロット) マスター
   追加のレプリカ 1 個
s: f4660f264f12786d81bcf0b18bc7287947ec8a1b 10.35.30.39:6375
   スロット: (0 スロット) スレーブ
   複製 e9a35d6a9d203830556de89f06a3be2e2ab4eee1
s: d2b9f265ef7dbb4a612275def57a9cc24eb2fd5d 10.35.30.39:6376
   スロット: (0 スロット) スレーブ
   0c8755144fe6a200a46716371495b04f8ab9d4c8 を複製します
[OK] すべてのノードがスロット構成に同意します。
>>> 空きスロットがあるか確認します...
>>> スロットのカバレッジを確認してください...
[OK] 16384 スロットすべてがカバーされました。

上記の出力が表示されたら、クラスターの構成は完了です。そして、主人が3人、奴隷が3人います。

要約:

上記は、docker compose を介してセンチネル モードとクラスター モードを展開するプロセス全体です。Redis は、ローカル、開発、テストなどの環境に適した docker に展開されます。docker を強力に制御していない限り、実稼働環境では注意して使用してください。

これで、docker を使用して 5 分で Redis クラスター モードとセンチネル モードを構築する方法についての記事は終了です。docker を使用した Redis クラスター モードとセンチネル モードの構築の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

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

<<:  テキストスクロール後の自動停止効果の例

>>:  JavaScript 関数の高度な説明

推薦する

Mysql 日付クエリの詳細な紹介

現在の日付を照会する CURRENT_DATE() を選択します。 CURDATE() を選択する;...

ウェブページ上の写真プレビューナビゲーションを設計するためのヒント

<br />ナビゲーションとは、ウェブサイトの上部にあることが多いナビゲーション バーの...

LayUI+Shiroは動的なメニューを実装し、メニュー拡張の例を記憶します

目次1. Maven 依存関係2. メニュー関連クラス1. メインメニュー2. サブメニュー3. S...

Reactにおけるキーの役割の詳細な説明

目次質問: ボタンをクリックすると、スパンの色が赤に変わりますか?上記の問題を分析します。 2番目の...

Vue-routerルーティングの使い方

目次1. 説明2. インストール3. テスト1. 説明Vue Router は、Vue.js の公式...

HTML文書におけるol要素の数値制限に関する議論

一般的に言えば、HTML ドキュメント内で極端に大きな <ol> リストに遭遇する可能性...

トップに戻るボタンの例の JavaScript 実装

この記事では、トップに戻るボタンを実装するためのJavaScriptの具体的なコードを参考までに紹介...

JavaScript で実装された 6 つの Web ページ画像カルーセル効果の詳細な説明

目次1. マウスがカルーセル モジュール上を通過すると、左右のボタンが表示され、モジュールを離れると...

JavaScript カウントダウン プロンプト ボックス

この記事の例では、カウントダウンプロンプトボックスを実装するためのJavaScriptの具体的なコー...

Vue2.x - アンチシェイクとスロットリングの使用例

目次ユーティリティ: vue での使用:説明する:画像安定化:スロットル:ユーティリティ: // 手...

Linux サーバー上で nvidia-docker 環境を設定するプロセスの詳細な説明

Docker はコンテナに相当し、必要な動作環境に応じて対応する動作環境を構築できます。このとき、各...

ウェブデザイン経験

<br />著者はかつてWebデザインの初心者でしたが、継続的な探求と実践を通じて、今で...

Linux でネットワーク パケット損失と遅延をシミュレートする方法

netem と tc: netem は、Linux カーネル バージョン 2.6 以降で提供されるネ...

MySQL データをエクスポートする際の secure-file-priv 問題の解決方法

エラー 1290 (HY000) : MySQL サーバーは –secure-file-priv オ...

Linux コマンドラインからファイルを削除する実用的な方法

rm コマンドrm コマンドは、ファイルを削除するときによく使用されるコマンドです。ファイルまたはデ...