一致性--顺序保证

分布式系统中的事件发生顺序是一个非常重要的概念。有些有因果关系的事件发生本身就包含顺序:数据只能先createupdate; 必须先有问题才能有回答。参考happen before的概念。符合因果关系的数据叫做因果一致性(causal consistency).
因果顺序并不是全局顺序,它只包含了有因果关系的事件发生顺序,对于并发事件是无法比较顺序的。从这个角度看,线性化是一种比因果一致更强的保证:前者可以判断任意两个事件的先后发生顺序,而后者只能判断有因果关系事件的发生顺序不能判断并发事件的发生顺序。因果顺序保证是在不牺牲系统性能下的最强一致性保证了。
在实际情况下,因果一致并不是很容易保证。客户端往往读取大量数据,写入少量数据,并不知道写入数据依赖哪些之前读取的数据,这些业务逻辑对于数据存储而言并不透明。由此,引入了版本号的概念,通常而言,版本号是一个单调增长(注意,在分布式发号器实现中不一定要去递增)的数字序列。版本号保证了全局顺序。关于分布式发号器,可以阅读一下美团的一个开源实现。
【一致性--顺序保证】接下来有一个全局顺序广播( total order broadcast)的概念。在分布式系统中,常做为配置中心使用的ZooKeeper,etcd等都实现了全局顺序广播。全局顺序广播有两个重要的前提:消息可靠投放和消息顺序到达。这种只追加的记录方式类似日志的数据结构。基于全局顺序广播保证的全局有序可以实现线性化数据存储。
您可以通过附加消息、读取日志并在消息返回给您时执行实际的读取操作来对日志进行排序。因此,消息在日志中的位置定义了读取发生的时间点。这也是etcd里quorum读取的原理。
如果日志允许您以一种线性方式获取最新日志消息的位置,您可以查询该位置,等待到该位置的所有条目交付给您,然后执行读取。这是zookeeper里sync的原理。

    推荐阅读