在进行重新分片期间,可能会出现一种情况:源节点向目标节点迁移一个槽的过程中,属于被迁移槽的一部分键值对保存在源节点里面,而另一部分键值对则保存的在目标节点里面。
当客户端向源节点发送一个和数据库有关的命令,并且命令要处理的数据库键恰好就属于正在被迁移的槽时:
image.png
接到ASK错误的客户端会根据错误提供的IP地址和端口号,转向至正在导入槽的目标节点,然后首先向目标节点发送一个ASKING命令,之后再重新发送原本想要执行的命令。
ASKING命令
ASKING命令唯一要做的就是打开发送该命令的客户端的REDIS ASKING标识
在一般情况下,如果客户端向节点发送一个关于槽i的命令,而槽i又没有指派给这个节点的话,那么节点将向客户端返回一个MOVED错误;但是,如果节点的clusterState.importing_slots_from[i]显示节点正在导人槽i,并且发送命令的客户端带有REDIS_ASKING标识,那么节点将破例执行这个关于槽i的命令一次。
image.png
网友评论