Hotdry.
systems-engineering

CRDT 类型词典:变体、代数操作与合并策略指南

CRDT变体详解:从G-Counter到OR-Set的代数结构、合并策略及冲突自由复制的选择标准与工程参数。

CRDT(Conflict-free Replicated Data Types,无冲突复制数据类型)是分布式系统中实现最终一致性的核心工具,通过设计数据结构确保副本间无协调即可合并为相同状态。其数学基础是半格(semilattice):状态形成偏序,合并操作⊔满足交换律(a ⊔ b = b ⊔ a)、结合律((a ⊔ b) ⊔ c = a ⊔ (b ⊔ c))和幂等律(a ⊔ a = a)。更新单调递增,确保任意顺序合并收敛。

状态型 CRDT(CvRDT)传输全状态并合并;操作型 CRDT(CmRDT)传输操作需因果传递。本文聚焦 CvRDT 变体,列出核心类型、代数操作、合并策略及选择指南。

计数器类(Counters)

G-Counter(增长计数器):每个副本维护自身计数,总值∑各计数。

  • 操作:increment (r): counter [r] += 1
  • 合并:unionWith max(逐副本取最大)
  • 适用:仅增场景,如浏览量。空间 O (副本数),无垃圾回收。

PN-Counter(正负计数器):组合两个 G-Counter,P 记录增量、N 记录减量,总值 P-N。

  • 操作:increment (r): P.increment (r);decrement (r): N.increment (r)
  • 合并:分别合并 P/N
  • 适用:库存、点赞退赞。缺点:可负值,无原子重置。

集合类(Sets)

G-Set(增长集合):标准集合,仅支持添加。

  • 操作:add (x): insert x
  • 合并:union
  • 适用:追加日志。无法删除。

2P-Set(两阶段集合):added 与 removed 各一 G-Set,成员 = added \ removed。

  • 操作:add (x): added.insert (x);remove (x): removed.insert (x)
  • 合并:分别 union
  • 策略:删除优先,一旦删除不可再加。适用:任务完成追踪。

LWW-Element-Set(最后写入胜集合):addTimes/removeTimes 各 Map<x, Timestamp>,成员若 add 时间 > remove 时间。

  • 操作:add/remove 带时间戳
  • 合并:unionWith max 时间戳
  • 策略:最后写入胜,需时钟同步。适用:特性标志,可 GC 旧戳。

OR-Set(观察移除集合):Map<x, Set>,Tag=(replica, seq) 唯一标识添加。成员若 Tag 非空。

  • 操作:add (x): 生成新 Tag insert;remove (x): 移除观察到的 Tag
  • 合并:union Tag 集
  • 策略:添加胜,并发 add/remove 保留 add(未观察 Tag)。如 Ian Duncan 所述,此为最复杂集合 CRDT,支持全 CRUD 无 LWW 丢失。[1]

寄存器类(Registers)

LWW-Register:(value, timestamp),合并取最新戳。简单但并发丢失。
MV-Register:Set<(value, timestamp)>,保留并发值,应用层解析。

序列 / 映射类(Sequences/Maps)

RGA(复制增长数组):树结构,元素存 (value, parent UID),插入指定后继。删除墓碑。合并调和树。适用:协同文本,O (log n) 操。
OR-Map:键为 OR-Set,值为嵌套 CRDT。支持 put/removeKey/removeValue。

选择矩阵

需求 \ 类型 仅增 增减不可重加 全 CRUD 序列 嵌套
推荐 G-Counter/Set PN/2P OR/LWW RGA OR-Map
合并 max/union 组件 union unionWith max/union Tag 树调和 递归
风险 空间 O (r) 双空间 Tag 墓碑 线性化 O (n) 复杂 GC

选择依据操作语义:仅增用 G-;需删优先 2P/OR;容忍 LWW 用其简化;序列用 RGA/YATA。

工程参数与落地

Delta-CRDT:仅传增量 δ-state,减少带宽。参数:track per-replica lastSent,delta=state since lastSent。

垃圾回收(GC)阈值

  • 时间窗:90 天过期 Tag(保守,防离线 > 窗)。
  • 界限 Tag:每元素≤1000,超取最新(降 LWW)。
  • 因果:用版本向量,丢弃被主导 VV 的 Tag。监控:oldest_unsynced_ts - 安全裕度 = GC 线。回滚:checkpoint 快照 +δ 日志,新副本全传。

落地清单:1. 选 CRDT 组合(如购物车 OR-Set+PN);2.δ+GC;3. 因果广播(如 gossip);4. 性能:读写比高选 OR,副本多选 Delta。库:Yjs(文本)、Automerge(JSON)。

来源:[1] https://www.iankduncan.com/engineering/2025-11-27-crdt-dictionary (Ian Duncan CRDT 词典);Shapiro et al. CRDT 论文。

查看归档