redis cluster 重新分片
redis cluster 重新分片
面试时,可以和面试官聊到redis集群模式中的哈希槽的作用,但是再深点,redis重新分片时,访问被迁移的数据会有问题吗?redis是怎么做的?就答不上来了,故在此总结一下。
什么是重新分片?
Redis集群的重新分片操作可以将任意数量已经指派给某个节点(源节点)的槽改为指派给另一个节点(目标节点),并且相关槽所属的键值对也会从源节点移动到目标节点。
**重新分片可以在线进行,在重新分片的过程中,集群不需要下线,**并且源节点和目标节点都可以继续处理命令请求。
实现原理
Redis集群的重新分片操作是由Redis的集群管理软件 redis-trib
负责执行的,Redis提供了进行重新分片所需的所有命令,而 redis-trib
则通过向源节点和目标节点发送命令来进行重新分片操作。
redis-trib
对集群的单个槽slot进行重新分片的步骤如下∶
redis-trib
对目标节点发送CLUSTER SETSLOT <slot> IMPORTING <source_id>
命令,让目标节点准备好从源节点导入(import)属于槽slot
的键值对。redis-trib
对源节点发送CLUSTER SETSLOT <slot> MIGRATING <target_id>
命令,让源节点准备好将属于槽 slot
的键值对迁移(migrate)至目标节点redis-trib
向源节点发送CLUSTER GETKEYSINSLOT <slot> <count>
命令,获得最多count
个属于槽 slot
的键值对的键名(key name)。- 对于步骤3获得的每个键名,
redis-trib
都向源节点发送一个MIGRATE <target_ip> <target_port> <key_name> 0 <timeout>
命令,将被选中的键原子地从源节点迁移至目标节点。 - 重复执行步骤3和步骤4,直到源节点保存的所有属于
槽slot
的键值对都被迁移至目标节点为止。每次迁移键的过程如图17-24所示。 redis-trib
向集群中的任意一个节点发送CLUSTER SETSLOT <stlo> NODE <targetid>
命令,将槽slot
指派给目标节点,这一指派信息会通过消息发送至整个集群,最终集群中的所有节点都会知道槽 slot
已经指派给了目标节点。
迁移键过程
重新分片流程

ASK重定向
Redis集群支持在线迁移槽(slot)
和数据来完成水平伸缩,当slot
对应的数据从源节点到目标节点迁移过程中可能出现一部分数据在源节点,而另一部分在目标节点,客户端需要做到智能识别,保证键命令可正常执行。
槽在迁移中发生请求的流程:
- 客户端根据
本地slots缓存
发送命令到源节点(扩容前存在的节点),如果存在键对象则直接执行并返回结果给客户端。 - 如果键对象不存在,则可能存在于目标节点(扩容新增节点),这时源节点会回复
ASK
重定向异常。格式如下:(error)ASK {slot} {targetIP}:{targetPort}
。 - 客户端从
ASK
重定向异常提取出目标节点信息,发送asking命令
到目标节点打开客户端连接标识,再执行键命令。如果存在则执行,不存在则返回Null
。
重定向流程图

参考:
参考一(重新分片):Redis集群-重新分片
参考二(迁移数据ASK重定向):Redis cluster 扩容缩容重新分片
参考三(关于redis高可用架构很不错的文章):Redis 高可用解决方案总结