1.下载Redis镜像

Connecting to 192.168.40.21:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.

WARNING! The remote SSH server rejected X11 forwarding request.
Last login: Tue Dec  5 12:33:43 2023 from 192.168.40.1
[root@docker ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
mysql        5.7       c20987f18b13   23 months ago   448MB
[root@docker ~]# docker pull redis:6.0.8
6.0.8: Pulling from library/redis
bb79b6b2107f: Pull complete 
1ed3521a5dcb: Pull complete 
5999b99cee8f: Pull complete 
3f806f5245c9: Pull complete 
f8a4497572b2: Pull complete 
eafe3b6b8d06: Pull complete 
Digest: sha256:21db12e5ab3cc343e9376d655e8eabbdbe5516801373e95a8a9e66010c5b8819
Status: Downloaded newer image for redis:6.0.8
docker.io/library/redis:6.0.8
[root@docker ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
mysql        5.7       c20987f18b13   23 months ago   448MB
redis        6.0.8     16ecd2772934   3 years ago     104MB
[root@docker ~]# 

2.启动6个Redis实例

启动命令

docker run -d --name redis-node-1 --net host --privileged=true -v /data/redis/share/redis-node-1:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381
docker run -d --name redis-node-2 --net host --privileged=true -v /data/redis/share/redis-node-2:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6382
docker run -d --name redis-node-3 --net host --privileged=true -v /data/redis/share/redis-node-3:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6383
docker run -d --name redis-node-4 --net host --privileged=true -v /data/redis/share/redis-node-4:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6384
docker run -d --name redis-node-5 --net host --privileged=true -v /data/redis/share/redis-node-5:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6385
docker run -d --name redis-node-6 --net host --privileged=true -v /data/redis/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386

参数说明

运行结果:

[root@docker ~]# docker run -d --name redis-node-1 --net host --privileged=true -v /data/redis/share/redis-node-1:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381
s-node-2:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6382
 
docker run -d --name redis-node-3 --net host --privileged=true -v /data/redis/share/redis-node-3:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6383
 
docker run -d --name redis-node-4 --net host --privileged=true -v /data/redis/share/redis-node-4:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6384
 
docker run -d --name redis-node-5 --net host --privileged=true -v /data/redis/share/redis-node-5:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6385
 
docker run -d --name redis-node-6 --net host --privileged=true -v /data/redis/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386560d1b7ad4690efbc7761053a99ebb4e7fb04e3dec83d4a1afc5543663928d1e
[root@docker ~]#  
[root@docker ~]# docker run -d --name redis-node-2 --net host --privileged=true -v /data/redis/share/redis-node-2:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6382
395a64ff989be1c58653a5b147a522b0b8584534016b8de18cceda28c5fdf927
[root@docker ~]#  
[root@docker ~]# docker run -d --name redis-node-3 --net host --privileged=true -v /data/redis/share/redis-node-3:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6383
64118a60a16c38c33b5c8737944d7a7b9f9a0ebd7c7d5ab4ac5ba247632c1fb7
[root@docker ~]#  
[root@docker ~]# docker run -d --name redis-node-4 --net host --privileged=true -v /data/redis/share/redis-node-4:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6384
502f3f3772be439123aec0e029d7011ab61b0c15d5ff5c2967afaba9876d1b41
[root@docker ~]#  
[root@docker ~]# docker run -d --name redis-node-5 --net host --privileged=true -v /data/redis/share/redis-node-5:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6385
cba2d24df40035a924db0073928cb03bc8e23e4bcf033548f3ebb4a7578668eb
[root@docker ~]#  
[root@docker ~]# docker run -d --name redis-node-6 --net host --privileged=true -v /data/redis/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386
ea6e61ab73202d749193a466da52519c3c0b751879889a806db1420d0e5f998a
[root@docker ~]# docker ps
CONTAINER ID   IMAGE         COMMAND                   CREATED          STATUS          PORTS     NAMES
ea6e61ab7320   redis:6.0.8   "docker-entrypoint.s…"   11 seconds ago   Up 10 seconds             redis-node-6
cba2d24df400   redis:6.0.8   "docker-entrypoint.s…"   13 seconds ago   Up 12 seconds             redis-node-5
502f3f3772be   redis:6.0.8   "docker-entrypoint.s…"   13 seconds ago   Up 13 seconds             redis-node-4
64118a60a16c   redis:6.0.8   "docker-entrypoint.s…"   14 seconds ago   Up 13 seconds             redis-node-3
395a64ff989b   redis:6.0.8   "docker-entrypoint.s…"   14 seconds ago   Up 13 seconds             redis-node-2
560d1b7ad469   redis:6.0.8   "docker-entrypoint.s…"   14 seconds ago   Up 13 seconds             redis-node-1
[root@docker ~]# 

3.构建主从关系

【Docker】从零开始:16.搭建亿级数据Redis集群之3主3备搭建与故障恢复-LMLPHP

构建命令:

redis-cli --cluster create 192.168.40.21:6381 192.168.40.21:6382 192.168.40.21:6383 192.168.40.21:6384 192.168.40.21:6385 192.168.40.21:6386 --cluster-replicas 1
  • –cluster-replicas 1 表示为每个master创建一个slave节点

运行结果:

[root@docker ~]# docker exec -it redis-node-1 /bin/bash
root@docker:/data# redis-cli --cluster create 192.168.40.21:6381 192.168.40.21:6382 192.168.40.21:6383 192.168.40.21:6384 192.168.40.21:6385 192.168.40.21:6386 --cluster-replicas 1
>>> 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.40.21:6385 to 192.168.40.21:6381
Adding replica 192.168.40.21:6386 to 192.168.40.21:6382
Adding replica 192.168.40.21:6384 to 192.168.40.21:6383
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: e549d779504582bcf7a24803cb64db1c395fe4f5 192.168.40.21:6381
   slots:[0-5460] (5461 slots) master
M: ff85fa983f4aa87da204095768f335d9cff79625 192.168.40.21:6382
   slots:[5461-10922] (5462 slots) master
M: 656e721ea1f5af8ff526b12918726f0a99bceb96 192.168.40.21:6383
   slots:[10923-16383] (5461 slots) master
S: b3d39e1351b9f9dc19650d677b83463896cf8d05 192.168.40.21:6384
   replicates 656e721ea1f5af8ff526b12918726f0a99bceb96
S: 7fc68436c87b89668e2d26292591d5f1ab23d2d7 192.168.40.21:6385
   replicates e549d779504582bcf7a24803cb64db1c395fe4f5
S: f66fc948f3bd3139a38f6edb40748eca549fe6f8 192.168.40.21:6386
   replicates ff85fa983f4aa87da204095768f335d9cff79625
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.40.21:6381)
M: e549d779504582bcf7a24803cb64db1c395fe4f5 192.168.40.21:6381
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: 656e721ea1f5af8ff526b12918726f0a99bceb96 192.168.40.21:6383
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: ff85fa983f4aa87da204095768f335d9cff79625 192.168.40.21:6382
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 7fc68436c87b89668e2d26292591d5f1ab23d2d7 192.168.40.21:6385
   slots: (0 slots) slave
   replicates e549d779504582bcf7a24803cb64db1c395fe4f5
S: b3d39e1351b9f9dc19650d677b83463896cf8d05 192.168.40.21:6384
   slots: (0 slots) slave
   replicates 656e721ea1f5af8ff526b12918726f0a99bceb96
S: f66fc948f3bd3139a38f6edb40748eca549fe6f8 192.168.40.21:6386
   slots: (0 slots) slave
   replicates ff85fa983f4aa87da204095768f335d9cff79625
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
root@docker:/data# 

4.查看集群状态

root@docker:/data# redis-cli -p 6381
127.0.0.1:6381> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:694
cluster_stats_messages_pong_sent:682
cluster_stats_messages_sent:1376
cluster_stats_messages_ping_received:677
cluster_stats_messages_pong_received:694
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:1376
127.0.0.1:6381> 

5.查看节点关系

127.0.0.1:6381> cluster nodes
656e721ea1f5af8ff526b12918726f0a99bceb96 192.168.40.21:6383@16383 master - 0 1701841907000 3 connected 10923-16383
ff85fa983f4aa87da204095768f335d9cff79625 192.168.40.21:6382@16382 master - 0 1701841908717 2 connected 5461-10922
e549d779504582bcf7a24803cb64db1c395fe4f5 192.168.40.21:6381@16381 myself,master - 0 1701841906000 1 connected 0-5460
7fc68436c87b89668e2d26292591d5f1ab23d2d7 192.168.40.21:6385@16385 slave e549d779504582bcf7a24803cb64db1c395fe4f5 0 1701841905000 1 connected
b3d39e1351b9f9dc19650d677b83463896cf8d05 192.168.40.21:6384@16384 slave 656e721ea1f5af8ff526b12918726f0a99bceb96 0 1701841907000 3 connected
f66fc948f3bd3139a38f6edb40748eca549fe6f8 192.168.40.21:6386@16386 slave ff85fa983f4aa87da204095768f335d9cff79625 0 1701841907714 2 connected
127.0.0.1:6381> 

6.主从容错切换

6.1数据读写存储

[root@docker ~]# docker exec -it redis-node-1 /bin/bash
root@docker:/data# redis-cli -p 6381
127.0.0.1:6381> keys *
(empty array)
127.0.0.1:6381> set k1 v1
(error) MOVED 12706 192.168.40.21:6383
127.0.0.1:6381> set k2 v2
OK
127.0.0.1:6381> set k3 v3
OK
127.0.0.1:6381> set k4 v4
(error) MOVED 8455 192.168.40.21:6382
127.0.0.1:6381> 

会发现存储K1和K4的时候报错
K1让我们存储到6383
K2让我们存储到6382
这是因为我们使用的是单机模式,我们需要切换到集群模式存储值

127.0.0.1:6381> exit
root@docker:/data# redis-cli -p 6381 -c
127.0.0.1:6381> flushall
OK
127.0.0.1:6381> set k1 v1
-> Redirected to slot [12706] located at 192.168.40.21:6383
OK
192.168.40.21:6383> set k2 v2
-> Redirected to slot [449] located at 192.168.40.21:6381
OK
192.168.40.21:6381> set k3 v3
OK
192.168.40.21:6381> set k4 v4
-> Redirected to slot [8455] located at 192.168.40.21:6382
OK
192.168.40.21:6382> 

现在k1到k4我们都存储成功了
k1 存储到了6383
k2 存储到了6381
k3 存储到了6381
k4 存储到了6382

检查集群状态

6.2容错切换迁移

【Docker】从零开始:16.搭建亿级数据Redis集群之3主3备搭建与故障恢复-LMLPHP

测试步骤

6.2.1. 主6381和从机切换,先停止主机6381
[root@docker ~]# docker stop redis-node-1
redis-node-1
6.2.2 进入node2查看集群状态
[root@docker ~]# docker exec -it redis-node-2 /bin/bash
root@docker:/data# redis-cli -p 6382 -c
127.0.0.1:6382> cluster nodes
e549d779504582bcf7a24803cb64db1c395fe4f5 192.168.40.21:6381@16381 master,fail - 1701844102535 1701844095000 1 disconnected
7fc68436c87b89668e2d26292591d5f1ab23d2d7 192.168.40.21:6385@16385 master - 0 1701844152952 7 connected 0-5460
f66fc948f3bd3139a38f6edb40748eca549fe6f8 192.168.40.21:6386@16386 slave ff85fa983f4aa87da204095768f335d9cff79625 0 1701844151944 2 connected
b3d39e1351b9f9dc19650d677b83463896cf8d05 192.168.40.21:6384@16384 slave 656e721ea1f5af8ff526b12918726f0a99bceb96 0 1701844151000 3 connected
656e721ea1f5af8ff526b12918726f0a99bceb96 192.168.40.21:6383@16383 master - 0 1701844150000 3 connected 10923-16383
ff85fa983f4aa87da204095768f335d9cff79625 192.168.40.21:6382@16382 myself,master - 0 1701844151000 2 connected 5461-10922
127.0.0.1:6382> 

发现node1为fail node5接管了node1为master

192.168.40.21:6382> exit
root@docker:/data# redis-cli --cluster check 192.168.40.21:6381
192.168.40.21:6381 (e549d779...) -> 2 keys | 5461 slots | 1 slaves.
192.168.40.21:6383 (656e721e...) -> 1 keys | 5461 slots | 1 slaves.
192.168.40.21:6382 (ff85fa98...) -> 1 keys | 5462 slots | 1 slaves.
[OK] 4 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.40.21:6381)
M: e549d779504582bcf7a24803cb64db1c395fe4f5 192.168.40.21:6381
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: 656e721ea1f5af8ff526b12918726f0a99bceb96 192.168.40.21:6383
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: ff85fa983f4aa87da204095768f335d9cff79625 192.168.40.21:6382
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 7fc68436c87b89668e2d26292591d5f1ab23d2d7 192.168.40.21:6385
   slots: (0 slots) slave
   replicates e549d779504582bcf7a24803cb64db1c395fe4f5
