Redis(三十三):集群——ASK错误

  1. redis-trib重复3和4,直到槽中的所有键值对都被发送完

  2. redis-trib向集群中的任意一个节点发送命令,通知该节点已经将槽从源节点转移给目标节点了,这一指派信息会通过消息发送到整个集群,然后集群中的所有结点都会对应修改clusterNode结构

那么在进行重新分片期间,源节点向目标节点迁移一个槽的过程中,可能会出现下面的这种状态

属于被迁移槽的一部分键值对保存在源节点里面,而另一部分键值对则保存在目标节点里面(即部分迁移)

那么此时,客户端如果向源节点发送键值对命令,而该键值对所在的槽恰好是正在迁移的槽,那怎么办?

  • 源节点会首先在自己的数据库里面查找指定的键,如果找到的话,就直接执行客户端发送的命令

  • 如果找不到,那么就代表这个键很有可能被迁移到目标节点去了,源节点发发送一个ASK错误,指引客户端转向正在导入槽的目标节点,并再次发送之前想要执行的命令

  • ASK错误是不是跟MOVED错误很像,但ASK错误是针对重新分片过程,而MOVED错误只是节点不管理这个槽

在这里插入图片描述

注意,ASK错误跟MOVED错误也是被隐藏起来的,客户端接收到ASK错误也是不会打印出来的

Cluster SetSlot Importing命令的实现

cluster setslot importing是进行重新分片的第一步,redis-trib向目标节点发送该命令,准备好接收源节点的指定槽。

关于被导入的数组,是会被记录在目标节点的importing_slots_form数组中的,这个数组是一个clusterNode数组,是用来记录当前节点正在从哪些节点导入槽

typedef struct clusterState(

//…

clusterNode *importing_slots_from[16384];

//…

)clusterState;

可以看到这是一个clusterNode数组,但容量却是16384,对应的是槽的数量,使用索引i记录槽

举个栗子

假如importing_slots_from[i]指向的不是空,而是一个具体的clusterNode结构,那么就代表当前节点正在从这个clusterNode对应的节点导入槽i。

在对集群进行重新分片的时候,第一个命令是

cluster setslot importing <source_id>

i代表的是16384个槽中的哪个槽,source_id是代表节点在集群里面的runid

这条命令的作用其实就是,当目标节点接收到这条命令,会修改importing_slots_from数组,在索引为i的位置上,放入source_id对应的clusterNode结构

在这里插入图片描述

cluster setslot migrating命令的实现

cluster setslot migrating命令是对于第二个步骤,就是redis-trib向源节点发送该命令,让源节点准备发送槽的count个键值对。

在clusterState结构里面是使用一个migrating_slots_to数组来记录了当前节点正在迁移至其他节点的槽,也是一个clusterNode数组

typedef struct clusterState(

//…

clusterNode *migrating_slots_to[16384];

//…

)clusterState;

这个与importing_slots_from一样,也是使用索引代表槽,然后对应数组的位置有没有节点,去代表该槽是否正在被发送中,发送给里面对应的clusterNode

在对集群进行重新分片的时候,会向源节点发送命令

cluster setslots migrating <target_id>

i就代表槽的位置,target_id对应目标节点在集群中的runid。

当源节点收到该命令的时候,就会在migrating_slots_to[i]里保存target_id对应的custerNode节点

在这里插入图片描述

总体还是跟importing_slots_to很类似的

ASK错误

最后总结

ActiveMQ+Kafka+RabbitMQ学习笔记PDF

image.png

  • RabbitMQ实战指南

image.png

  • 手写RocketMQ笔记

image.png

  • 手写“Kafka笔记”

image

关于分布式,限流+缓存+缓存,这三大技术(包含:ZooKeeper+Nginx+MongoDB+memcached+Redis+ActiveMQ+Kafka+RabbitMQ)等等。这些相关的面试也好,还有手写以及学习的笔记PDF,都是啃透分布式技术必不可少的宝藏。以上的每一个专题每一个小分类都有相关的介绍,并且小编也已经将其整理成PDF啦

找小编(vip1024c)领取
+缓存,这三大技术(包含:ZooKeeper+Nginx+MongoDB+memcached+Redis+ActiveMQ+Kafka+RabbitMQ)等等。这些相关的面试也好,还有手写以及学习的笔记PDF,都是啃透分布式技术必不可少的宝藏。以上的每一个专题每一个小分类都有相关的介绍,并且小编也已经将其整理成PDF啦

找小编(vip1024c)领取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值