docker ベースの redis-sentinel クラスターの構築例

docker ベースの redis-sentinel クラスターの構築例

1. 概要

Redis Cluster は、Redis ノードのグループ間での高可用性とシャーディングを可能にします。クラスターには 1 つのマスター ノードと複数のスレーブ ノードが存在します。マスター ノードに障害が発生した場合、スレーブ ノードが新しいマスターとして選出される必要があります。ただし、Redis 自体 (そのクライアントの多くを含む) には、障害を自動的に検出してアクティブ/スタンバイの切り替えを実行する機能がないため、自動障害回復を実現するには外部の監視ソリューションが必要です。

Redis Sentinel は公式に推奨されている高可用性ソリューションです。これは、ノード監視、通知、自動障害回復、クライアント構成検出サービスを提供できる Redis クラスターの監視および管理ツールです。

2. 遭遇した問題

1. Dockerホストネットワーク

docker がホストネットワークを使用する場合、Windows と Mac では動作しません (解決策が見つかりませんでした)。最終的に、Windows をあきらめて CentOS を使用してクラスターを展開しました。

2. ホストネットワークを使用しないSentinel接続の問題

ホストネットワークを使わずにセンチネルクラスタに接続する場合、マスターノードのポートを指定することで正常に接続できますが、マスターノードに障害が発生すると、センチネルがマスターノードから取得したIPがコンテナ内の仮想IPとなり、クラスタが正常に接続できなくなります。

3. 建設プロセス

1. ディレクトリ構造

2. Sentinel設定ファイル

1. センチネル1.conf

#ポート番号 ポート26379
ディレクトリ /tmp
# mymaster: カスタム クラスター名、2: 投票数は 2 である必要があります。マスター ノードが失敗するかどうかを判断するためのセンチネル モニター mymaster <ip> <port> 2
# マスターノードが5000秒以上到達不能で応答がない場合は、sentinel down-after-milliseconds mymaster 5000
# フェイルオーバー中に最大 numslave が新しいマスターを同期的に更新していることを示します
センチネル並列同期 mymaster 1
# フェイルオーバータイムアウト sentinel フェイルオーバータイムアウト mymaster 5000

2. センチネル2.conf

#ポート番号 ポート26380
ディレクトリ /tmp
# mymaster: カスタム クラスター名、2: 投票数は 2 である必要があります。マスター ノードが失敗するかどうかを判断するためのセンチネル モニター mymaster <ip> <port> 2
# マスターノードが5000秒以上到達不能で応答がない場合は、sentinel down-after-milliseconds mymaster 5000
# フェイルオーバー中に最大 numslave が新しいマスターを同期的に更新していることを示します
センチネル並列同期 mymaster 1
# フェイルオーバータイムアウト sentinel フェイルオーバータイムアウト mymaster 5000

3. センチネル3.conf

#ポート番号 ポート26381
ディレクトリ /tmp
# mymaster: カスタム クラスター名、2: 投票数は 2 である必要があります。マスター ノードが失敗するかどうかを判断するためのセンチネル モニター mymaster <ip> <port> 2
# マスターノードが5000秒以上到達不能で応答がない場合は、sentinel down-after-milliseconds mymaster 5000
# フェイルオーバー中に最大 numslave が新しいマスターを同期的に更新していることを示します
センチネル並列同期 mymaster 1
# フェイルオーバータイムアウト sentinel フェイルオーバータイムアウト mymaster 5000

3. docker-compose.yml

