docker 搭建redis cluster集群并且进行容错演练

51 阅读3分钟

1. 背景

redis 集群的搭建不仅仅是运维同学的必备技能,也是开发同学学习redis的必经历程,在以后的学习生涯中,学习每一门技术栈,搭建高可用的集群是必不可少的

2. 演练

2.1 集群搭建

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


docker create       //创建容器的命令
--name redis-node-1 //容器的名字  例如 redis-node-1
--net host          //docker网络,使用宿主机的IP和端口
--privileged=true   //docker容器 获取宿主机root权限
-v /data/redis/share/redis-node-4:/data    //容器的data目录 映射到 宿主机/data/redis/share/redis-node-1
redis:5.0.7        //redis镜像名称和版本号
--cluster-enabled yes    //redis.conf的配置:开启redis集群
--appendonly yes         //redis.conf的配置:开启数据持久化
--port 6381              //redis.conf的配置:redis端口号


docker start  redis-node-1 redis-node-2 redis-node-3 redis-node-4 redis-node-5 redis-node-6

docker exec -it redis-node-1 /bin/bash

redis-cli --cluster create 10.0.4.5:6381 10.0.4.5:6382 10.0.4.5:6383 10.0.4.5:6384 10.0.4.5:6385 10.0.4.5:6386  --cluster-replicas 1

参数create表示创建一个新的集群,--replicas 1 表示为每个master创建一个slave。

使用cluster info命令查看集群状态。

redis-cli -h 192.168.1.138 -p 6381 -c

cluster info

cluster info结果展示:

image.png

使用cluster nodes命令查看节点状态。cluster nodes

image.png

搭建好的集群

image.png

2.2 主从切换演练

操作:停掉 6381, 6386 会升级为主集群

docker exec -it 467cbac73df7 /bin/bash

redis-cli -h 10.0.4.5 -p 6386 -c

cluster nodes

image.png

2.3 hash 槽扩容演练

准备两个节点并启动

docker create --name redis-node-7 --net host --privileged=true -v /data/redis/share/redis-node-7:/data redis:5.0.7 --cluster-enabled yes --appendonly yes --port 6387

docker create --name redis-node-8 --net host --privileged=true -v /data/redis/share/redis-node-8:/data redis:5.0.7 --cluster-enabled yes --appendonly yes --port 6388

docker start redis-node-7 redis-node-8

节点加入集群并且重新分配槽

docker exec -it redis-node-7 /bin/bash

redis-cli --cluster add-node 10.0.4.5:6387 10.0.4.5:6381

第一个节点192.168.1.138:6387 代表新增的

第二个节点192.168.1.138:6381 代表原集群里面的任意节点

redis-cli --cluster reshard 10.0.4.5:6381

新的节点加入集群,就需要重新分配槽,用redis-cli --cluster reshard ip:port 命令来重新分配槽;

ip:port指集群中任意一个节点就行

为master分配slave的命令

redis-cli --cluster add-node 10.0.4.5:6388 10.0.4.5:6387 --cluster-slave --cluster-master-id 7bc0d31d32206d0baea8f5a79c9c32fea34fc09a

新加入的slave : slave对应的master: 表示加入的是slave节点: 表示slave对应的master的node ID

add-node: 后面的分别跟着新加入的slave和slave对应的master

cluster-slave:表示加入的是slave节点

--cluster-master-id:表示slave对应的master的node ID

2.4 hash 槽缩容演练

查看一下,集群情况: redis-cli --cluster check 10.0.4.5:6387

步骤1: 把6387master对应的slave6388删除

redis-cli --cluster del-node 10.0.4.5:6388 aef44ab8b032bf371dde7deb37908d40ed232590

del-node后面跟着slave节点的 ip:port 和node ID

步骤2: redis-cli --cluster reshard 10.0.4.5:6381

步骤3:master的slave已清除,可直接删除

redis-cli --cluster del-node 10.0.4.5:6387 7bc0d31d32206d0baea8f5a79c9c32fea34fc09a

del-node后面跟着slave节点的 ip:port 和node ID