新添加的节点是没有哈希曹的,所以并不能正常存储数据,需要给新添加的节点分配哈希槽。
增加节点的顺序是先增加Master主节点,然后在增加Slave从节点。
删除的顺序是先删除Slave从节点,然后在删除Master主节点。

分配方式

  1. 在其他节点拿出适量的哈希槽分配到目标节点
  2. 在指定的节点拿出指定数量的哈希槽分配到目标节点

分配来源

all , 需要分配给目标节点的哈希槽来着当前集群的其他主节点,每个节点拿出的数量为集群自动决定
某个节点的id,这种情况下,需要分配给目标节点的哈希槽就由该节点全部承担(节点id可以输入多个,回车分割,输入done结束)。

ps =ef | grep redis
redis-cli --cluster reshard  ip:port

迁移数据

数据迁移过程是逐个槽进行的
1)对目标节点发送cluster setslot{slot}importing{sourceNodeId}命令,让目标节点准备导入槽的数据。
2)对源节点发送cluster setslot{slot}migrating{targetNodeId}命令,让源节点准备迁出槽的数据。
3)源节点循环执行cluster getkeysinslot{slot}{count}命令,获取count个 属于槽{slot}的键
4)在源节点上执行migrate{targetIp}{targetPort}""0{timeout}keys{keys...} 命令,把获取的键通过流水线(pipeline)机制批量迁移到目标节点,批量 迁移版本的migrate命令在Redis3.0.6以上版本提供,之前的migrate命令只能 单个键迁移。对于大量key的场景,批量键迁移将极大降低节点之间网络IO次数。
5)重复执行步骤3)和步骤4)直到槽下所有的键值数据迁移到目标节点。
6)向集群内所有主节点发送cluster setslot{slot}node{targetNodeId}命令,通知槽分配给目标节点。为了保证槽节点映射变更及时传播,需要遍历发送给所有主节点更新被迁移的槽指向新节点。