redis cluster 重新分片

redis cluster 重新分片

面试时,可以和面试官聊到redis集群模式中的哈希槽的作用,但是再深点,redis重新分片时,访问被迁移的数据会有问题吗?redis是怎么做的?就答不上来了,故在此总结一下。

什么是重新分片?

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-20210918000112919

重新分片流程

image-20210918000220755

ASK重定向

Redis集群支持在线迁移槽(slot)和数据来完成水平伸缩,当slot对应的数据从源节点到目标节点迁移过程中可能出现一部分数据在源节点,而另一部分在目标节点,客户端需要做到智能识别,保证键命令可正常执行。

槽在迁移中发生请求的流程:

  1. 客户端根据本地slots缓存发送命令到源节点(扩容前存在的节点),如果存在键对象则直接执行并返回结果给客户端。
  2. 如果键对象不存在,则可能存在于目标节点(扩容新增节点),这时源节点会回复ASK重定向异常。格式如下:(error)ASK {slot} {targetIP}:{targetPort}
  3. 客户端从ASK重定向异常提取出目标节点信息,发送asking命令到目标节点打开客户端连接标识,再执行键命令。如果存在则执行,不存在则返回Null

重定向流程图

image-20210918000629832

参考:

参考一(重新分片):Redis集群-重新分片

参考二(迁移数据ASK重定向):Redis cluster 扩容缩容重新分片

参考三(关于redis高可用架构很不错的文章):Redis 高可用解决方案总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值