Docker で Redis クラスターを素早く構築する方法の例

Docker で Redis クラスターを素早く構築する方法の例

Redis クラスターとは

Redis クラスターは、R​​edis が提供する分散データベース ソリューションです。クラスターはシャーディングを通じてデータを共有し、レプリケーションとフェイルオーバー機能を提供します。

ノード

Redis クラスターは通常、複数のノードで構成されます。最初は、各ノードは互いに独立しています。それらはすべて、自分自身だけを含むクラスター内にあります。実際に機能するクラスターを形成するには、独立したノードを接続して、複数のノードを含むクラスターを形成する必要があります。

クラスター構成

設定ファイル

設定ファイルをダウンロードしてください: https://raw.githubusercontent.com/antirez/redis/5.0/redis.conf

CLUSTERノード構成を調整する

# クラスターを有効にする cluster-enabled yes

# クラスター構成ファイル cluster-config-file nodes-6379.conf

# クラスターノードのタイムアウト cluster-node-timeout 15000

DockerはRedisクラスターを素早く構築します

Redisをインストールする

参考記事: https://www.jb51.net/article/150054.htm

準備

├── 会議
│ ├── redis.conf
│ └── センチネル.conf
├── レディス
│ ├── data_6379
│ ├── data_6380
│ ├── data_6381
│ ├── data_6382
│ ├── data_6383
│ └── data_6384
└── スクリプト
  ├── クラスタ.sh
  ├── run.sh
  └── センチネル

run.sh スクリプト ファイル

#!/usr/bin/env バッシュ
セット-e

# スクリプトの現在のディレクトリ cPath=$(cd $(dirname "$0") || exit; pwd)

# ルートディレクトリ dirPath=$(dirname "$cPath")

# ポートを取得します port="$1"
[[ ! "$port" ]]; の場合
 ポート=6379
フィ

# データディレクトリを作成する mkdir -p "$dirPath"/redis/data_"$port"

# 開始したサービスを削除します。containerId=$(docker ps -a | grep "redis_$port" | awk -F' ' '{print $1}')
[[ "$containerId" ]]の場合
  docker rm -f ${コンテナID} > /dev/null
フィ

# サービスを開始します。containerName=redis_"$port"
docker run -itd --privileged=true -p "$port":6379 --name ${containerName} \
-v="$dirPath"/conf/redis.conf:/etc/redis/redis.conf \
-v="$dirPath"/redis/data_"$port":/data \
レディス \
redis-server /etc/redis/redis.conf > /dev/null

# コンテナの IP アドレスを取得します。dockerIp=$(docker inspect -f "{{.NetworkSettings.IPAddress}}" "$containerName")

# コンテナの起動ステータスを取得します isRunning=$(docker inspect -f "{{.State.Running}}" "$containerName")
[[ "$isRunning" == "true" ]]の場合
  echo "コンテナ: $containerName - IP: $dockerIp - 正常に起動しました"
フィ

cluster.sh スクリプト ファイル

#!/usr/bin/env バッシュ
セット-e

# スクリプトの現在のディレクトリ cPath=$(cd $(dirname "$0") || exit; pwd)

# クラスター番号 num="$1" を開始します
[[ ! "$num" ]]; の場合
 番号=6
フィ

ポート=6378
for((i=1;i<=$num;i++)); 実行する
  sh ${cPath}/run.sh $(($sPort+$i))
終わり

サービスを開始する

スクリプトファイルを実行し、デフォルトで6つのノードを作成します。

sh スクリプト/cluster.sh

スクリプトは結果を返します

コンテナ: redis_6379 - IP: 172.17.0.2 - 正常に起動しましたコンテナ: redis_6380 - IP: 172.17.0.3 - 正常に起動しましたコンテナ: redis_6381 - IP: 172.17.0.4 - 正常に起動しましたコンテナ: redis_6382 - IP: 172.17.0.5 - 正常に起動しましたコンテナ: redis_6383 - IP: 172.17.0.6 - 正常に起動しましたコンテナ: redis_6384 - IP: 172.17.0.7 - 正常に起動しました

docker ps を実行して、起動が成功したかどうかを確認します。

