Redis解析之集群(二)

本文深入解析Redis集群的工作机制,涵盖重新分片、请求重定向、节点失效检测、从节点选举等核心过程,以及key与slot的映射关系,帮助读者全面理解Redis集群的运作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、重新分片

当槽 slot 从节点 A 向节点 B 迁移时,节点 A 和节点 B 都有该 slot ,同时节点 A 上 slot 的状态为MIGRATING,节点 B 上 slot 的状态被为IMPORTING。

  • CLUSTER ADDSLOTS slot1 [slot2] … [slotN]
  • CLUSTER DELSLOTS slot1 [slot2] … [slotN]
  • CLUSTER SETSLOT slot NODE node
  • CLUSTER SETSLOT slot MIGRATING node
  • CLUSTER SETSLOT slot IMPORTING node

命令分析:
ADDSLOTS 与 DELSLOTS:表示向节点指派或者从节点移除槽 slot
CLUSTER SETSLOT slot NODE node:表示将槽 slot 指派给节点 node
MIGRATING / IMPORTING:表示将 槽 slot 迁移出或导入节点

注:
1)当某个 slot 处于 MIGRATING 状态时,原来负责该 slot 的节点仍会接收针对该 slot 的命令请求,但只有命令所对应的 key 仍存在于该节点时,该节点才会对请求进行处理;
2)当 某个 slot 处于 IMPORTING 状态时,若 key 不在该节点或未接收到 ASKING 命令,则返回客户端 MOVED 转向错误;否则,IMPORTING 节点仅在接收到 ASKING 命令之后,才会接收该 slot 的命令请求;

2、请求重定向

2.1、MOVED 转向

这里写图片描述

Redis客户端可向集群中任一 Master 或 Slave 节点发送命令请求:
1)节点对命令请求分析,若该命令是集群可执行的命令,则进一步查找命令的 key 所对应的 slot;
2)若 slot 刚好由该节点负责,则节点直接执行命令;否则,查找自身所保存的 clusterState::slots(slot 与 clusterNode 映射表),获取对应的节点 clusterNode,并向客户端返回一个 MOVED 错误(消息格式:-MOVED slot_id ip:port);
3)客户端收到消息后,根据 ip 和 port 自动向所属节点发送请求。

注:
1)当集群处于稳定状态时,所有客户端都存储着一个 slot 与节点的映射表,这样客户端可以直接向正确的节点发送命令请求,无须转向、代理或者其他任何可能发生单点故障。
2)MOVED 转向会更新客户端 slot 与节点的映射表,此后针对 slot 的命令请求都将直接发送至新的映射节点。

2.2、ASK 转向

1)当前节点收到命令请求后,若该节点找不到请求的 key,且 key 当前处于 MIGRATING 状态,则返回客户端 ASK 错误(其中包含槽对应的 IMPORTING 节点);
2)客户端向 IMPORTING 节点先发送一个 ASKING 命令(不可直接向IMPORTING 节点发送命令请求,否则这个针对 IMPORTING 状态的槽的命令请求将被 IMPORTING 节点拒绝);
3)MPORTING 节点收到 ASKING 命令后,将为客户端设置一个一次性的标志(flag),使得客户端可以执行一次针对 IMPORTING 状态的槽的命令请求;
4)客户端向 MPORTING 节点发送命令请求。

注:
ASK 转向不会更新 slot 与节点的映射表,此后针对该 slot 的命令请求仍发送至原节点。
3、节点失效检测

1)当一个节点向另一个节点发送 ping 命令时,若目标节点在规定时限内未进行响应,则发送节点会将目标节点标记为 PFAIL(possible failure,可能已失效);
2)每次节点向其他节点发送 ping 命令时,会告知自己所知道的节点信息(包括节点是否已被标记为 PFAIL 或 FAIL);
3)当目标节点收到其他节点发送来的信息后,会标记各节点的失效情况(这称为失效报告(failure report)),若至少一个节点认为某节点已 FAIL 或 集群中超过一半的节点都认为某节点已 PFAIL,则目标节点会将该节点标记为 PFAIL;

以下两种情况,节点的 FAIL 标记会被移除:
1)若被标记为 FAIL 的是 Slave 节点,则当该节点重新上线时, FAIL 标记会被清除(Slave 节点不处理任何槽,而一个 Slave 节点是否处于 FAIL 状态,只是决定这该节点能否被提升为 Master 节点,因此保持 Slave 节点的 FAIL 状态没有意义);
2)若被标记为 FAIL 的是 Master 节点,则若自被标记起,(4 * 节点超时时限 + 10秒)后,针对该 Master 的槽的故障转移仍未完成,并且该 Master 已经重新上线,则FAIL 标记会被清除。
4、从节点选举

参与选举条件为:
1)已下线 Master节点负责处理的槽数量非空;
2)该节点是已下线 Master 节点的从节点;
3)从节点的数据被认为是可靠的, 即主从节点之间的复制连接(replication link)的断线时长 <= 节点超时时限(node timeout) * REDIS_CLUSTER_SLAVE_VALIDITY_MULT。

若某 Slave 节点满足了以上的所有条件,则该节点将向集群中的其他 Master 节点发送授权请求,询问它们,是否允许自己升级为新的 Master。

其他 Master 同意 某 Slave 升级为 Master的条件:
1)发送授权请求的为 Slave 节点,并且它所属的 Master 处于 FAIL;
2)该 Slave 处于正常状态:没有被标记为 PFAIL 或 FAIL;
3)在该 Slave 所属的 Mater 下所有 Slave 中,该 Slave 的节点ID最小。

若已下线的Master 重新上线,则自身调整为现任主节点的从节点。

5、key 与 slot 映射关系

1)遍历 key,依次检索第一个字符“{”和第一个“}”;
2)若不存在字符“{”或“}”,亦或者第一个“{”与第一个“}”之间内容为空,则取整个 key 进行crc16运算;否则,取第一个“{”与第一个“}”之间内容进行crc16运算;
3)将“crc16运算结果&0x3FFF”,即取crc16运算低14位,为对应的 slot。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值