Skip to content

算法Algorithm

视图戳复制

施工中 · 内容逐步修订

Viewstamped Replication · VR

用视图变更和主副本日志在崩溃故障下复制状态机的协议。

形式陈述 ​

视图戳复制(VR)在 2f+1 个副本中容忍至多 f 个崩溃故障,用连续视图维护复制日志。视图号 v 标识一届 primary,操作号 n 标识日志位置,提交号 k 标识已经可执行的前缀。成员按视图规则确定 primary,故领导者选择不是凭收到的第一条自荐消息决定。

正常处理时,primary 为新请求分配操作号,把请求放入日志并发送 PREPARE(v,n,request,k)。Backup 先补齐缺失前缀,再记录请求并回复 PREPAREOK。Primary 收到 f 个 backup 的确认后,连同自己形成大小 f+1 的quorum,才依序执行、推进提交位置并回复客户端;后续消息携带提交位置,使 backup 依序执行。

副本进入更高视图时立即把状态改为 view-change,停止接受旧视图的 PREPARE,并广播 STARTVIEWCHANGE;收到另外 f 个不同副本对同一新视图的 STARTVIEWCHANGE 后,才向新 primary 发送 DOVIEWCHANGE。因此发出日志报告前,至少 f+1 个副本已经知道换视图正在进行。视图变更不能只选择最长日志。新 primary 收集 f+1 份 DOVIEWCHANGE,先比较报告者最后处于正常状态的视图号,同号再比较操作号,选择最高者的日志,并继承报告中的最大提交号。这一选择规则与 quorum 相交一起保护旧的已提交前缀。

2012 年 VR Revisited 不要求每次通信前写磁盘,而以复制状态保存信息。失去内存状态的恢复节点保持 recovering,不参与正常处理或视图变更;它发送带本次唯一 nonce 的恢复请求,等待 f+1 个不同副本的、nonce 匹配的回复,其中必须包括这些回复所报告的最高视图的 primary。只有 normal 副本回复恢复请求;恢复节点采用该 primary 提供的日志及操作号、提交号等状态后,才回到 normal。安全前提是证据在存活副本及恢复流程中连续保留,不能简单写成“所有节点都持久化日志”。

直觉

操作号回答“这一请求排在哪里”,视图号回答“谁有权为当前日志续写”。原始 VR 以二元组 (view-number,op-number) 称为 viewstamp,比较时先看视图号,同视图再看操作号。超时只使副本开始换届,不能证明旧 primary 已死亡;安全来自新视图继承旧证据,而不是来自超时准确。

多数交点也不是自动证明。新 primary 若只采用自己喜欢的一份日志,仍可能丢掉交点报告的已提交请求;按最近正常视图、再按长度选择日志,才把集合相交变成前缀继承。恢复节点暂时不能投票,正是为了避免一个忘记旧证据的节点被误算成可靠交点。

例子与边界

设 f=1,副本为 A、B、C。A 是 primary,把操作 10 发送给 B,B 记入日志并确认,A 执行后回复客户端;C 尚未收到操作 10。A 随后崩溃,新视图 quorum 为 B、C。B 的报告携带操作 10,视图变更必须把它带入新日志,不能因为 C 的日志更短就回退已完成请求。

再看恢复窗口:B 断电重启并丢失内存日志后,若立即同 C 组成新 quorum,二者可能都不知道操作 10。故 B 必须先恢复状态再重新参与;若存有唯一剩余证据的节点也在恢复完成前丢失状态,便超出这套无磁盘容错保证。全机房同时断电而无任何持久副本不在该保证之内。

客户端若没有收到操作 10 的回复,会重发同一请求。client-id/request-number 及保存的结果用于识别同一次调用,让新 primary 返回旧结果而不再次执行。新请求应使用新编号;仅凭相同参数不能判断是否重试。拜占庭副本能伪造或选择性隐瞒日志,不能使用上述崩溃模型的继承论证。

推论与应用

VR 用 view 编号、operation 编号、正常复制与 view change 具体维护复制日志,再由状态机复制应用 committed 操作。它与 Paxos、Raft共享 quorum 相交这一安全骨架;VR 的语义中心是 primary 更替时怎样继承证据,而不是再次定义复制日志接口。

安全依赖日志证据跨视图保留,活性则依赖最终稳定的时序与正确 primary。工程实现还需 checkpoint、日志截断、客户端去重和成员配置变更,才能把论文级安全前缀变成持久服务。

对固定配置的 n=2f+1 个副本,正常视图中、备份已追平且无重试时,一次请求的复制、确认和提交通知使用 O(n) 条消息。基本视图变更的 STARTVIEWCHANGE 全体通知可用 O(n2) 条消息;若各方发送完整的、长度至多为 L 的保留日志,则 DOVIEWCHANGE 与 STARTVIEW 合计传送 O(nL) 个日志条目。每个副本的存储还包括保留日志、成员配置和客户端请求/结果表;实际 payload、应用状态与记录的字节数另计,恢复和重试也有额外代价。

参考资料
  • 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。
关系图谱17 个相邻概念 · 3 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系