Redis Cluster 集群伸缩

集群伸缩

在已存在的集群中添加和删除集群节点,在集群伸缩的过程中伴随着虚拟槽在节点中的移动

集群扩容

  1. 准备新节点,把新节点配置为集群模式,相关配置信息和其他节点统一,启动后新节点是孤立节点,和集群之间还没有联系
  2. 使用 cluster meet newNodeIP newNodePort 把新节点加入到集群中,当然也可以使用官方的 redis-trib.rb的 相关命令来加入新节点(需要配置Ruby 环境~)。节点加入集群后,可以有两个作用:1. 为它迁移槽和数据实现扩容 ;2. 作为从节点负责故障转移
  3. 若新加入的节点大于一个,还可以进行主从分配, cluster replicate nodeId
  4. 迁移槽和数据
  • 制订迁移计划,每个节点要迁移多少个槽给新节点
  • 开始迁移操作
     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工具使用

集群收缩

  1. 下线集群节点之前,需要看节点是否持有槽,即是否有数据,若有,则需要迁移到其他节点
    redis-trib.rb reshard --from {downNodeId} --to {migrateNodeId} --slots {slotNumber} IP:Port,其中的 IP:Port,任意一个节点的 IP:Port都行哦~
  2. 通知其他所有节点忘记下线节点,cluster forget {downNodeId}_ 或者 redis-trib.rb del-node IP:Port {forgetNodeId} 。若有主从复制,要先下线从节点哦~

参考资料

[1] https://coding.imooc.com/class/151.html

Author: HB
Link: http://www.huangbin.fun/Redis-Cluster-集群伸缩.html
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.