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 论文。