3主3从搭建
使用docker能快速的扩缩容redis集群。
使用docker创建3主3从的Redis集群配置首先要求先从docker的仓库中下载redis的镜像。
使用如下命令拉取redis镜像文件。
docker pull redis
redis镜像拉取完毕之后,就可以快速的开启多个redis容器了,而想要配置3主3从的redis集群首先就需要先创建6个redis容器。
使用如下命令可以快速创建完毕6个redis容器
docker run -d --name redis-node-1 --net host --privileged=true -v /data/redis/share/redis-node-1:/data redis:latest --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:latest --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:latest --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:latest --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:latest --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:latest --cluster-enabled yes --appendonly yes --port 6386
创建完毕redis容器之后,进入其中某一个redis容器之中,并且进行集群的构建。
redis-cli --cluster create 192.168.146.119:6381 192.168.146.119:6382 192.168.146.119:6383 192.168.146.119:6384 192.168.146.119:6385 192.168.146.119:6386 --cluster-replicas 1
如果显示如上内容说明集群主从配置已经配置成功了,3主3从已经配置成功了。
然后使用如下命令就可以查看集群状态了
redis-cli -p 6381 cluster info
使用cluster nodes就可以查看每个集群的哈希槽的分配范围以及主从关系。
其中第一个UUID是该redis的id,第一个UUID就是从机对应的主机的id。
例如6385端口的redis的主机就是37ff也就是6383端口对应的redis。
6381----》6386
6382----》6384
6383----》6385
集群数据插入错误的解决
在按照如上方式配置完毕3主3从之后,向redis插入数据的时候就会经过哈希槽了,而不是直接向登录的redis客户端进行数据插入,因此登录某个客户端插入数据的时候,如果根据哈希算法分配到的redis节点不是当前登录的redis客户端,那么就会报错,如下
因此必须有一个办法去解决这种情况。
而这种解决方法就是在登录客户端的时候以集群环境登录,如下
此时如果当前key对应的槽位不为当前的redis客户端,那么这个key就会自动被路由到对应的槽位对应的redis中去,因此我们当前登录的redis客户端将无法查询到被重定向到其他redis客户端的数据,情况如下
登录到6382对应的redis之后就可以发现我在6381端口的redis中插入的数据被重定向到6382了,当然,只要你读取的key在这些redis节点中,那么查询请求也会自动重定向过去
主从容错切换迁移
使用如下命令可以查看目前集群的情况,可以分析得出每个节点的主从关系。
redis-cli --cluster check ip:端口 # 查看集群配置
而设置主从集群,首先就是为了应付大数据量的存储的同时还能防止由于redis服务器宕机导致的服务失效问题,因此主从集群要求主节点宕机之后从节点代替主节点的位置,也就是进行主从之间的迁移,让从机代替主机的位置,在没有集群模式之前,哨兵模式可以解决这个问题,主从模式虽然可以解决这个问题,但是却要求运维人员手动进行故障切换,因此集群模式合并了哨兵与主从模式的优点,会自动的进行故障迁移。
目前情况是,6381(主机)的从机是6386。因此我们需要验证6381下机之后,6386是否会变为主机,同时在6381恢复之后6381是否会变为6386的从机。
首先对6381进行下线。
docker stop redis-node-1
此时可以登录6382进行验证,来判定6386是否变为了主节点,同时判定6381下机之后6386是否保留了原有的存留在6381节点里的数据。
使用cluster nodes命令对目前集群节点进行状态查看,可以发现6386成功上位变为了master,而6381的状态为fail
之后我们重启6381
可以发现6381变为了6386的从机,6386上位成功。
之所以6386在6381上线之后会继续保持主机的位置是由于6386在得知主机下线之后被redis服务器设定了slave of noone命令,也就是6386再也不做从机了,并且redis服务器会在6381上线之后对6381发送slave of 6386的命令,因此6381一上线就是6386的从机。
主从扩容
有的时候可能3主3从的redis集群也已经不够用了,此时就需要对集群进行扩容,例如变为4主4从redis集群。
但是有一个问题就是在3主3从的时候redis的哈希槽已经分配完毕了,那么如果此时再添加一个redis主从结构,应该怎么做呢?
首先,就是先添加两台redis服务器,方法按照上面的即可
此时这两台redis服务器与原本的redis集群并没有联系。
那么就先进入新增的节点进行配置。
docker exec -it redis-node-7 bash
然后我们先将6387添加到集群中。
redis-cli --cluster add-node 192.168.146.119:6387 192.168.146.119:6381
添加完毕之后先检查一下集群状态,可以发现已经变为了四台主机
redis-cli --cluster check 192.168.146.119:6381
其中认真看可以发现新加入的节点的槽位是0,也就是还没有被分配槽位,那么此时由于这个节点没有槽位,那么无论插入什么样子的数据都不会被分配到该redis节点进行存储,因此之后我们需要对这个redis节点进行槽位的分配。
我们可以使用如下命令进行槽位的重新分配
redis-cli --cluster reshard 192.168.146.119:6381
进行槽位的重新分配的时候,会出现提示询问要分配多少个槽位给每个的主机,此时一共又16384个,我们除以主机数4得到4096
之后会询问要接收这4096个槽位的redis的id,那么我们就输入6387对应的redis的id即可。
之后会询问选择那些redis来为新的节点提供槽位,那么我们直接选择all,让每一个原先的redis主机平均分配一点节点给新redis节点。
当然,如果你了解redis的槽位分配的话,也可以自己手动的进行槽位的分配,比较麻烦就是了。
分配完毕之后再次查看集群状态,可以发现6387已经有了三个槽位了。
槽位分配完毕之后,我们就可以把6388这个从机添加到集群中作为6387的从机了。
redis-cli --cluster add-node 192.168.146.119:6388 192.168.146.119:6387 --cluster-slave --cluster-master-id 5918d8ddce56e58c035763704fad06d7ecc1efd0
到此位置集群扩容已经完成了。
主从缩容
主从缩容的问题在于,槽位如何重新分配以及先删从节点还是先删主节点。
这里先删除从节点
redis-cli --cluster del-node 192.168.146.119:6388 33768461763aae07b412be731e2782bead0b82c
redis-cli --cluster reshard 192.168.146.119:6381
之后输入要重新分配的槽位大小,这里我们刚才新添加的节点的槽位大小为4096
第二个参数填写需要被分配这些槽位的redis的id,这里填写6386,他是一个主机
下一个参数填写需要分配出去空间的redis的id,这里填写6387,然后输入done表示确认。
此时再把6387给删除就没有问题了
redis-cli --cluster del-node 192.168.146.119:6387 5918d8ddce56e58c035763704fad06d7ecc1efd0
再次查看集群状态可以发现集群以及变为了3主3从了。