root@DESKTOP-Q13EI52:~/docker-config/redis# docker ps
コンテナID イメージ コマンド 作成ステータス ポート名
c0601df1a456 redis "docker-entrypoint.s..." 27 秒前 26 秒前にアップ 0.0.0.0:6384->6379/tcp redis_6384
6fecf70465b8 redis "docker-entrypoint.s..." 27 秒前 26 秒前にアップ 0.0.0.0:6383->6379/tcp redis_6383
1af15e90b7a0 redis "docker-entrypoint.s..." 28 秒前 27 秒前にアップ 0.0.0.0:6382->6379/tcp redis_6382
6c495f31a5df redis "docker-entrypoint.s..." 28 秒前 28 秒前に起動 0.0.0.0:6381->6379/tcp redis_6381
e54fd9fd0550 redis "docker-entrypoint.s..." 29 秒前 28 秒前にアップ 0.0.0.0:6380->6379/tcp redis_6380
be92ad2f7046 redis "docker-entrypoint.s..." 29 秒前 29 秒前にアップ 0.0.0.0:6379->6379/tcp redis_6379

これまでに 6 つの独立したクラスター ノードが作成されましたが、まだ正常に動作していません。

クラスターの作成

この部分は飛ばしていただいて構いません。面倒なことは避けたいだけです

コンテナ redis_ によって起動されたすべてのコンテナの IP アドレスを取得します。

docker examine -f "{{.NetworkSettings.IPAddress}}:6379" `docker ps | grep redis_ | awk -F' ' '{print $1}'` | sort |xargs | sed 's/ /, /g'

# 結果を返す# 172.17.0.2:6379、172.17.0.3:6379、172.17.0.4:6379、172.17.0.5:6379、172.17.0.6:6379、172.17.0.7:6379

初期クラスタ作成の実行

./redis-cli --cluster を作成します 172.17.0.2:6379、172.17.0.3:6379、172.17.0.4:6379、172.17.0.5:6379、172.17.0.6:6379、172.17.0.7:6379 --cluster-replicas 1

出力

リカ 1
>>> 6 つのノードでハッシュ スロットの割り当てを実行しています...
マスター[0] -> スロット0 - 5460
マスター[1] -> スロット5461 - 10922
マスター[2] -> スロット 10923 - 16383
レプリカ 172.17.0.6:6379 を 172.17.0.2:6379 に追加しています
レプリカ 172.17.0.7:6379 を 172.17.0.3:6379 に追加しています
レプリカ 172.17.0.5:6379 を 172.17.0.4:6379 に追加しています
:e8da1fef656984de3ec2a677edc8d9c48d01cd95 172.17.0.2:6379
  スロット:[0-5460] (5461スロット) マスター
男: 68b925ab0fbbc1a632c1754587fb6dad3fa14c91 172.17.0.3:6379
  スロット:[5461-10922] (5462スロット) マスター
0a46ab2f6d176738b55fe699c2df1c34f8200d06 172.17.0.4:6379
  スロット:[10923-16383] (5461 スロット) マスター
s: bd3064ad5297dfc258e9236943455c589be8b2a3 172.17.0.5:6379
  0a46ab2f6d176738b55fe699c2df1c34f8200d06 を複製します
172.17.0.6:6379 ...
  複製 e8da1fef656984de3ec2a677edc8d9c48d01cd95
619e1cb52f39e07b321719b77fc3631fa6293cef 172.17.0.7:6379
  68b925ab0fbbc1a632c1754587fb6dad3fa14c91 を複製します
上記の構成を設定できますか? (承認するには「はい」と入力してください):

入力: はい、スロットは均等に分配されます

>>> ノード構成が更新されました
>>> 各ノードに異なる構成エポックを割り当てる
>>> クラスターに参加するためにCLUSTER MEETメッセージを送信する
クラスターの参加を待機中
.....
>>> クラスター チェックを実行しています (ノード 172.17.0.2:6379 を使用)
:e8da1fef656984de3ec2a677edc8d9c48d01cd95 172.17.0.2:6379
  スロット:[0-5460] (5461スロット) マスター
  追加のレプリカ 1 個
s: f1d8c897882d29e6538b1158525493b3b782289a 172.17.0.6:6379
  スロット: (0 スロット) スレーブ
  複製 e8da1fef656984de3ec2a677edc8d9c48d01cd95
s: bd3064ad5297dfc258e9236943455c589be8b2a3 172.17.0.5:6379
  スロット: (0 スロット) スレーブ
  0a46ab2f6d176738b55fe699c2df1c34f8200d06 を複製します
