MST

星途 面试题库

面试题:Redis Cluster高可用分布式缓存架构的故障转移策略

当Redis Cluster中的某个节点发生故障时,系统是如何进行故障检测与故障转移的?请详细描述这个过程,并说明可能会遇到哪些问题以及对应的解决方案。
43.1万 热度难度
后端开发分布式系统

知识考点

AI 面试

面试题答案

一键面试

故障检测

  1. 主观下线(PFail)
    • 在Redis Cluster中,每个节点都会定期向其他节点发送PING消息进行心跳检测。
    • 如果一个节点在一定时间(cluster-node-timeout)内没有收到来自另一个节点的PONG响应,那么这个节点会将对方标记为PFail(Possible Fail),即主观下线。这只是节点自己认为对方可能故障了,还不是整个集群公认的故障。
  2. 客观下线(Fail)
    • 当一个节点标记另一个节点为PFail后,会通过Gossip协议将这个PFail信息传播给其他节点。
    • 如果半数以上持有槽的主节点都标记某个节点为PFail,那么这个节点就会被标记为Fail,即客观下线。此时,整个集群都认为该节点确实发生了故障。

故障转移

  1. 从节点发现主节点故障
    • 当主节点被标记为客观下线后,它的从节点会通过Gossip协议接收到这个信息,从而得知主节点发生了故障。
  2. 从节点竞选新的主节点
    • 所有发现主节点故障的从节点会发起竞选。每个从节点都会向其他节点发送FAILOVER_AUTH_REQUEST消息,请求其他节点给自己投票。
    • 其他节点在收到请求后,会根据一定规则(例如:优先投票给复制偏移量最大的从节点,即数据最新的从节点)决定是否投票。
    • 当某个从节点获得超过半数以上持有槽的主节点的投票时,它就赢得了竞选,成为新的主节点。
  3. 新主节点接管工作
    • 新的主节点会将自己的状态改为主节点,并开始接管原主节点负责的槽,继续为客户端提供服务。同时,它会向其他节点发送PONG消息,宣告自己成为新的主节点,让集群中的其他节点更新状态。

可能遇到的问题及解决方案

  1. 脑裂问题
    • 问题描述:网络分区导致部分节点之间通信中断,可能出现两个“集群”,其中一个“集群”可能会选举出新的主节点,而另一个“集群”中的原主节点还在正常工作。当网络恢复后,就会出现一个槽有两个主节点的情况,导致数据不一致。
    • 解决方案
      • 配置min - replicas - to - write参数:在Redis Cluster配置中设置min - replicas - to - write参数,该参数表示在主节点进行写操作时,必须有至少多少个从节点与之同步成功,写操作才会被认为是成功的。如果达不到这个数量,主节点就拒绝写操作,这样可以在一定程度上避免脑裂后数据丢失的问题。
      • 合理设置cluster - node - timeout:适当调整cluster - node - timeout参数,避免网络短暂波动就触发故障检测和转移,减少脑裂发生的概率。
  2. 数据不一致问题
    • 问题描述:在故障转移过程中,可能由于网络延迟等原因,导致从节点在复制主节点数据时存在部分数据未同步,成为新主节点后可能丢失部分数据,从而造成数据不一致。
    • 解决方案
      • 增加复制因子:增加从节点数量,提高数据的冗余度。即使某个从节点数据同步不完整,其他从节点可能有完整的数据,在故障转移时可以选择数据更完整的从节点。
      • 使用AOF持久化:结合AOF(Append - Only - File)持久化方式,记录写操作日志。在故障恢复后,可以通过重放AOF日志来恢复丢失的数据,确保数据一致性。