Skip to content

状态型 CRDT

State-based CRDT · Convergent replicated data type · CvRDT · 状态收敛 CRDT

通过膨胀本地状态、交换状态摘要并取 join,在乱序和重复传输下收敛的复制数据类型。

条目类型
模型

形式陈述

一个 state-based CRDT(CvRDT)由状态集合 S、查询函数、mutator 与 merge 构成,其代数结构同时满足三项条件:

  1. S 是 join-semilattice;
  2. 每个本地 mutator 满足膨胀更新 xm(x)
  3. merge 恰为最小上界 xy

这三项说明相同信息如何确定同一状态。要进一步推出所有持续正确副本最终收敛,部署还需一条传播活性前提:包含每次更新的某个状态最终送到每个这样的副本。该前提不要求每个中间快照恰一次到达;消息可以丢失、重复或乱序,只要后续某个状态支配被漏掉的更新并最终送达,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)N2。副本 A 只增加第一分量,B 只增加第二分量,merge 逐分量取最大。初始均为 (0,0);A 离线执行两次得到 (2,0),B 执行一次得到 (0,1)。B 先收到 A 的旧快照 (1,0)

(0,1)(1,0)=(1,1).

稍后收到 (2,0)(2,1);重复收到 (1,0) 仍是 (2,1)。A 收到 B 的任意后继状态也到达 (2,1),查询和为三。乱序与重复均未要求传输层特殊处理。

若 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.
关系图谱9 个相邻概念 · 4 类关系

拖动节点调整位置。

显示关系

显示:依赖

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

上位 / 更一般

暂未标注直接上位概念。

下位 / 直接特例

类型化关系

使用的工具

被这些条目使用

并列辨析