Redis集群的重新分片操作可以将任意数量已经指派给某个节点(源节点)的槽改为指派给另一个节点(目标节点),并且相关槽所属的键值对也会从源节点移动到目标节点。
重新分片可以在线进行,在重新分片的过程中,集群不需要下线,并且源节点和目标节点都可以继续处理命令请求。
实现原理
Redis集群的重新分片操作是由Redis的集群管理软件 redis-trib负责执行的,Redis提供了进行重新分片所需的所有命令,而 redis-trib则通过向源节点和目标节点发送命令来进行重新分片操作。
redis-trib对集群的单个槽slot进行重新分片的步骤如下∶
1)redis-trib对目标节点发送CLUSTER SETSLOT<slot>IMPORTING <source_id>命令,让目标节点准备好从源节点导入(import)属于槽slot的键值对。
2)redis-trib对源节点发送CLUSTER SETSLOT <slot>MIGRATING<target_id>命令,让源节点准备好将属于槽 slot的键值对迁移(migrate)至目标节点。
3)redis-trib向源节点发送CLUSTER GETKEYSINSLOT<slot><count>命令,获得最多 count 个属于槽 slot 的键值对的键名(key name)。
4)对于步骤3获得的每个键名,redis-trib都向源节点发送一个MIGRATE <target_ip><target_port><key_name>0<timeout>命令,将被选中的键原子地从源节点迁移至目标节点。
5)重复执行步骤3和步骤4,直到源节点保存的所有属于槽slot的键值对都被迁移至目标节点为止。每次迁移键的过程如图17-24所示。
6)redis-trib向集群中的任意一个节点发送CLUSTER SETSLOT<stlo> NODE <targetid>命令,将槽slot指派给目标节点,这一指派信息会通过消息发送至整个集群,最终集群中的所有节点都会知道槽 slot 已经指派给了目标节点。
image.png
网友评论