“这与Multi Value Register形成实质对比:LWW 以任意确定全序删除并发 loser,MV Register 保留因果上无法比较的所有最大版本,让应用或后续写显式化解。”
形式陈述 ​
MV-Register 的抽象读值是一组带唯一事件 dot 的版本
并配有因果上下文
实现可用Dotted Version Vector把连续事件前缀与当前 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 为
C 读取这两个版本,携带包含
稍后一个离线副本再次发送 red;合并上下文已记录
若 C 只读到 red 就写 green,green 覆盖 red,但 blue 与 C 的写并发,最终应为
版本数在对抗性并发下可增长到并发 writer 数。限制返回一个值会改变成 LWW 或其他冲突规则;限制最多
推论与应用
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.