面试知识库

CAP → Raft → ZAB → 选主与脑裂 追问链#

追问路径#

涉及知识点#

核心串联逻辑#

  1. 共识的目标:在宕机和网络分区下让多副本对数据顺序和Leader达成一致,这是CP系统(ZK/etcd)的根基
  2. Raft三要素:Leader选举(任期+多数票)、日志复制(多数commit才生效)、安全性(只投日志更新者)
  3. 多数派防脑裂:任意两个多数派必有交集→不可能同时存在两个能提交的Leader;少数派分区无法服务,恢复后回滚
  4. 奇数节点:3节点容1故障、5节点容2,4节点也只容1故障所以偶数不划算
  5. ZAB vs Raft:思想相通(主+多数派),ZAB多了崩溃恢复阶段、用zxid保证全序广播,是ZooKeeper的底座
  6. 代码示例
    // Raft选举多数派门槛
    majority = N/2 + 1     // 3节点→2票当选,5节点→3票
    // ZK zxid结构(64位): 高32位epoch(任期/朝代) + 低32位counter(事务计数)
    //  epoch变化代表换主,counter保证单主内事务全序
    plaintext

面试回答串联#

30秒速答#

“共识算法解决多副本在宕机和分区下的数据一致,是CP系统的核心。Raft分选举、日志复制、安全性三块,任期单调递增、靠多数派N/2+1选主和提交日志。多数派保证不会脑裂双主——少数派分区凑不齐多数无法提交。ZAB是ZooKeeper的协议思想类似但多了崩溃恢复和zxid全序。ZK适合做锁、选主、配置这类CP场景,注册中心更常用AP。“

2分钟展开答#

“分布式系统需要共识算法是因为多个副本要对数据、操作顺序、谁是主节点达成一致,而且要在节点宕机和网络分区下依然保持一致,这是CP系统的核心诉求。Raft把共识拆成三部分:Leader选举、日志复制、安全性。每个任期term单调递增,任一时刻最多一个Leader。选举是Follower超时没收到心跳就变Candidate、自增term发起投票,拿到多数票N/2+1就当选,然后定期发心跳维持权威。日志复制是Leader接收写请求追加日志、复制到多数节点才commit再应用到状态机,靠日志匹配和’只投给日志比自己新的候选人’保证安全性。为什么必须多数派?因为任意两个多数派一定有交集,这就保证不可能同时选出两个能提交的Leader,所以网络分区时不会脑裂双写——少数派那边凑不齐多数选不出Leader也无法提交,只有多数派能继续服务,分区恢复后少数派回滚未提交的日志。集群推荐奇数节点是因为3节点容1故障、5节点容2,而4节点也只能容1,偶数不划算。ZAB是ZooKeeper的协议,思想和Raft相通都是主加多数派,区别是ZAB有专门的崩溃恢复阶段、用zxid(高32位epoch加低32位计数)保证全序广播。ZooKeeper因为CP强一致加顺序节点加Watch通知,适合做分布式锁、选主、配置中心,做锁比Redis好在临时顺序节点天然防死锁、不用续期、Watch前驱节点避免惊群,但性能低一个数量级。注册中心反而更看重可用性,所以Eureka和Nacos的AP模式更常用,分区时返回旧服务列表也比整个不可用强。“

相关追问链#