バージョン: '2'
サービス:
 マスター:
 イメージ: redis:4.0
 再起動: 常に
 コンテナ名: redis-master
 #ホストネットワークを使用する network_mode: "host"
 コマンド: redis-server --port 16379 
 
 スレーブ1:
 イメージ: redis:4.0
 再起動: 常に
 コンテナ名: redis-slave-1
 ネットワークモード: "ホスト"
 # ポートを指定し、マスター IP ポートを指定します。コマンド: redis-server --port 16380 --slaveof <master ip> 16379
 
 スレーブ2:
 イメージ: redis:4.0
 再起動: 常に
 コンテナ名: redis-slave-2
 ネットワークモード: "ホスト" 
 コマンド: redis-server --port 16381 --slaveof <マスター IP> 16379
 
 センチネル1:
 イメージ: redis:4.0
 再起動: 常に
 コンテナ名: redis-sentinel-1
 ネットワークモード: "ホスト"
 # センチネルファイルの場所を指定するコマンド: redis-sentinel /usr/local/etc/redis/sentinel.conf
 # データ ボリュームを使用して、指定されたセンチネル ロケーション ボリュームにファイルをマップします。
  - ./sentinel/sentinel1.conf:/usr/local/etc/redis/sentinel.conf
 
 センチネル2:
 イメージ: redis:4.0
 再起動: 常に
 コンテナ名: redis-sentinel-2
 ネットワークモード: "ホスト" 
 コマンド: redis-sentinel /usr/local/etc/redis/sentinel.conf
 ボリューム:
  - ./sentinel/sentinel2.conf:/usr/local/etc/redis/sentinel.conf
 
 センチネル3:
 イメージ: redis:4.0
 再起動: 常に
 コンテナ名: redis-sentinel-3
 ネットワークモード: "ホスト" 
 コマンド: redis-sentinel /usr/local/etc/redis/sentinel.conf
 ボリューム:
  - ./sentinel/sentinel3.conf:/usr/local/etc/redis/sentinel.conf

4. CentOSを使用してクラスターテスト結果をデプロイする

1. sentinel1を介してクラスターへの接続をテストする

2. マスターノードとサブノード間のデータ同期をテストする

3. マスターを閉じてマスタースレーブスイッチを確認します

Sentinelは正常に接続されています

マスターノードは16379から16381に切り替えられます

結論

端午節のあと、1週間怠けていました。以前、センチネル クラスターを構築しました。Docker ネットワーク モデルの問題により、マスター ノードとスレーブ ノードが切り替わった後、クラスターを接続できませんでした。昨日、ホストを Windows で実装できないことがわかったので、テストのために CentOS に配置したところ、完璧に動作しました。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

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

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

>>:  my.cnf (my.ini) 重要なパラメータの最適化設定手順

推薦する

Linuxファイルコマンドの使用

1. コマンドの紹介ファイル コマンドは、ファイルの種類を識別するために使用されます。ファイル チェ...

bash のスクリプトデバッグメカニズムの詳細な説明

スクリプトをデバッグモードで実行するbash -x <script> を使用すると、スク...

Vue プロジェクトでの支払い機能の実装 (WeChat 支払いと Alipay 支払い)

目次プロジェクトにおける一般的な支払い方法Alipay決済微信ペイプロジェクトにおける一般的な支払い...

Dockerfile における ENV 命令の具体的な使用法の詳細な説明

1. Dockerfile 内の ENV 命令は、イメージの環境変数を定義するために使用されます。次...

ネイティブJSは非常に見栄えの良いカウンターを実装します

今日は、ネイティブ JS で実装された見栄えの良いカウンターを紹介します。効果は次のとおりです。 以...

この記事は、Dockerにおけるcgroupの具体的な使用法を徹底的に理解するのに役立ちます。

目次cgroupとはcgroupの構成cgroupが提供する機能cgroup 内の CPU を制限す...

9999px に別れを告げる新しい CSS 画像置換テクニック (背景表示と画面外へのテキストの移動)

-9999 ピクセルの画像置換技術は、ここ 10 年近く人気があります。テキスト要素を画像に置き換え...

Docker メモリ監視とストレステストの方法

起動していたDockerコンテナはメモリを使い果たした状態になっており、再起動せずにコンテナのメモリ...

vue の webpack -v エラー解決の概要

XiaobaiはVueについて学び、次にwebpackについて学び、そしてさまざまなものをインストー...

HTMLフローティングプロンプトボックス機能の実装コード

一般的なフォーム プロンプトは常にフォームのスペースを占有し、フォームが長くなったり広くなったりして...

MySQL XA で分散トランザクションを実装する方法

目次序文XA プロトコルMySQL XA で分散トランザクションを実装する方法序文MySQL が単一...

JavaScriptのアロー関数の特徴と通常の関数との違い

目次1. 矢印関数の使用1. 通常関数から矢印関数へ2. 中括弧を省略してリターンする3. 括弧を省...

カルーセル効果を書くためのjs

この記事では、カルーセルマップの効果を実現するためのjsの具体的なコードを参考までに共有します。具体...

MySql8.023 インストール プロセスの詳細なグラフィック説明 (初回インストール)

まず、MySQL公式サイトからインストールパッケージをダウンロードします。MySQLはオープンソース...