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 関数の高度な説明

推薦する

純粋な CSS で実装された 3 つの通知バーのスクロール効果

序文通知バー コンポーネントは、比較的一般的なコンポーネントです。基本的に、すべてのサイトにこのよう...

SQL文の最適化の一般的な手順の詳細な説明

序文この記事では主に、SQL ステートメントの最適化の一般的な手順について説明します。これは、参考と...

ページ下部のフッターを修正する方法(複数の方法)

フロントエンド Web エンジニアとして、ページ効果を作成するときに次の現象に遭遇したことがあるはず...

Tomcat のパフォーマンス最適化方法の簡単な概要

Tomcat自体の最適化Tomcat メモリ最適化起動時に大きなメモリ ブロックが必要であることを ...

MySQLの再帰問題

MySQL自体は再帰構文をサポートしていませんが、自己接続を通じていくつかの単純な再帰を実現できます...

DockerにELKをインストールしてJSON形式のログ分析を実装する方法

ELKとは何ですか? ELK は、Elastic が提供するログ収集およびフロントエンド表示ソリュー...

Javascript 共通高階関数の詳細

目次1. 一般的な高階関数1.1、フィルター1.2、地図1.3、減らすHigher Order fu...

vue-cropper を使用して vue で写真をトリミングする方法をご存知ですか?

目次1. インストール: 2. 使用方法: 3. 組み込みメソッド: 4. 使用方法:要約する公式サ...

Vueカスタムコンポーネントは双方向バインディングを実装します

シナリオ:一般的に使用される親コンポーネントと子コンポーネント間の相互作用方法は次のとおりです。親コ...

HTML リンク アンカー タグと SEO におけるその役割の概要

<a> タグは主に、ハイパーリンクまたはアンカー リンクとも呼ばれるリンクとブックマーク...

Vue.js ドラッグ可能なテキストボックスコンポーネントの使用方法の詳細な説明

目次コンポーネントの登録コンポーネントの追加ソースコードドラッグ可能なテキスト ボックスでは、ユーザ...

ミニプログラムの基本的な使用方法の知識ポイント(非常に包括的で、お勧めです!)

目次アプリを登録するときに何をすればよいですか?ページを登録するときに通常何をする必要がありますか?...

Windows で複数の MySQL インスタンスを実行する方法

序文Windows では、各インスタンスに適切なパラメータを使用してコマンド ラインから複数の My...

ウェブページ印刷細線表+ページ印刷究極の戦略

最近、クライアントのために印刷していたとき、ページのヘッダーを印刷するのではなく、表の内容だけを印刷...

MySQLの保存場所を新しいディスクに移行する方法

1. 新しいディスクを準備し、現在のルートパーティションと同じファイルシステムでフォーマットし、ディ...