S: b3d39e1351b9f9dc19650d677b83463896cf8d05 192.168.40.21:6384
   slots: (0 slots) slave
   replicates 656e721ea1f5af8ff526b12918726f0a99bceb96
S: f66fc948f3bd3139a38f6edb40748eca549fe6f8 192.168.40.21:6386
   slots: (0 slots) slave
   replicates ff85fa983f4aa87da204095768f335d9cff79625
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
root@docker:/data# 

6.2.3. node1恢复加入集群
[root@docker ~]# docker start redis-node-1
redis-node-1
[root@docker ~]# docker ps
CONTAINER ID   IMAGE         COMMAND                   CREATED             STATUS             PORTS     NAMES
ea6e61ab7320   redis:6.0.8   "docker-entrypoint.s…"   About an hour ago   Up About an hour             redis-node-6
cba2d24df400   redis:6.0.8   "docker-entrypoint.s…"   About an hour ago   Up About an hour             redis-node-5
502f3f3772be   redis:6.0.8   "docker-entrypoint.s…"   About an hour ago   Up About an hour             redis-node-4
64118a60a16c   redis:6.0.8   "docker-entrypoint.s…"   About an hour ago   Up About an hour             redis-node-3
395a64ff989b   redis:6.0.8   "docker-entrypoint.s…"   About an hour ago   Up About an hour             redis-node-2
560d1b7ad469   redis:6.0.8   "docker-entrypoint.s…"   About an hour ago   Up 21 seconds                redis-node-1
[root@docker ~]# docker exec -it redis-node-2 /bin/bash
root@docker:/data# redis-cli -p 6382 -c
127.0.0.1:6382> cluster nodes
e549d779504582bcf7a24803cb64db1c395fe4f5 192.168.40.21:6381@16381 slave 7fc68436c87b89668e2d26292591d5f1ab23d2d7 0 1701844503084 7 connected
7fc68436c87b89668e2d26292591d5f1ab23d2d7 192.168.40.21:6385@16385 master - 0 1701844504088 7 connected 0-5460
f66fc948f3bd3139a38f6edb40748eca549fe6f8 192.168.40.21:6386@16386 slave ff85fa983f4aa87da204095768f335d9cff79625 0 1701844502000 2 connected
b3d39e1351b9f9dc19650d677b83463896cf8d05 192.168.40.21:6384@16384 slave 656e721ea1f5af8ff526b12918726f0a99bceb96 0 1701844502000 3 connected
656e721ea1f5af8ff526b12918726f0a99bceb96 192.168.40.21:6383@16383 master - 0 1701844502079 3 connected 10923-16383
ff85fa983f4aa87da204095768f335d9cff79625 192.168.40.21:6382@16382 myself,master - 0 1701844502000 2 connected 5461-10922
127.0.0.1:6382> 