0a46ab2f6d176738b55fe699c2df1c34f8200d06 172.17.0.4:6379
  スロット:[10923-16383] (5461 スロット) マスター
  追加のレプリカ 1 個
619e1cb52f39e07b321719b77fc3631fa6293cef 172.17.0.7:6379
  スロット: (0 スロット) スレーブ
  68b925ab0fbbc1a632c1754587fb6dad3fa14c91 を複製します
男: 68b925ab0fbbc1a632c1754587fb6dad3fa14c91 172.17.0.3:6379
  スロット:[5461-10922] (5462スロット) マスター
  追加のレプリカ 1 個
[OK] すべてのノードがスロット構成に同意します。
>>> 空きスロットがあるか確認します...
>>> スロットのカバレッジを確認してください...
[OK] 16384 スロットすべてがカバーされました。

クラスターへの接続

クライアント経由で接続

redis-cli -c <ポート>

次のコマンドを実行します: cluster info

127.0.0.1:6379> クラスター情報
クラスター状態:正常
割り当てられたクラスタースロット:16384
クラスタースロットOK:16384
クラスタースロットp失敗:0
クラスタースロット失敗:0
クラスターの既知のノード:6
クラスターサイズ:3
クラスター現在のエポック:6
クラスター_マイ_エポック:1
クラスター統計メッセージping送信:104
クラスター統計メッセージ送信:120
クラスター統計メッセージ送信数:224
クラスター統計メッセージping受信:115
クラスター統計メッセージ受信:104
クラスター統計メッセージ会議受信数:5
クラスター統計受信メッセージ:224

cluster_state:okと表示された場合、クラスターは正常に機能しています。

クライアントコンソール: cluster help

127.0.0.1:6379> クラスターヘルプ
 1) CLUSTER <サブコマンド> arg arg ... arg。サブコマンドは次のとおりです。
 2) ADDSLOTS <slot> [slot ...] -- 現在のノードにスロットを割り当てます。
 3) BUMPEPOCH -- クラスター構成エポックを進めます。
 4) COUNT-failure-reports <node-id> -- <node-id> の障害レポートの数を返します。
 5) COUNTKEYSINSLOT <スロット> - <スロット>内のキーの数を返します。
 6) DELSLOTS <slot> [slot ...] -- 現在のノードからスロット情報を削除します。
 7) FAILOVER [force|takeover] - 現在のレプリカ ノードをマスターに昇格します。
 8) FORGET <node-id> -- クラスターからノードを削除します。
 9) GETKEYSINSLOT <スロット> <カウント> -- 現在のノードによってスロットに格納されているキー名を返します。
10) FLUSHSLOTS -- 現在のノードのスロット情報を削除します。
11) INFO - クラスターに関する情報を返します。
12) KEYSLOT <key> -- <key> のハッシュスロットを返します。
13) MEET <ip> <port> [bus-port] -- 稼働中のクラスターにノードを接続します。
14) MYID -- ノード ID を返します。
15) NODES -- ノードから見たクラスター構成を返します。出力形式:
16) <id> <ip:port> <flags> <master> <pings> <pongs> <epoch> <link> <slot> ... <slot>
17) REPLICATE <node-id> -- 現在のノードを <node-id> のレプリカとして設定します。
18) RESET [hard|soft] -- 現在のノードをリセットします(デフォルト: soft)。
19) SET-config-epoch <epoch> - 現在のノードの設定エポックを設定します。
20) SETSLOT <スロット> (インポート|移行|安定|ノード <ノード ID>) -- スロットの状態を設定します。
21) REPLICAS <node-id> -- <node-id> レプリカを返します。
22) SAVECONFIG - クラスター構成をディスクに強制的に保存します。
23) SLOTS -- スロット範囲のマッピングに関する情報を返します。各範囲は次の要素で構成されます。
24) 開始、終了、マスター、レプリカの IP アドレス、ポート、ID

クライアントが提供するクラスター関連のコマンドを表示します: redis-cli --cluster help

