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のループの違いについての詳細な説明

推薦する

Vueカスケードドロップダウンボックスの設計と実装

目次1. データベース設計2. フロントエンドページ3. 完全なデモフロントエンド開発では、カスケー...

Ubuntu 16.04 mysql5.7.17 リモートポート 3306 を開く

MySQLへのリモートアクセスを有効にするデフォルトでは、MySQL ユーザーにはリモート アクセス...

vuex名前空間の使用

目次Vuex は単一の状態ツリーを使用するため、すべてのアプリケーション状態が比較的大きなオブジェク...

最新バージョンMySQL5.7.19 解凍版インストールガイド

MySQL バージョン: MySQL Community Edition (GPL) ------ ...

Dockerコンテナにホストディレクトリへの書き込み権限がない場合の解決策

Docker コンテナを適用する場合、多くの場合、ホスト ディレクトリを Docker コンテナにマ...

MySQL コピーテーブルと許可分析の 3 つの実装方法

テーブルを素早くコピーする方法まず、テーブル db1.t を作成し、1000 行のデータを挿入します...

MySQLのさまざまなオブジェクトのサイズと長さの制限について話しましょう

目次識別子の長さ制限権限テーブルの範囲フィールドの長さ制限データベースとテーブルの数の制限テーブルサ...

Vue3 の ref toRef と toRefs の違いを理解する方法

目次1. 基本1.参照2. 参照3. 参照4. 最適な使い方2. 詳細な1. なぜrefが必要なのか...

CSS Houdini でダイナミックな波効果を実現

CSS Houdini は、CSS 分野における最もエキサイティングなイノベーションとして知られてい...

マーキー要素は、スクロールするフォントや画像などの効果を実装します。

マーキー要素を使用すると、単純なフォント(画像など)のスライドやその他の効果を実現できます。コードを...

HTMLページの文字セットを指定する2つの方法

1. HTMLページの文字セットを指定する2つの方法方法1: <メタ文字セット="u...

jQueryで劇場の座席選択と予約の効果を実現

jQueryは劇場の座席選択と予約の効果を実現します。参考までに、具体的な内容は次のとおりです。効果...

MySQL 8.0.20 Window10無料インストール版設定とNavicat管理チュートリアルグラフィック詳細説明

1. MySQL 8.0.20をダウンロードして解凍するダウンロードリンク: https://dev...

無効と読み取り専用で入力を読み取り専用に設定する

読み取り専用入力を実現するには、無効と読み取り専用の 2 つの方法があります。当然、どちらの結果も読...

HTML タグ sup と sub の応用の紹介

HTML タグ: 上付き文字HTML では、<sup> タグは上付き文字のテキストを定義...