node1变为了node5的从节点

6.2.4. 主从恢复

再次把node5停掉后再启动

[root@docker ~]# docker stop redis-node-5
redis-node-5
[root@docker ~]# docker ps
CONTAINER ID   IMAGE         COMMAND                   CREATED             STATUS             PORTS     NAMES
ea6e61ab7320   redis:6.0.8   "docker-entrypoint.s…"   About an hour ago   Up About an hour             redis-node-6
502f3f3772be   redis:6.0.8   "docker-entrypoint.s…"   About an hour ago   Up About an hour             redis-node-4
64118a60a16c   redis:6.0.8   "docker-entrypoint.s…"   About an hour ago   Up About an hour             redis-node-3
395a64ff989b   redis:6.0.8   "docker-entrypoint.s…"   About an hour ago   Up About an hour             redis-node-2
560d1b7ad469   redis:6.0.8   "docker-entrypoint.s…"   About an hour ago   Up 5 minutes                 redis-node-1
[root@docker ~]# docker start redis-node-5
redis-node-5
[root@docker ~]# docker exec -it redis-node-2 /bin/bash
root@docker:/data# redis-cli -p 6382 -c
127.0.0.1:6382> cluster nodes
e549d779504582bcf7a24803cb64db1c395fe4f5 192.168.40.21:6381@16381 master - 0 1701844818000 8 connected 0-5460
7fc68436c87b89668e2d26292591d5f1ab23d2d7 192.168.40.21:6385@16385 slave e549d779504582bcf7a24803cb64db1c395fe4f5 0 1701844818542 8 connected
f66fc948f3bd3139a38f6edb40748eca549fe6f8 192.168.40.21:6386@16386 slave ff85fa983f4aa87da204095768f335d9cff79625 0 1701844818000 2 connected
b3d39e1351b9f9dc19650d677b83463896cf8d05 192.168.40.21:6384@16384 slave 656e721ea1f5af8ff526b12918726f0a99bceb96 0 1701844819547 3 connected
656e721ea1f5af8ff526b12918726f0a99bceb96 192.168.40.21:6383@16383 master - 0 1701844820551 3 connected 10923-16383
ff85fa983f4aa87da204095768f335d9cff79625 192.168.40.21:6382@16382 myself,master - 0 1701844817000 2 connected 5461-10922
127.0.0.1:6382> 

发现node1变为了主机 node5变为了node1的从节点


12-07 13:57