【Docker】从零开始:15.搭建亿级数据Redis集群之操作篇
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
参数说明
参数 | 解释 |
---|---|
–name redis-node-6 | 容器名称 |
–net host | 使用宿主机的IP和端口,默认 |
–privileged=true | 获取宿主机root用户权限 |
-v /data/redis/share/redis-node-6:/data | 容器卷,宿主机地址:docker内部地址 |
redis:6.0.8 | redis镜像和版本号 |
–cluster-enabled yes | 开启redis集群 |
–appendonly yes | 开启持久化 |
–port 6386 | redis端口号 |
运行结果:
[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.构建主从关系
构建命令:
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
-c 表示使用集群状态
检查集群状态1
6.2容错切换迁移
测试步骤
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>
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
发现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的从节点
7.检查集群状态
↩︎