深入检出 Redis Cluster ②:集群伸缩
概述: 槽和数据在节点之间移动
1. 扩容
1.1. 添加节点
具体实现:
- redis-cli 命令: meet
- redis-trib 命令: ./redis-trib.rb add-node mhost:mport shost:sport
1.2. 迁移槽和数据
概述: 从源节点迁移数据到目标节点
- 目标节点准备导入槽 {slot}: 目标节点执行 cluster setslot {slot} importing {sourceNodeId}
- 源节点准备导出槽 {slot}: 源节点执行 cluster setslot {slot} migrating {targetNodeId}
- 获取源节点 {slot} 槽下的 {count} 个键: 源节点执行 cluster getkeysinslot {slot} {count}
- 批量迁移相关键的数据: 源节点执行 migrate {targetIp} {targetPort} key 0 {timeout}
- 循环迁移数据: 循环执行 3、4 步骤直到槽下所有的键数据迁移到目标节点
- 通知 {slot} 槽被目标节点负责: 向所有节点发送 cluster setslot {slot} node {targetNodeId}
具体实现:
- redis-trib.rb reshard host:port
2. 缩容
步骤:
- 迁移槽: 同扩容
- 所有节点遗忘下线节点: cluster forget {downNodeId}
- 关闭节点
具体实现:
- 迁移槽: redis-trib.rb reshard host:port –from {fromNodeId} –to {toNodeId} –slots {slotNums}
- 遗忘下线节点: redis-trib.rb del-node host:port {downNodeId}