知识卡片
全序广播与线性一致存储可以互相构建
内容
全序广播和线性一致性看起来相似(都涉及”存在一个全局顺序”),但严格说不是一回事:全序广播是异步的,只保证消息按固定顺序可靠送达,不保证送达的具体时间;线性一致性是新鲜性保证,要求读一定能看到最新写。有趣的是,两者可以互相构建。从全序广播构建线性一致的CAS操作:把每次尝试声明某个键(如用户名)的意图追加为日志消息,读回日志并检查是否有更早的同键声明,若自己的消息是第一条则声明成功。这个过程默认只保证写线性一致,要让读也线性一致,需要额外手段(把读也作为日志条目、查询日志最新位置后等待追平、或从同步更新的副本读)。反过来,从线性一致存储构建全序广播:给每条待广播消息先对一个线性一致的整数寄存器执行”自增并返回”,把拿到的值作为序列号;与兰伯特时间戳不同,这样得到的序列号是没有间隙的连续整数,节点据此能判断”消息5还没到就不能先送达消息6”。可以证明:线性一致CAS寄存器、全序广播、共识问题三者两两等价——解出一个就能转化出另外两个的解法。
结构图:
flowchart LR
A[全序广播: 消息可靠+全序送达] -->|追加意图消息+读回检查首条| B[线性一致的CAS操作]
B -->|额外手段保证读新鲜: 读也追加日志/等待追平/同步副本| C[完全线性一致的存储]
D[线性一致寄存器 自增并返回] -->|取得无间隙序列号| A
A -.等价.-> E[共识问题]
B -.等价.-> E
参考来源
- 位置:《数据密集型应用系统设计》第九章《一致性与共识》"使用全序广播实现线性一致的存储""使用线性一致性存储实现全序广播"(源文件:_epub-src/ch9_split_000.html)
- 结论依据:原文分别描述了从全序广播构造线性一致CAS操作的仅追加日志方案、以及从线性一致的自增并返回寄存器构造全序广播的方案,并指明两者与共识问题两两等价,直接支撑本卡片的双向结构。
- 原始内容:如果有了全序广播,你就可以在此基础上构建线性一致的存储……线性一致的CAS(或自增并返回)寄存器与全序广播都等价于共识问题。