-
redis-trib重复3和4,直到槽中的所有键值对都被发送完
-
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
关于分布式,限流+缓存+缓存,这三大技术(包含:ZooKeeper+Nginx+MongoDB+memcached+Redis+ActiveMQ+Kafka+RabbitMQ)等等。这些相关的面试也好,还有手写以及学习的笔记PDF,都是啃透分布式技术必不可少的宝藏。以上的每一个专题每一个小分类都有相关的介绍,并且小编也已经将其整理成PDF啦
找小编(vip1024c)领取
+缓存,这三大技术(包含:ZooKeeper+Nginx+MongoDB+memcached+Redis+ActiveMQ+Kafka+RabbitMQ)等等。这些相关的面试也好,还有手写以及学习的笔记PDF,都是啃透分布式技术必不可少的宝藏。以上的每一个专题每一个小分类都有相关的介绍,并且小编也已经将其整理成PDF啦
找小编(vip1024c)领取