🤝 一致性协议
Raft · ZAB · Paxos · Gossip——选举、复制与收敛
1. Raft 协议的核心机制?(必考)
角色:Leader(处理写入)、Follower(被动复制)、Candidate(选举中)。任期 term 递增。
三大机制:
- Leader 选举:
- Follower 超时未收到心跳(election timeout,随机 150~300ms)→ 变 Candidate 自增 term 投票
- 获得大多数(过半)选票成为 Leader;平票则随机超时再选
- 过半机制保证:一个任期内最多一个 Leader(每张票只投一次)
- 日志复制:
- 客户端写请求 → Leader 追加日志 → 复制到 Follower → 过半确认后提交并返回成功
- 日志带任期和索引,Follower 检查连续性(prevLogIndex/prevLogTerm)——保证日志一致
- 安全性:
- 选举限制:Candidate 的日志必须"足够新"(最后一条日志的任期/索引)才有资格当选
- 提交限制:Leader 不能提交旧任期的日志(只有当前任期的日志过半才提交,顺带提交之前未提交的)
🎯 面试要点
- Raft 的选票"先到先得 + 每任期一票"是单 Leader 的保证
- 过半 = 多数派:3 节点容忍 1 宕机,5 节点容忍 2 宕机(容错 = (n-1)/2)
- 应用:ETCD(配置中心/锁)、Consul、RocketMQ DLedger、Kafka KRaft
2. ZAB 协议(ZooKeeper)与 Raft 的异同?
ZAB(ZooKeeper Atomic Broadcast):ZooKeeper 的原子广播协议,三个角色:Leader / Follower / Observer。两大阶段:
- 崩溃恢复:Leader 挂了 → 选举新 Leader → 同步数据(新 Leader 与 Follower 对齐未提交事务)
- 消息广播:写请求 → Leader 以 zxid(事务 ID)排序广播 → 过半 ack → 提交
与 Raft 对比:
- 相同:Leader 制、过半提交、任期/纪元机制(epoch 对应 term)
- 不同:Raft 用"随机超时选举 + 日志连续性校验";ZAB 用"zxid 大小比较"(zxid = epoch + 自增序号,天然有序);Raft 更易理解实现,ZAB 专为 ZooKeeper 设计
🎯 面试要点
- ZooKeeper 的 ZNode 临时节点 + watch 机制 → 分布式锁/配置中心/注册中心
- zxid 前半部分(epoch)防"旧 Leader 复活篡权"
- ZooKeeper 是 CP 系统:分区时牺牲可用性保一致性
3. Paxos 和 Gossip 协议?
- Paxos:分布式共识的开山理论(Lamport 提出)。核心思想:prepare(承诺)→ accept(提案)→ 多数派通过。Raft 是 Paxos 的简化工程版(多 Paxos)。理解"多数派 + 两阶段"即可,不必背细节(面试考 Raft 更多)
- Gossip(流言协议):节点间随机互传信息,最终一致(AP 风格)。特点:去中心、可扩展(O(log n) 收敛)、健壮。应用:Redis Cluster 节点状态同步、Cassandra 副本同步、区块链 P2P
🎯 面试要点
- 对比:Raft/Paxos 是强一致(CP),Gossip 是最终一致(AP)——按场景选
- Redis Cluster 的心跳(gossip)互传节点状态,
cluster-node-timeout默认 15000 ms;超时先标记 PFAIL,再由多数 master 确认后升级为 FAIL