集群
ASK错误
在进行重新分片期间,源节点向目标节点迁移一个槽的过程中,可能会出现这样一种情况:属于被迁移槽的一部分键值对保存在源节点里面,而另一部分键值对则保存在目标节点里面。当客户端向源节点发送一个与数据库有关的命令,并且命令要处理的数据库键恰好就属于正在被迁移的槽时:
- 1.源节点会先在自己的数据库里面查找指定的键,如果找到的话,就直接执行客户端发送的命令
- 2.相反地,如果源节点没能在自己的数据库里面找到指定的键,那么这个键有可能已经被迁移到了目标节点,源节点没能在自己的数据库里面找到指定的键,那么这个键有可能已经被迁移到了目标节点,源节点将向客户端返回一个ASK错误,指引客户端转向正在导入槽的目标节点,并再次发送之前想要执行的命令
例子
- 举个例子。如图展示了源节点判断是否需要向客户端发送ASK错误的整个过程,假设节点7002正在向节点7003迁移槽16198,这个槽包含"is"和"love"两个键,其中键"is"还留在节点7002,而键"love"已经被迁移到了节点7003,如果我们向节点7002发送关于键"is"的命令,那么这个命令会直接被节点7002执行:
127.0.0.1:7002>GET "is"
"you get the key 'is'"
而如果我们向节点7002发送关于键"love"的命令,那么客户端会先被转向至节点7003,然后再次执行命令:
127.0.0.1:7002> GET "love"
-> Redirected to slot [16198] located at 127.0.0.1: