“固定成员下,可让每个副本通过反熵同步确认因果前沿。若版本摘要为Dotted Version Vector或普通版本向量,逐 actor 取所有成员 acknowledgment 的下确界,得…”
形式陈述 ​
反熵同步是副本间反复比较并修复差异的后台协议。每个正确副本在无限执行中公平地选择伙伴,采用 push、pull 或 push-pull 交换状态、版本摘要或缺失片段。对 CRDT 而言,所需活性条件可表述为:每个已被正确副本持久吸收的更新信息,最终被所有持续正确且属于当前成员集的副本吸收。
全状态 CvRDT 可直接发送
网络公平性不是“每轮都成功”。允许暂时分区、丢包和副本崩溃;要求分区最终愈合、同步尝试持续发生,并且更新在至少一个正确副本上保持到传播完成。若所有持有某更新的副本在落盘前永久丢失,任何 epidemic 机制都无法重建它。
伙伴图也必须在时间上提供传播路径。每轮拓扑不必连通,但对任意更新和目标成员,后续成功会话的并集应包含从某个持有者到目标的路径。只让两个机架各自在内部公平 gossip,会在各机架内收敛,却永远不能满足全成员 eventual delivery。
成员身份属于协议状态。新节点需要基线同步,退役节点必须从稳定性计算中安全移除;允许带陈旧磁盘状态的旧身份任意重加入,会破坏删除证据回收所依赖的“所有成员均已见”判断。
直觉
前台复制追求低延迟,偶尔漏掉消息;反熵像周期盘点,不依赖那一次发送是否成功,而是不断比较“我们各自知道到哪里”。状态半格让重复盘点便宜于推理,摘要则让大多数已一致轮次不必搬运全部数据。
Push 让新更新快速扩散,却难以发现发送者不知道自己缺什么;pull 擅长补洞,但远端要先被选中;push-pull 同轮双向交换,通常传播更快。随机 gossip 的概率保证与确定成员轮询的公平保证不同,部署应说明失败概率、伙伴选择和最大修复延迟,而不能只说“最终会 gossip 到”。Rumor mongering 在消息传播若干轮后可能主动停止,anti-entropy 则持续比较完整摘要以发现罕见遗漏;两者可组合但活性论证不同。
反熵保证的是信息传播,不自动提供因果会话。客户端可能先从 A 读到新值,再从尚未同步的 B 读到旧值;read-your-writes、monotonic reads 或因果一致性需要路由、session token 或依赖检查。缩短同步周期只能缩小这种窗口,不能把它变成协议安全保证。
例子与边界
三个副本初态均为空,状态是 grow-only set。A 加入
第二轮 C 与 B 做 push-pull,双方都得到
第三轮 B push 给 A,A 也到达
现在让 A 删除
Merkle tree 也有边界:相同根摘要可高效证明分片内容相同,但树的分区规则、哈希抗碰撞假设和叶内容编码必须一致。只比较对象数量或最大时间戳不是无假阴性的摘要。
推论与应用
反熵为“eventual”提供可审计机制:可以监控每个伙伴的 acknowledgment frontier、修复队列年龄和分区覆盖,而非仅观察最终读值。Delta-state 同步把全状态差异缩成 delta interval,因果 CRDT 则用版本摘要决定哪些 dots 缺失。监控应按逻辑成员而非短命进程统计,否则频繁重启会掩盖一个成员长期没有完成修复。
垃圾回收常复用反熵确认:只有删除证据已进入所有成员的稳定前沿,才可能回收。这个推论依赖封闭或受控成员集;动态扩缩容必须用 epoch、全量引导或禁止旧身份重入,把“未来不会再带来旧状态”变成协议事实。Acknowledgment 应表示修复内容已持久化,而非仅进入易失接收缓冲区。
参考资料
- Alan Demers et al., “Epidemic Algorithms for Replicated Database Maintenance,” PODC, 1987, pp. 1–12.
- Marc Shapiro et al., “A Comprehensive Study of Convergent and Commutative Replicated Data Types,” INRIA RR-7506, 2011, Sec. 3.
- Werner Vogels, “Eventually Consistent,” Communications of the ACM 52(1), 2009, pp. 40–44.