集群伸缩
在已存在的集群中添加和删除集群节点,在集群伸缩的过程中伴随着虚拟槽在节点中的移动
集群扩容
- 准备新节点,把新节点配置为集群模式,相关配置信息和其他节点统一,启动后新节点是孤立节点,和集群之间还没有联系
- 使用 cluster meet newNodeIP newNodePort 把新节点加入到集群中,当然也可以使用官方的 redis-trib.rb的 相关命令来加入新节点(需要配置Ruby 环境~)。节点加入集群后,可以有两个作用:1. 为它迁移槽和数据实现扩容 ;2. 作为从节点负责故障转移
- 若新加入的节点大于一个,还可以进行主从分配, cluster replicate nodeId
- 迁移槽和数据
- 制订迁移计划,每个节点要迁移多少个槽给新节点
- 开始迁移操作
a. 对目标节点: cluster setslot {slot} importing {sourceNodeId} 让目标节点准备导入槽的数据
b. 对源节点: cluster setslot {slot} migrating {targetNodeId} 让源节点准备迁出槽的数据
c. 源节点循环执行 cluster getkeysinslot {slot} {count} 每次获取count个属于槽的键
d. 在源节点执行 migrate {targetIp} {targetPort} key 0 {timeout} 命令把指定key迁移,0 表示数据库0
e. 重复执行步骤 3 ~ 4直到槽下所有的键数据迁移到目标节点
f. 向集群内所有主节点发送 cluster setslot {slot} node {targetNodeId} 命令,告诉所有主节点 槽分配给了目标节点
上述的迁移操作很是繁琐,可以使用官方提供的redis-trib.rb的相关命令进行操作。使用 redis-trib.rb reshard IP:Port 进行交互模式来完成槽的移动 - redis-trib工具使用
集群收缩
- 下线集群节点之前,需要看节点是否持有槽,即是否有数据,若有,则需要迁移到其他节点
redis-trib.rb reshard --from {downNodeId} --to {migrateNodeId} --slots {slotNumber} IP:Port,其中的 IP:Port,任意一个节点的 IP:Port都行哦~ - 通知其他所有节点忘记下线节点,cluster forget {downNodeId}_ 或者 redis-trib.rb del-node IP:Port {forgetNodeId} 。若有主从复制,要先下线从节点哦~