面试题答案
一键面试1. 节点发现
- Gossip 协议:Redis 集群采用 Gossip 协议进行节点发现。每个节点会定期向其他节点发送
PING
消息,消息中包含自己的状态以及部分已知节点的信息。例如,节点 A 向节点 B 发送PING
消息,其中携带了节点 A 自身的状态以及它所知道的节点 C、D 的信息。 - 节点列表更新:接收到
PING
消息的节点会根据消息中的节点信息更新自己的节点列表。如果发现新节点,会将其加入到自己的节点列表中,并尝试与新节点建立连接。
2. 心跳消息交互
- PING 消息:各个节点周期性地向其他节点发送
PING
消息,通常每秒会向多个随机节点发送。PING
消息携带发送节点的基本信息,如节点 ID、配置纪元、槽分配信息等。这使得接收节点能够及时了解发送节点的状态。 - PONG 消息:当节点接收到
PING
消息后,会回复PONG
消息。PONG
消息内容与PING
消息类似,确认了接收节点的状态,并让发送节点知晓接收节点已收到PING
消息。例如,节点 B 收到节点 A 的PING
消息后,回复PONG
消息,告知节点 A 自己正常运行。 - FAIL 消息:当一个节点判定另一个节点为疑似下线(PFAIL)时,会向其他节点发送
FAIL
消息,通知其他节点该节点可能已下线。
3. 状态判断逻辑
- 节点可达性判断:如果节点在一定时间内(如配置的
cluster-node-timeout
时间)没有收到来自某个节点的PONG
消息,那么该节点会将对方标记为疑似下线(PFAIL)。例如,节点 A 持续一段时间未收到节点 B 的PONG
回复,则节点 A 标记节点 B 为 PFAIL。 - 故障确认:当半数以上持有槽的主节点都标记某个节点为 PFAIL 时,这个节点会被标记为已下线(FAIL)。此时,集群会发起故障转移流程,由从节点晋升为主节点来替代已下线的主节点继续提供服务。例如,集群中有 5 个持有槽的主节点,若其中 3 个都标记节点 X 为 PFAIL,则节点 X 被确认为 FAIL。