PS:環境をより現実的にするために、この記事ではマルチマシン環境を使用します
192.168.10.10
192.168.10.11
各マシンで使用されるインフラストラクチャ環境は次のとおりです。
CentOS 7.8.2003
Docker version 19.03.12
ビルド
全体的な構築手順は、主に次の手順に分けられます。
- Redisイメージをダウンロードします(実際、コンテナーの作成時にローカルイメージが存在しない場合はリモートでプルされるため、この手順は省略できます)。
- Redis構成ファイルを書き込みます。
- Redisコンテナを作成します。
- Redisクラスタークラスターを作成します。
Redis構成ファイルを書き込む
ディレクトリとファイルを作成する
それぞれ、両方のマシンで次の操作192.168.10.10
を192.168.10.11
実行します。
# 创建目录
mkdir -p /usr/local/docker-redis/redis-cluster
# 切换至指定目录
cd /usr/local/docker-redis/redis-cluster/
# 编写 redis-cluster.tmpl 文件
vi redis-cluster.tmpl
構成ファイルの書き込み
192.168.10.10
redis-cluster.tmpl
ファイルのマシンの内容は次のとおりです。
port ${PORT}
requirepass 1234
masterauth 1234
protected-mode no
daemonize no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.10.10
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}
192.168.10.11
redis-cluster.tmpl
ファイルのマシンの内容は次のとおりです。
port ${PORT}
requirepass 1234
masterauth 1234
protected-mode no
daemonize no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.10.11
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}
port
:ノードポート;requirepass
:アクセス認証を追加します。masterauth
:マスターノードがアクセス認証を有効にしている場合、スレーブノードはマスターノードにアクセスするために認証を必要とします。protected-mode
:保護モード。デフォルト値はyesで、オンになっています。保護モードを開いた後bind ip
、アクセスパスワードを構成または設定します。オフ保護モードでは、外部ネットワークに直接アクセスできます。daemonize
:デーモンスレッドとして開始する(バックグラウンドで開始する)かどうか、デフォルトはnoです。appendonly
:AOF永続モードを有効にするかどうか。デフォルトはnoです。cluster-enabled
:クラスターモードを有効にするかどうか、デフォルトはいいえ。cluster-config-file
:クラスターノード情報ファイル。cluster-node-timeout
:クラスターノード接続タイムアウト時間。cluster-announce-ip
:クラスターノードIP、ホストのIPを入力します。cluster-announce-port
:クラスターノードマッピングポート。cluster-announce-bus-port
:クラスターノードバスポート。
各Redisクラスターノードは、2つのTCP接続を開く必要があります。6379などのクライアントにサービスを提供するために使用される通常のRedisTCPポート。16379など、ポート6379と10000に基づくポートもあります。
2番目のポートは、バイナリプロトコルを使用したノード間通信チャネルであるクラスタバスに使用されます。ノードは、障害検出、構成の更新、フェイルオーバーの承認などにクラスターバスを使用します。クライアントはクラスターバスポートとの通信を試みてはならず、通常のRedisコマンドポートと通信するだけですが、ファイアウォールの両方のポートが開いていることを確認してください。開いていない場合、Redisクラスターノードは通信できません。
では192.168.10.10
、マシンredis-cluster
のディレクトリで次のコマンドを実行します。
for port in `seq 6371 6373`; do \
mkdir -p ${port}/conf \
&& PORT=${port} envsubst < redis-cluster.tmpl > ${port}/conf/redis.conf \
&& mkdir -p ${port}/data;\
done
では192.168.10.11
、マシンredis-cluster
のディレクトリで次のコマンドを実行します。
for port in `seq 6374 6376`; do \
mkdir -p ${port}/conf \
&& PORT=${port} envsubst < redis-cluster.tmpl > ${port}/conf/redis.conf \
&& mkdir -p ${port}/data;\
done
上記の2つのシェルforステートメントは、6371〜6376に関連するディレクトリとファイルをループで作成することを意味します。
インストールするコマンド192.168.10.10
がない場合、実行マシンコマンドで次のように結果を表示します。tree
yum install -y tree
では192.168.10.11
、次のように実行マシンのコマンドの結果を表示します。
以下の内容は、各ノードの構成ファイルの詳細です。
============================== 192.168.10.10 ==============================
[root@localhost redis-cluster]# cat /usr/local/docker-redis/redis-cluster/637{1..3}/conf/redis.conf
port 6371
requirepass 1234
masterauth 1234
protected-mode no
daemonize no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.10.10
cluster-announce-port 6371
cluster-announce-bus-port 16371
port 6372
requirepass 1234
masterauth 1234
protected-mode no
daemonize no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.10.10
cluster-announce-port 6372
cluster-announce-bus-port 16372
port 6373
requirepass 1234
masterauth 1234
protected-mode no
daemonize no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.10.10
cluster-announce-port 6373
cluster-announce-bus-port 16373
============================== 192.168.10.10 ==============================
============================== 192.168.10.11 ==============================
[root@localhost redis-cluster]# cat /usr/local/docker-redis/redis-cluster/637{4..6}/conf/redis.conf
port 6374
requirepass 1234
masterauth 1234
protected-mode no
daemonize no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.10.11
cluster-announce-port 6374
cluster-announce-bus-port 16374
port 6375
requirepass 1234
masterauth 1234
protected-mode no
daemonize no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.10.11
cluster-announce-port 6375
cluster-announce-bus-port 16375
port 6376
requirepass 1234
masterauth 1234
protected-mode no
daemonize no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.10.11
cluster-announce-port 6376
cluster-announce-bus-port 16376
============================== 192.168.10.11 ==============================
Redisコンテナを作成する
コンテナを作成する
ホストコンピュータ6371 ~ 6376
ポート6コンテナ間のマッピング、ホストベッセル内のカタログディレクトリ、およびマッピング(ディレクトリマウント)を再実行します。ネットワークモードを使用して、host
ネットワークモードを指定することを忘れないでください。
では192.168.10.10
、次のコマンドマシンを実行します:
for port in $(seq 6371 6373); do \
docker run -di --restart always --name redis-${port} --net host \
-v /usr/local/docker-redis/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v /usr/local/docker-redis/redis-cluster/${port}/data:/data \
redis redis-server /usr/local/etc/redis/redis.conf; \
done
では192.168.10.11
、次のコマンドマシンを実行します:
for port in $(seq 6374 6376); do \
docker run -di --restart always --name redis-${port} --net host \
-v /usr/local/docker-redis/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v /usr/local/docker-redis/redis-cluster/${port}/data:/data \
redis redis-server /usr/local/etc/redis/redis.conf; \
done
では192.168.10.10
、マシンを実行するためのdocker ps -n 3
コンテナが作成されているかどうかを確認します。
では192.168.10.11
、マシンを実行するためのdocker ps -n 3
コンテナが作成されているかどうかを確認します。
Redisクラスターを作成する
コンテナノードを入力せず/usr/local/bin/
、ディレクトリを入力します。
# 进入容器
docker exec -it redis-6371 bash
# 切换至指定目录
cd /usr/local/bin/
次に、次のコマンドを使用してRedisクラスタークラスターを作成できます。
redis-cli -a 1234 --cluster create 192.168.10.10:6371 192.168.10.10:6372 192.168.10.10:6373 192.168.10.11:6374 192.168.10.11:6375 192.168.10.11:6376 --cluster-replicas 1
選択プロンプトメッセージが表示されます。yesと入力すると、結果は次のようになります。
クラスターは次のように正常に作成されます。
次のコンテンツは、クラスターの作成時に返される詳細情報です。つまり、前の2つの図のすべてのコンテンツです。
root@localhost:/usr/local/bin# redis-cli -a 1234 --cluster create 192.168.10.10:6371 192.168.10.10:6372 192.168.10.10:6373 192.168.10.11:6374 192.168.10.11:6375 192.168.10.11:6376 --cluster-replicas 1
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.10.11:6376 to 192.168.10.10:6371
Adding replica 192.168.10.10:6373 to 192.168.10.11:6374
Adding replica 192.168.10.11:6375 to 192.168.10.10:6372
M: 299cf79ddafc83dced27f628f1f82dac483fbc4e 192.168.10.10:6371
slots:[0-5460] (5461 slots) master
M: ac805b90b6e20e26dc4268454bb2855beea6cc19 192.168.10.10:6372
slots:[10923-16383] (5461 slots) master
S: db35494fcc5db0c88d27da7885c817e6cdcc9373 192.168.10.10:6373
replicates 7013270480d37eeab79b9cd0272e934d4548136a
M: 7013270480d37eeab79b9cd0272e934d4548136a 192.168.10.11:6374
slots:[5461-10922] (5462 slots) master
S: 8435e1b0d51f2690c5f94f9a5682a4ac34e94326 192.168.10.11:6375
replicates ac805b90b6e20e26dc4268454bb2855beea6cc19
S: 7b13c16fa6fe8e13cdc0b4846b87edffed55c62e 192.168.10.11:6376
replicates 299cf79ddafc83dced27f628f1f82dac483fbc4e
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.
>>> Performing Cluster Check (using node 192.168.10.10:6371)
M: 299cf79ddafc83dced27f628f1f82dac483fbc4e 192.168.10.10:6371
slots:[0-5460] (5461 slots) master
1 additional replica(s)
S: 8435e1b0d51f2690c5f94f9a5682a4ac34e94326 192.168.10.11:6375
slots: (0 slots) slave
replicates ac805b90b6e20e26dc4268454bb2855beea6cc19
S: db35494fcc5db0c88d27da7885c817e6cdcc9373 192.168.10.10:6373
slots: (0 slots) slave
replicates 7013270480d37eeab79b9cd0272e934d4548136a
S: 7b13c16fa6fe8e13cdc0b4846b87edffed55c62e 192.168.10.11:6376
slots: (0 slots) slave
replicates 299cf79ddafc83dced27f628f1f82dac483fbc4e
M: 7013270480d37eeab79b9cd0272e934d4548136a 192.168.10.11:6374
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
M: ac805b90b6e20e26dc4268454bb2855beea6cc19 192.168.10.10:6372
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
これまでのところ、次の図に示すように、可用性の高いRedisクラスタークラスターが構築されています。クラスターには、6つのRedisノード、3つのマスター、および3つのスレーブが含まれています。3つのマスターノードは、クライアントのコマンド要求を処理するためのスロットを割り当てます。マスターノードに障害が発生した後、スレーブノードを使用してマスターノードを置き換えることができます。
クラスターステータスの表示
最初にコンテナに入り、次にクラスタで一般的に使用されるいくつかのコマンドを使用してクラスタのステータスを確認します。
# 进入容器
docker exec -it redis-6371 bash
# 切换至指定目录
cd /usr/local/bin/
クラスターのステータスを確認する
redis-cli -a 1234 --cluster check 192.168.10.11:6375
クラスター情報とノード情報を表示する
# 连接至集群某个节点
redis-cli -c -a 1234 -h 192.168.10.11 -p 6376
# 查看集群信息
cluster info
# 查看集群结点信息
cluster nodes
SET / GET
6371ノードで書き込みと読み取りを実行するためのコマンドは、次のとおりです。
# 进入容器并连接至集群某个节点
docker exec -it redis-6371 /usr/local/bin/redis-cli -c -a 1234 -h 192.168.10.10 -p 6371
# 写入数据
set name mrhelloworld
set aaa 111
set bbb 222
# 读取数据
get name
get aaa
get bbb
心配しないで、上の写真の操作プロセスを説明しましょう。
- 最初にコンテナに入り、クラスタ内のノードに接続します。
- 実行して最初の設定コマンドを
set name mrhelloworld
、name
キーは、ハッシュ関数に基づいて算出されます[5798]
。現在のクラスタ環境溝の分布がある:[0-5460] 6371节点
、、[5461-10922] 6374节点
、[10923-16383] 6372节点
キーはメモリに割り当てられているので、6374ノード。 - 2番目のsetコマンドを見てみましょう。
set aaa
疑問があるかもしれませんがaaa
、操作後にハッシュ関数によって取得された結合の値を確認してみませんか?6374ノードにリダイレクトされてデータが挿入されたため、この時点でまだデータが挿入されている場合、ハッシュ関数操作によるキーの後に取得された値はノードの範囲内にあり、データを直接挿入できます。 - 続いて第三の組のコマンド
set bbb
、bbb
キーはハッシュ関数演算後に得られた値である[5287]
キーの記憶に割り当てられるように、6371ノード。 - 次に、読み取り操作があります。4番目のコマンド
get name
ではname
、ハッシュ関数操作の後に取得された値に従って、キー[5798]
が読み取りのために6374ノードにリダイレクトされます。 - 5番目のコマンド
get aaa
でaaa
あるハッシュ関数に従ってキーが計算された後に取得される値も、直接読み取られる6374ノードにあります。 - 6番目のコマンド
get bbb
であるbbb
キー[5287]
は、ハッシュ関数操作後に取得された値に従って読み取るために6371ノードにリダイレクトされます。
上記の操作を通じて、name
ノードが6374に直接接続され、何が起こるかの値を取得した場合、ストレージキーが6374ノードに割り当てられることがわかりました。そうです、データはノード内にあるため、ノードをリダイレクトする必要はありません。データは直接読み取られて返されます。
クライアント接続
最後に、クライアント接続操作の波、任意のノードに来て、Redisクラスタークラスターに外部からアクセスできるかどうかを確認します。