一、启动六台redis
命令解释如下:
- 分别起名redis-node-1~6;
- -d:开启后台;
- --net host:使用宿主机的ip和端口;
- --privileged=true:开启权限;
- -v:数据卷备份;
- redis:6.0.8:启用的镜像是redis:6.0.8;
- --cluster-enabled yes:是否开启集群:确认开启;
- --appendonly yes:开启持久化;
- 端口号分别是6381~6;
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
二、构建主从关系
配置ip,注意!此处的ip地址为真实ip地址(ifconfig查看ens33)
- --cluster create:构建集群;
- --cluster-replicas 1 :表示为每个master创建一个slave节点 (即一主一从形式)
docker exec -it redis-node-1 /bin/bash
redis-cli --cluster create 192.168.138.156:6381 192.168.138.156:6382 192.168.138.156:6383 192.168.138.156:6384 192.168.138.156:6385 192.168.138.156:6386 --cluster-replicas 1
输入上述命令后,将会产生三台master的redis,以及三台slave的reds 。
其架构如下所示(redis最多拥有16384个槽,平均分配给3个主节点redis):
Can I set the above configuration? (type 'yes' to accept): yes
成功后显示如下:
- 3主3从,M是master、S是slave;
- 端口6381~3为主,6384~6为从;
三、以6381作为切入点,查看集群状态
redis-cli -p 6381
cluster info
cluster nodes
可查看到redis一共有16384个槽,并且一共存在6个节点。
cluster nodes可以更详细的查看到节点信息、挂载信息,是自动随机挂载的。
- Master Slave
- 6381 6385
- 6382 6386
- 6383 6384
为防止路由失效,不能使用以前单机的 redis-cli -p 6381 因为redis集群以及分配了对应的槽,若存储的数据的槽位不在当前redis,则会出现存储失败。
集群环境下应该加参数c,优化路由:redis-cli -p 6381 -c
redis集群会自动寻找对应插槽位置并重定向路由至对应的redis插槽。
查看集群状态的另一条命令: redis-cli --cluster check 192.168.138.156:6381
表示当前redis集群中有3个keys存在与3个master中,两个存在6381,一个存在8383.
四、主从切换
主机宕机时,从机会上位充当主机。
- Master Slave
- 6381(宕机) 6385(上位切换)
- 6382 6386
- 6383 6384
下面模拟6381宕机,查看6385是否自动上位。
- docker stop redis-node-1:关闭6381,模拟宕机。
- docker exec -it redis-node-2 /bin/bash:进入节点2的redis
- redis-cli -p 6382 -c:查看集群状态
- 发现6381宕机,但是6385自动上位成为了master,主从切换成功。
若此时6381启动成功,则6381降级为slave从机,6385保持master主机。
若想保持6381为主机,则手动stop6385即可。