クラスター マネージャー コマンド:
 ホスト1:ポート1 ... ホストN:ポートNを作成します
         --cluster-replicas <引数>
 ホスト:ポートを確認する
         --cluster-search-複数の所有者
 情報ホスト:ポート
 ホスト:ポートを修正
         --cluster-search-複数の所有者
 リシャードホスト:ポート
         --cluster-from <引数>
         --cluster-to <引数>
         --cluster-slots <引数>
         --cluster-yes
         --cluster-timeout <引数>
         --cluster-pipeline <引数>
         --クラスタ置換
 ホスト:ポートの再バランス
         --cluster-weight <node1=w1...nodeN=wN>
         --cluster-use-empty-masters
         --cluster-timeout <引数>
         --クラスタシミュレート
         --cluster-pipeline <引数>
         --cluster-threshold <引数>
         --クラスタ置換
 ノードの追加 新しいホスト:新しいポート 既存のホスト:既存のポート
         --クラスタスレーブ
         --cluster-master-id <引数>
 del-node ホスト:ポート ノードID
 ホスト:ポート コマンド arg arg .. arg を呼び出す
 タイムアウト設定 ホスト:ポート ミリ秒
 ホスト:ポートをインポートする
         --cluster-from <引数>
         --クラスタコピー
         --クラスタ置換

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

以下もご興味があるかもしれません:
  • Dockerを使用してRedisクラスターを構築する方法
  • Docker ベースの Redis マスタースレーブ クラスタの実装
  • Docker 上で Redis クラスターを構築する
  • Docker を使用してスタンドアロン Pulsar とクラスター化された Redis をデプロイする方法 (開発アーティファクト)
  • Docker を使用して Redis マスター スレーブ レプリケーション クラスターを構築する
  • docker redis5.0 clusterの実装 クラスタ構築
  • Docker で Redis センチネル モードを構成する方法 (複数のサーバー上)
  • Docker ベースの Redis 1 マスター、2 スレーブ、3 センチネルの実装
  • 5分でDockerを使ってRedisのクラスターモードとセンチネルモードを構築する方法を教えます

<<:  MySQL をインストールするときに初期パスワードを忘れた場合のシンプルで効果的な解決策

>>:  JavaScriptのループの違いについての詳細な説明

推薦する

Docker を使用した Redis マスタースレーブレプリケーションの実践の詳細説明

目次1. 背景2. 操作手順3. Dockerをインストールする4. 主なサービス構成5. サービス...

Homebrewを使用してMacにMySQLをインストールするときにログインできない問題を解決する

お使いのコンピュータが Mac の場合、homebrew を使用して MySQL をインストールする...

Tomcatのサーバーオプションの詳細な説明

1. 構成デフォルトでは、最初の 2 つはチェックされていないので、チェックする必要があります。 (...

ウェブデザインの初心者に役立つ学習教材をいくつかお勧めします

勉強中に読んだ本についてもよく聞かれます。以下は初心者におすすめの本です(私が勉強中に読んだ本です。...

MySQLは文字列関数のSQL文をインターセプトします

1. left(name,4)は左の4文字をインターセプトしますリスト: SELECT LEFT(2...

Vueはシンプルなショッピングカートの例を実装します

この記事では、参考までに、Vue の具体的なコードを共有して、簡単なショッピングカートを実装します。...

CSSで制御可能な点線を実装する方法

序文CSS を使用して点線を生成するのは、フロントエンド開発者にとっては簡単です。一般的に、これを実...

Vue プロジェクトに ECharts を導入する

目次1. インストール2. はじめに3. 使用4. 必要に応じてEChartsチャートとコンポーネン...

Linux サーバーでフォルダー、ファイル、解凍コマンドを削除する方法

1. フォルダを削除する例: rm -rf /usr/java /usr/javaディレクトリとその...

MySql SQL最適化のヒントの共有

ある日、内部結合を含む SQL ステートメントの実行速度はそれほど遅くはない (0.1 ~ 0.2)...

CSS エラスティック ボックス flex-grow、flex-shrink、flex-basis の詳細な説明

3 つの属性 flex-grow、flex-shrink、flex-basis の機能は次のとおりで...

Vueは質問応答機能を実装する

1. リクエスト回答インターフェース2. ユーザーの回答が正しいかどうかを判断します。回答が正しい場...

モバイル端末の適応に関する簡単な説明

序文フロントエンド コードの記述では、「互換性」という言葉から逃れることはできません。過去の PC ...

Vue の新しいおもちゃ VueUse の具体的な使い方

目次序文VueUseとは使いやすいおなじみの手ぶれ補正やスロットル機能もありますグローバル状態を共有...