“安全压缩由CRDT 墓碑垃圾回收另行证明;仅知道值已删除,不足以证明节点不再是未来操作的 anchor。”
形式陈述 ​
墓碑是“某 add、insert 或版本已经删除”的持久证据。回收墓碑
- 删除事件及其全部因果前驱已被当前成员集中所有正确副本持久吸收;
- 没有仍可加入同步的成员会重新发送被
压制的旧状态; - 若
是结构 anchor,没有已生成但未交付、也没有协议仍允许新生成的操作引用它; - 崩溃恢复、备份和新成员引导都从越过该稳定点的 checkpoint 开始。
固定成员下,可让每个副本通过反熵同步确认因果前沿。若版本摘要为Dotted Version Vector或普通版本向量,逐 actor 取所有成员 acknowledgment 的下确界,得到 global stable frontier;删除 dot 被该前沿支配是必要信号。Acknowledgment 必须表示删除及前驱已落入可恢复持久状态,而非刚进入易失内存。动态成员还需 epoch、受协调 retirement 或全量重新引导,禁止旧身份携陈旧磁盘状态任意重入。
对RGA,值删除稳定不等于节点可删。Tombstone 可能仍是迟到 insert 的 anchor;只有所有可能引用它的事件已交付,且客户端不能带旧 context 继续创建引用,才能物理删除或用保持遍历位置的稳定重定向替代。
TTL 不是稳定性证明。墙钟到期只说明等待了一段时间,不能证明离线副本、延迟消息和旧备份均已越过删除。上述确认还默认副本非 Byzantine;恶意或损坏节点伪造前沿时,需要认证、校验与另一套故障模型。
直觉
删除证据的任务是反驳旧副本:“你带来的 add 我早已见过并删除。”证据只有在世界上不可能再出现这类旧声明时才可丢弃。所谓“世界”必须由成员协议精确定义,而不是运维人员心中的常用节点列表。
因果稳定把开放未来变成封闭前缀:某事件已经被所有成员确认,之后到达的合法事件不可能与它处于未知的更早位置。结构 CRDT 还多一层引用稳定;节点虽然不可见,仍可能像链表地址一样被别的操作使用。全局稳定是关于协议参与者的知识,不是某个副本本地 vector 足够大。
垃圾回收因此是分布式协议,不是本地内存优化。单个副本看到 remove 后立即清 tombstone,可能在当前测试中省空间,却把下一次离线重连变成元素复活。
例子与边界
成员为 A、B、C。A 删除由 dot
稳定前沿的 A 分量是
所以
现在假设离线 D 仍是成员,持有旧 add,却没有进入上述最小值。即使 A、B、C 都到五,回收仍不安全;D 重连会使元素复活。必须等 D 确认、正式 retire D 并禁止旧身份重入,或让 D 以后只接受新 epoch 的全量快照。
对 RGA,C 可能已在离线时生成“insert w after deleted x”。即使 x 的 delete 被三者确认,w 尚未交付前物理删 x 会让 anchor 消失。协议需等待操作稳定、保留 x,或把 x 的稳定位置映射到一个不会改变 sibling 顺序的替代 anchor。
推论与应用
安全 GC 可以批量按 stable frontier 删除整段操作日志、payload 与 tombstones,而不必逐对象等待独立确认。批量效率来自共同因果前缀,前提是所有对象使用相同成员 epoch 和持久确认语义。
若系统允许长期离线客户端,常见选择是保留墓碑、限制离线期限,或要求超期客户端丢弃本地状态并全量重新同步。三者是明确的存储—可用性权衡;静默采用超时删除却仍接受任意旧状态,没有一致性证明。备份恢复同样要携带 epoch:从稳定点之前的备份原地恢复,等同一个陈旧副本重新加入,必须被拒绝或重建。
参考资料
- Carlos Baquero, Paulo Sérgio Almeida, and Ali Shoker, “Pure Operation-Based Replicated Data Types,” arXiv:1710.04469, 2017, causal stability discussion.
- Hyun-Gul Roh et al., “Replicated Abstract Data Types: Building Blocks for Collaborative Applications,” Journal of Parallel and Distributed Computing 71(3), 2011, pp. 354–368.
- Annette Bieniusa et al., “An Optimized Conflict-Free Replicated Set,” arXiv:1210.3368, 2012.