前提
Redis cluster 集群模式下,在对数据库中的16384个槽位进行了指派之后,集群就会进入上线状态,这时客户端就可以向集群中的节点发送命令。
?思考:
既然 16384个槽位分别在不同的机器上(数据分布在不同的机器上),那我客户端访问的时候应该访问哪一台机器去尝试操作?又怎么知道数据的分布呢?
其实,当客户端向节点发送与数据库有关的命令的时候,接收到命令的节点会计算出命令要处理的数据库键属于哪个槽,并检查这个槽是否指派给了自己(Redis集群中每个机器 都保存了槽位的信息分布,如果槽位信息变化了,都会以消息的形式进行传播)
(1)如果键所在的槽位正好在指派给了当前节点,那么节点直接运行这个命令。
(2)如果键所在的槽位并没有指派给当前节点,那么节点回想客户端返回一个MOVED错误,指引客户端转向(redirect)到正确的节点上去,并再次发送之前想要执行的命令
?思考:
如果在重新分片的时候,槽位键信息正在转移,而我们要访问的键刚好就在这部分转移的部分,那应该怎么访问?
(1)访问节点会现在自己的数据库里面查找指定的键,如果找到的话,就直接执行客户端命令
(2)如果源节点没能找到在自己的数据库里面找到指定的键,那么这个键可能已经被迁移到了目标节点,源节点将向客户端返回一个ASK错误,指引客户端转向正在导入槽的目标节点,并在此发送之前想要执行的命令
ASK错误和MOVED错误的区别
ASK错误和MOVED错误都会导致客户端转向,区别在哪?
(1)MOVED错误代表槽的负责权已经从一个节点转移到了另一个节点:客户端收到关于槽i的MOVED错误之后,客户端每次遇到关于槽i的命令请求时,都可以将命令请求发送到MOVED错误所指向的节点,因为该节点就是目前负责槽i的节点
(2)ASK错误只是两个节点在迁移槽的过程中使用的一种临时措施:在客户端收到关于槽i的ASK错误之后,客户端只会在接下来的一次命令请求中将关于槽i的命令请求发送至ASK错误所指向的节点,这种转向不会对客户端关于槽i的命令请求产生任何影响,客户端仍然会将关于槽i的命令请求发送至目前负责处理槽i的节点,除非ASK错误再次出现







还没有评论,来说两句吧...