Appearance
第3章:复制、日志与 quorum
状态机复制
若每个副本从同一状态开始,以同一顺序执行相同的确定性命令,就得到相同状态。复制日志记录命令顺序,状态机负责解释命令。
命令若读取本地时间或随机数,各副本可能分歧。需要把相应选择纳入日志,或设计一致的执行规则。复制同一份程序不等于复制了相同输入与顺序。
主从复制与提交
领导者接收写入,复制到其他节点,再在满足协议条件时确认提交。若仅在本地内存写入后就返回成功,随后主节点丢失,已确认写可能消失。
同步复制提高确认成本,但可以增强故障下的保存保证;异步复制降低延迟,故障切换时可能丢失未传播更新。具体容错能力取决于确认条件、存储持久性和新主选择规则。
多数交集
N 个副本中,写 quorum 大小 W、读 quorum 大小 R,若 ,任意读写集合有交集;若 ,任意两个写集合有交集。
例如 N=3、R=W=2,每次读至少接触某个最近写 quorum 成员。但这本身不保证线性一致性:仍需处理并发版本、未完成写、读如何选择值,以及是否需要写回。
交集是协议证明的一块条件,不是完整协议。仅取“时间戳最大值”还要解释时间戳怎样生成以及并发如何排序。
故障切换与 fencing
旧领导者可能只是暂时失联,后来恢复并继续访问外部资源。新主建立后,需要阻止旧主产生被接受的效果。
递增任期或 fencing token 可由资源端验证,拒绝旧令牌请求。仅让旧主“自觉停止”不可靠,因为它可能无法及时获知失去领导权。
租约则依赖时间假设。使用时必须考虑时钟误差、暂停、续约和资源端验证,不能把本地超时当作全局独占证明。
练习
- 对 N=5 列出满足读写交集的 R、W 组合,比较成本与可用性。
- 为什么 majority 存储并不自动等于一个完整共识协议?
- 构造旧主恢复后仍写外部文件的情形,并说明 fencing 在哪里检查。