集群运行时间长久之后,难免由于硬件故障、网络规划、业务增长等原因对已有集群进行相应的调整, 比如增加Redis node节点、减少节点、节点迁移、更换服务器等。
增加节点和删除节点会涉及到已有的槽位重新分配及数据迁移。
1、集群维护之动态扩容
2、集群维护之动态缩容
动态扩容:
业务发展迅猛,现有的三主三从的redis cluster架构可能无法满足现有业务的并发写入需求,紧急采购两台服务器,需要将其动态添加到集群当中,但不能影响业务使用和数据丢失。
在已经做好的redis cluster架构上在加2台,增加Redis node节点,要与之前的Redis node版本相同、配置一致,分别再启动两台Redis node,应为一主一从。
我就用两台新的主机分别是redis-node7,10.0.0.168和redis-node8,10.0.0.169
node7和node8都要安装配置好redis,启动redis服务
添加这2个节点到集群
命令添加新节点,要添加的新redis节点IP和端口添加到的已有的集群中任意节点的IP:端口
add-node new_host:new_port existing_host:existing_port
##new_host:new_port #为新添加的主机的IP和端口
##existing_host:existing_port #为已有的集群中任意节点的IP和端口
一样的操作,再把10.0.0.169加入集群就可以了
新的node节点加到集群之后默认是master节点,但是10.0.0.168和10.0.0.169没有slots数据,需要重新分配
添加主机之后需要对添加至集群种的新主机重新分片否则其没有分片也就无法写入数据
重新分配槽位
在分配的过程中的几个选项:
How many slots do you want to move (from 1 to 16384)? 4096 # 分配多少个槽位=16384/master个数
What is the receiving node ID? #需要输入10.0.0.168的ID
Source node #1: all #将哪些源主机的槽位分配给新的节点,all是自动在所有的redis node选择划分,如果是从redis cluster删除某个主机可以使用此方式将指定主机上的槽位全部移动到别的redis主机
Do you want to proceed with the proposed reshard plan (yes/no)? yes #确认分配
一致的操作,再把10.0.0.169分配好slots
目前两个新的节点10.0.0.168,和10.0.0.169都已经加入集群了,为新的master添加slave节点
有2个方案:
1.在新加节点到集群时,直接将之设置为slave
直接命令行加为slave节点
redis-cli -a 123456 --cluster add-node 10.0.0.169:6379 10.0.0.162:6379 --cluster-slave --cluster-master-id id
2.先将新节点加入集群,再修改为slave
手动将其指定为某个master的slave,否则其默认角色为master
设置slave,命令格式为cluster replicate MASTERID
需要登录到从节点10.0.0.169的redis-cli,使用replicate为该节点指定主节点10.0.0.168
但是却报错显示:(error) ERR To set a master the node must be empty and without assigned slots
错误是不能为一个非空并且分配了slot的主节点继续添加从节点
解决办法:将主从节点置空并且清除为其指定的slots,两个都得清空。
然后进入10.0.0.169redis-cli重新执行 CLUSTER REPLICATE ID 可以成功。
最后查看新加入的master10.0.0.168和slave10.0.0.169的节点信息
原文:https://www.cnblogs.com/liuyakai/p/14774417.html