在docker中部署redis多主多从集群,准备部署三对一主一从服务,共6个
首先获取镜像
这里使用的是6.0.8版本
docker pull redis:6.0.8
启动六个容器
docker run -d --name redis-node1 --net host --privileged=true -v /usr/local/redis/node1:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6371
docker run -d --name redis-node2 --net host --privileged=true -v /usr/local/redis/node2:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6372
docker run -d --name redis-node3 --net host --privileged=true -v /usr/local/redis/node3:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6373
docker run -d --name redis-node4 --net host --privileged=true -v /usr/local/redis/node4:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6374
docker run -d --name redis-node5 --net host --privileged=true -v /usr/local/redis/node5:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6375
docker run -d --name redis-node6 --net host --privileged=true -v /usr/local/redis/node6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6376
命令说明:
--net host : 使用宿主机的IP和端口,默认
--privileged=true : 获取宿主机root用户权限
-v /usr/local/redis/node1:/data : 挂载容器数据卷
--cluster-enabled yes : 开启redis集群
--appendonly yes : 开启持久化
构建主从关系
进入一个容器
docker exec -it redis-node1 /bin/bash
执行下面命令,下面命令中ip换成实际ip(记得打开6个容器使用的端口,以及每个端口+10000的端口,因为redis集群通信使用的端口是主端口+10000。我这里就打开了6371到6376 以及 16371到16376 几个端口)
--cluster-replicas 1 表示1主1从分配
redis-cli --cluster create 111.111.111.111:6371 111.111.111.111:6372 111.111.111.111:6373 111.111.111.111:6374 111.111.111.111:6375 111.111.111.111:6376 --cluster-replicas 1
执行后出现下面内容,显示主从对应关系,可以看到是3主3从,如果同意配置输入yes回车
yes之后出现下面内容表示成功
使用查看集群状态命令同样可以看到上面描述的对应关系等内容,如下
redis-cli --cluster check 111.111.111.111:6371
查看集群信息
同样使用docker exec命令进入容器1
连接redis客户端
redis-cli -p 6271
查看信息
cluster info
可以看到已知节点为6个
查看节点信息
cluster nodes
可以看到三个主节点和三个从节点的ip和端口,从对应的编码来看,4号从机挂在1号主机,5号从机挂在2号主机,6号从机挂在3号主机。这个对应关系不是固定的,可能下次部署的时候对应关系就不是这样了
测试数据读写
同样docker exec进入容器1
使用集群模式连接redis1(普通的单机版连接方式连接之后,存数据可能会出现error情况,原因是存的key计算的hash值跟16383取余之后,不在当前redis节点的存储范围)
后面加个-c就表示以集群方式连接
redis-cli -p 6371 -c
set一个k1 v1 ,会提示重定向到6373所在节点,因为k1计算出来的12706槽位在6373节点范围
宕机切换迁移
当一个主机宕机的时候,从机应该上位为主机
docker stop redis-node1 把6371节点停掉,之后稍等一会儿,等集群内部发心跳通知
进入6372容器,连接6372,查看集群状态
可以看到6371节点已经是fail了,并且之前他的从节点6374上位成了主节点
并且之前存的数据也是可以正常访问的
再次启动6371节点后,查看节点状态,发现6374依旧是master节点,6371变成了slave节点
如果希望还是恢复成原来的6371为主节点,可以把6374停一会儿再启动,两个节点身份就会再次互换回来