知识卡片
单领导者复制通过纪元编号与法定人数回避而非消除共识
内容
单主复制看似不需要共识就能提供全序广播(主库把所有写入排到自己的复制日志里),但要让主库能自动做领导者选举和故障切换,本身就需要节点间对”谁是新主库”达成一致——这形成一个先有鸡还是先有蛋的困境:全序广播依赖单一领导者,选出领导者又需要一种共识。真实的容错共识算法(Paxos/Raft/Zab类)用纪元编号(Paxos叫投票编号、Raft叫任期号、视图戳复制叫视图编号)打破这个循环:纪元编号全序且单调递增,每次怀疑现任领导失效就发起一轮新选举并分配更高的纪元号,若不同纪元的领导者冲突,编号更高者胜出。领导者的每个提议决定都必须先获得一个法定人数(通常是多数)节点的投票,且这个投票法定人数必须与最近领导选举的法定人数相互重叠——只要提案表决期间没有出现更高纪元号,现任领导就能确认没有发生更高时代的选举,从而安全做出决定。这个”两轮投票、法定人数重叠”的机制正是它比2PC更健壮的关键:2PC要求全部参与者同意且协调者非选举产生,而共识算法只需多数同意、领导者可被重新选举。
结构图:
flowchart TD
A[现任领导者被怀疑失效] --> B[发起新一轮领导选举]
B --> C[分配递增的纪元编号 higher wins]
C --> D[领导者对每个提议向法定人数节点征求投票]
D --> E{表决期间是否出现更高纪元号?}
E -->|否: 与选举法定人数重叠可证明| F[现任领导可安全决定提议值]
E -->|是| G[承认更高纪元领导 放弃决定]
参考来源
- 位置:《数据密集型应用系统设计》第九章《一致性与共识》"单领导者复制与共识""纪元编号和法定人数"(源文件:_epub-src/ch9_split_001.html)
- 结论依据:原文指出手动选主不满足共识的终止属性,自动选主又形成"选领导需要共识、共识需要领导"的循环,并给出纪元编号与法定人数重叠机制说明容错共识算法如何打破这个循环,直接支撑本卡片结论及结构图。
- 原始内容:要选出一个领导者,我们首先需要一个领导者……协议定义了一个纪元编号……并确保在每个时代中,领导者都是唯一的……这两次投票的法定人群必须相互重叠。