“状态机提供确定性转移语义,复制日志提供共同命令前缀;Paxos、Raft与Viewstamped Replication是日志层的具体协议。状态机复制由此支撑高可用键值存储、配置服务、数据库…”
形式陈述
视图戳复制(VR)在
正常处理时,primary 为新请求分配操作号,把请求放入日志并发送 PREPARE(v,n,request,k)。Backup 先补齐缺失前缀,再记录请求并回复 PREPAREOK。Primary 收到
副本进入更高视图时立即把状态改为 view-change,停止接受旧视图的 PREPARE,并广播 STARTVIEWCHANGE;收到另外 STARTVIEWCHANGE 后,才向新 primary 发送 DOVIEWCHANGE。因此发出日志报告前,至少 DOVIEWCHANGE,先比较报告者最后处于正常状态的视图号,同号再比较操作号,选择最高者的日志,并继承报告中的最大提交号。这一选择规则与 quorum 相交一起保护旧的已提交前缀。
2012 年 VR Revisited 不要求每次通信前写磁盘,而以复制状态保存信息。失去内存状态的恢复节点保持 recovering,不参与正常处理或视图变更;它发送带本次唯一 nonce 的恢复请求,等待 normal 副本回复恢复请求;恢复节点采用该 primary 提供的日志及操作号、提交号等状态后,才回到 normal。安全前提是证据在存活副本及恢复流程中连续保留,不能简单写成“所有节点都持久化日志”。
直觉
操作号回答“这一请求排在哪里”,视图号回答“谁有权为当前日志续写”。原始 VR 以二元组 (view-number,op-number) 称为 viewstamp,比较时先看视图号,同视图再看操作号。超时只使副本开始换届,不能证明旧 primary 已死亡;安全来自新视图继承旧证据,而不是来自超时准确。
多数交点也不是自动证明。新 primary 若只采用自己喜欢的一份日志,仍可能丢掉交点报告的已提交请求;按最近正常视图、再按长度选择日志,才把集合相交变成前缀继承。恢复节点暂时不能投票,正是为了避免一个忘记旧证据的节点被误算成可靠交点。
例子与边界
设
再看恢复窗口:B 断电重启并丢失内存日志后,若立即同 C 组成新 quorum,二者可能都不知道操作 10。故 B 必须先恢复状态再重新参与;若存有唯一剩余证据的节点也在恢复完成前丢失状态,便超出这套无磁盘容错保证。全机房同时断电而无任何持久副本不在该保证之内。
客户端若没有收到操作 10 的回复,会重发同一请求。client-id/request-number 及保存的结果用于识别同一次调用,让新 primary 返回旧结果而不再次执行。新请求应使用新编号;仅凭相同参数不能判断是否重试。拜占庭副本能伪造或选择性隐瞒日志,不能使用上述崩溃模型的继承论证。
推论与应用
VR 用 view 编号、operation 编号、正常复制与 view change 具体维护复制日志,再由状态机复制应用 committed 操作。它与 Paxos、Raft共享 quorum 相交这一安全骨架;VR 的语义中心是 primary 更替时怎样继承证据,而不是再次定义复制日志接口。
安全依赖日志证据跨视图保留,活性则依赖最终稳定的时序与正确 primary。工程实现还需 checkpoint、日志截断、客户端去重和成员配置变更,才能把论文级安全前缀变成持久服务。
对固定配置的 STARTVIEWCHANGE 全体通知可用 DOVIEWCHANGE 与 STARTVIEW 合计传送
参考资料
- Barbara Liskov and James Cowling, Viewstamped Replication Revisited, MIT-CSAIL-TR-2012-021, 2012,§§4.1–4.3:正常处理、视图变更与恢复。
- Nancy A. Lynch, Distributed Algorithms, Morgan Kaufmann, 1996,Chs. 1–25。