一、增加节点
Redis集群提供了灵活的节点扩容和收缩方案。在不影响集群对外服务的情况下,可以为集群添加节点进行扩容也可以下线部分节点进行缩容。扩容与缩容的本质是,对Redis的槽进行重新的分配。
集群现有6379、6380、6381 三个主节点,因为数据压力,增加一个主节点6385,需要对之前槽方案进行重新分配,并进行数据迁移
二、重新分片流程
原命令:
- 制订槽分配计划,确保每个节点负责相似数量的槽,从而保证各节点的数据均匀。
- 对目标节点(增加的6385主键点)发送cluster setslot{slot}importing{sourceNodeId}命令,让目标节点准备导入槽的数据。
- 对源节点(集群扩容前存在的节点6379…)发送cluster setslot{slot}migrating{targetNodeId}命令,让源节点准备迁出槽的数据。
- 源节点循环执行cluster getkeysinslot{slot}{count}命令,获取count个属于槽{slot}的键。
- 在源节点上执行migrate{targetIp}{targetPort}""0{timeout}keys{keys…}命令,把获取的键通过流水线(pipeline)机制批量迁移到目标节点。
- 重复执行步骤3)和步骤4)直到槽下所有的键值数据迁移到目标节点。
- 向集群内所有主节点发送cluster setslot{slot}node{targetNodeId}命令,通知槽分配给目标节点。为了保证槽节点映射变更及时传播,需要遍历发送给所有主节点更新被迁移的槽指向新节点。