面试题答案
一键面试Redis集群内节点间复制的基本流程
- 主从配置:在Redis集群中,通过配置文件或命令(如
SLAVEOF
)指定从节点复制主节点。从节点启动后,向主节点发送SYNC
命令请求全量同步。 - 全量同步:主节点收到
SYNC
命令后,执行BGSAVE
生成RDB快照文件,同时将新的写命令缓存在内存中。生成RDB文件后,主节点将其发送给从节点,从节点接收并加载RDB文件,恢复数据状态。 - 增量同步:全量同步完成后,主节点将缓存的写命令发送给从节点,从节点执行这些命令,保证数据与主节点一致。此后,主节点每执行一个写命令,都会向从节点发送,从节点实时同步数据。
主节点故障时故障转移的自动触发和执行
- 故障检测
- 主观下线:每个节点都会定期向其他节点发送
PING
消息进行心跳检测。如果一个主节点在一定时间(如cluster-node-timeout
配置时间)内没有回复PONG
响应,那么发送PING
的节点会将这个主节点标记为PFAIL
(主观下线)。 - 客观下线:当一个节点发现某个主节点为主观下线时,会向其他节点发送
FAIL
消息询问该主节点状态。如果超过半数持有槽的主节点都认为该主节点下线(通过FAIL
消息确认),那么这个主节点会被标记为FAIL
(客观下线),触发故障转移。
- 主观下线:每个节点都会定期向其他节点发送
- 故障转移涉及的关键组件
- 哨兵(Sentinel):Redis Sentinel是一个分布式系统,用于监控Redis主从架构中的主节点状态。它通过定期向主从节点发送心跳检测,判断节点是否正常运行。当主节点故障时,Sentinel会自动发现并选举新的主节点。
- 集群节点:集群中的各个节点通过Gossip协议互相交换状态信息,包括节点的存活状态、负责的槽位等。这使得节点间能够及时了解集群的整体状态,从而在主节点故障时协同完成故障转移。
- 故障转移执行步骤
- 选举领导者Sentinel:在Sentinel集群中,当检测到主节点故障后,Sentinel之间会进行选举,选出一个领导者Sentinel来执行故障转移操作。选举算法基于Raft算法变种,通过投票机制,得票超过半数的Sentinel成为领导者。
- 选择新主节点:领导者Sentinel从该主节点的从节点列表中选择一个从节点作为新的主节点。选择规则通常包括:从节点优先级(通过
slave-priority
配置)、复制偏移量(复制进度)、运行ID(随机生成)等。优先选择优先级高、复制偏移量大、运行ID小的从节点。 - 故障转移操作:领导者Sentinel向选中的从节点发送
SLAVEOF NO ONE
命令,将其提升为新的主节点。然后向其他从节点发送SLAVEOF
命令,让它们成为新主节点的从节点。同时,更新集群配置,通知客户端新的主节点地址。