redis cluster在水平扩容和数据迁移过程中,需要经历如下阶段:
1.set slot as migrating on the source node
2.set slot as importing on the target node
3.execute migrate command on the source node
4.setslot <slot> NODE <node-id> to finish and propagate the change to the whole cluster
在进行完前两部后,对于client发送的在目标slot的查询请求,redis cluster将进行如下处理:
所有已存在的key由source node处理 / 所有不存在的key由target node处理(通过redirection),从而避免在目标节点重复创建新key。
其中第三步by slot分批进行:
1.使用CLUSTER GETKEYSINSLOT slot count获取一定数量的key列表。
2.使用"MIGRATE target_host target_port key target_database id timeout"将key进行迁移,该过程为原子,source & target node将被锁住,完成后解锁,保证一个key在同一时刻只存在于一个node。