深入检出 Redis Cluster ②:集群伸缩

概述: 槽和数据在节点之间移动
image.png

1. 扩容

1.1. 添加节点

具体实现:

  1. redis-cli 命令: meet
  2. redis-trib 命令: ./redis-trib.rb add-node mhost:mport shost:sport

1.2. 迁移槽和数据

概述: 从源节点迁移数据到目标节点
image.png

  1. 目标节点准备导入槽 {slot}: 目标节点执行 cluster setslot {slot} importing {sourceNodeId}
  2. 源节点准备导出槽 {slot}: 源节点执行 cluster setslot {slot} migrating {targetNodeId}
  3. 获取源节点 {slot} 槽下的 {count} 个键: 源节点执行 cluster getkeysinslot {slot} {count}
  4. 批量迁移相关键的数据: 源节点执行 migrate {targetIp} {targetPort} key 0 {timeout}
  5. 循环迁移数据: 循环执行 3、4 步骤直到槽下所有的键数据迁移到目标节点
  6. 通知 {slot} 槽被目标节点负责: 向所有节点发送 cluster setslot {slot} node {targetNodeId}

具体实现:

  • redis-trib.rb reshard host:port

2. 缩容

步骤:

  1. 迁移槽: 同扩容
  2. 所有节点遗忘下线节点: cluster forget {downNodeId}
  3. 关闭节点

具体实现:

  • 迁移槽: redis-trib.rb reshard host:port –from {fromNodeId} –to {toNodeId} –slots {slotNums}
  • 遗忘下线节点: redis-trib.rb del-node host:port {downNodeId}