“全状态 CvRDT 可直接发送 $X i$,接收端执行 $X j:=X j\sqcup X i$。结合、交换、幂等使乱序和重复安全;反熵无需记住每个数据包是否已经到达。优化协议先交换版本向量…”
形式陈述 ​
一个 state-based CRDT(CvRDT)由状态集合
是 join-semilattice; - 每个本地 mutator 满足膨胀更新
; - merge 恰为最小上界
。
这三项说明相同信息如何确定同一状态。要进一步推出所有持续正确副本最终收敛,部署还需一条传播活性前提:包含每次更新的某个状态最终送到每个这样的副本。该前提不要求每个中间快照恰一次到达;消息可以丢失、重复或乱序,只要后续某个状态支配被漏掉的更新并最终送达,join 就会吸收它。工程中通常由反熵同步反复交换整状态、摘要或 delta 来实现这种 eventual dissemination。
收敛证明很短却不能少条件。若副本最终吸收的更新信息集合相同,它们的状态都是这些膨胀贡献与初态的 join;结合、交换、幂等使表达式与合并树和重复次数无关。若某更新永远没有传播,代数只保证“相同信息给相同状态”,不能凭空让信息出现。
传播确认还要对应持久吸收,而不只是网络收包。若 B 在内存中 merge 后向 A 确认、随即崩溃并从旧快照恢复,而 A 已据确认丢掉唯一副本,更新仍会消失。持久化顺序、重放日志或至少一个仍持有信息的正确副本必须进入 eventual dissemination 的故障假设。
CvRDT 也不要求状态是集合。组件最大值、带因果上下文的版本集合和序列节点图都可形成半格;关键是内部偏序表达信息包含,而非 query 输出表面上是否递增。
直觉
状态型同步像交换“我目前知道的一切”。一个副本不必重放对方经历过的操作,只需把对方摘要与自己摘要合并。join 的幂等性让全状态可以经 gossip 多次绕圈;某个包重复一百次仍只贡献一次信息。
这种宽容以状态体积为代价。若每次发送整张集合或整幅序列,带宽会随历史增长;delta-state、Merkle 摘要和压缩因果上下文用于缩小传输,却必须保持与全状态 join 相同的抽象效果。删掉看似陈旧的 tombstone 若没有稳定性证明,会让旧状态重新占上风。
本页与操作型 CRDT的差别在同步单位和证明义务。CvRDT 传播可幂等合并的状态;CmRDT 传播 effectors,必须管理因果顺序与重复执行。两者可以实现相同用户 API,却不是在未对齐网络假设时可互换的协议。
例子与边界
两副本 G-Counter 的状态为
稍后收到
若 A、B 都可直接写第一分量,二者从零并发写成一,merge 最大仍为一,丢掉一次 increment;这不是半格失效,而是状态表示违反“每分量唯一 writer”的数据类型前提。若计数器使用会溢出的固定宽度整数,最大值序在回绕点也不再代表信息增长。
永久分区是传播边界:两边各自膨胀且内部正确,但永远不会收敛。状态型 CRDT 还不提供 linearizable read;分区期间 A 读到二、B 读到一都合法。
推论与应用
CvRDT 很适合 at-least-once gossip、离线副本和多路径复制,因为 merge 天然吸收重复。数据库可按对象或 shard 交换 version summary,再只发送缺失状态;若摘要误报“已包含”某更新,eventual dissemination 就被破坏,收敛证明随之失去前提。
设计审查应分别验证半格、mutator 与传播公平性。只展示 merge 的三条定律不够;直接删除状态、非持久 replica ID、未经协调的成员重用以及不安全垃圾回收,都可能让看似正确的 join 接收到已失真的信息。快照字节完全相同不是要求;压缩表示只要具有相同 query 和未来 join 行为,就可视为同一抽象状态。
参考资料
- Marc Shapiro et al., “Conflict-Free Replicated Data Types,” SSS 2011, LNCS 6976, pp. 386–400.
- Marc Shapiro, Nuno Preguiça, Carlos Baquero, and Marek Zawirski, “A Comprehensive Study of Convergent and Commutative Replicated Data Types,” INRIA RR-7506, 2011, Secs. 2–3.
- Paulo Sérgio Almeida, “Approaches to Conflict-Free Replicated Data Types,” ACM Computing Surveys 56(3), Article 76, 2024, Secs. 3–4.