Skip to content

Multi-Value Register CRDT

Multi-Value Register · MV-Register · 多值寄存器 CRDT

覆盖调用者已观察版本、保留因果上彼此并发的最大写入,并以因果上下文防止旧值复活的寄存器。

条目类型
模型

形式陈述

MV-Register 的抽象读值是一组带唯一事件 dot 的版本

E={(v1,d1),,(vk,dk)},

并配有因果上下文 C,记录已经观察、包括已被覆盖的写事件。一个 write 接收客户端读到的 context:它删除所有被该 context 支配的当前版本,创建新 dot d,并加入 (v,d);未被 context 覆盖的并发版本保留。状态合并取两边 live versions 中因果上仍为最大的版本,同时合并上下文,旧的已覆盖 dot 即使迟到也不会复活。

实现可用Dotted Version Vector把连续事件前缀与当前 dot 分开表示。因果比较依据事件集合包含:若版本 x 的 dot 已在版本 y 的 context 中,则 y 观察并覆盖了 x;若双方都未包含对方 dot,则二者并发。

Query 返回所有 live versions 的值集合。相同 payload 的两个并发写仍是两个事件,可在展示层去重,却不能在因果状态中合并身份;否则后续只覆盖其中一个事件时无法正确判断。版本集合是因果反链:任意两个 live dots 互不支配;一旦某个版本被另一个 context 包含,前者就不再极大。

本构造可使用状态合并实现,但 metadata 不把每个具体内部表示机械分类。关键外部语义是“只保留因果极大写”,而不是无界追加所有历史值。

直觉

普通寄存器把写理解为覆盖先前所见内容。分区中的两个用户彼此没见过对方,系统没有因果依据称谁覆盖谁,于是 MV-Register 暂时展示两个值。某个用户读到二者再写新值,就明确表示“我已处理这场冲突”,新写覆盖两者。

因果上下文承担记忆。删除旧值的 payload 不够;必须记得其 dot 已被覆盖,否则旧副本重连时,merge 会把它当成从未见过的并发版本重新加入。Read repair 可以把多个版本复制到缺失副本,却不会自行解决反链;只有携带完整 read context 的新 write 才表达覆盖意图。

LWW-Register相比,MV 不借全序擅自丢弃并发意图,却把冲突暴露给应用。它不自动合并文本、购物车或 JSON;返回集合只是准确陈述并发事实。

例子与边界

初始写入 old 的 dot 为 (S,1)。A、B 都读到它后分区:A 写 red,生成 (A,1) 且 context 含 (S,1);B 写 blue,生成 (B,1) 且具有同一旧 context。两写都未观察对方,因此合并后

read={red,blue}.

C 读取这两个版本,携带包含 (A,1),(B,1) 的 context 写 green,生成 (C,1)。新版本支配两者,读值变成

{green}.

稍后一个离线副本再次发送 red;合并上下文已记录 (A,1) 被覆盖,所以 red 不会复活。

若 C 只读到 red 就写 green,green 覆盖 red,但 blue 与 C 的写并发,最终应为 {green,blue}。把 write 定义成“清空本地集合再加值”却不传播清除 context,会在不同副本得到不同复活行为。

版本数在对抗性并发下可增长到并发 writer 数。限制返回一个值会改变成 LWW 或其他冲突规则;限制最多 k 个又必须规定可收敛的确定淘汰语义。按到达顺序截断在不同副本会选择不同子集,不满足 strong convergence。

推论与应用

MV-Register 适合 DNS 配置、对象版本和需要人工或业务合并的字段。客户端必须把读取 context 原样带回写请求;只发送 payload 会让服务器无法知道写者意图覆盖哪些版本。

存储层可在所有相关版本被一个后继 context 支配且该事实稳定后回收 payload,但因果摘要仍需保留到不会遇到旧副本。压缩 DVV、成员 retirement 和反熵确认共同决定元数据是否安全缩小。应用合并函数若要自动生成单值,应以当前版本集合为显式输入,并把结果作为带新 dot 的正常 write 复制。

参考资料
  • Marc Shapiro et al., “A Comprehensive Study of Convergent and Commutative Replicated Data Types,” INRIA RR-7506, 2011, Specification 10.
  • Nuno Preguiça, Carlos Baquero, Paulo Sérgio Almeida, Victor Fonte, and Ricardo Gonçalves, “Dotted Version Vectors: Logical Clocks for Optimistic Replication,” arXiv:1011.5808, 2010.
  • Giuseppe DeCandia et al., “Dynamo: Amazon’s Highly Available Key-value Store,” SOSP 2007, pp. 205–220.
关系图谱2 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:使用

类型化关系