分布式系统中存在着各种“一致性”的概念,本篇博客主要对这些概念进行一个总结。 本篇博客没有太多原创的内容,主要是从自己的视角将一些博客和书籍中的知识进行汇总,留作日后的复习。
I. 四种一致性
- Linearizability:跟时间相关,严格按照时间顺序
- Sequential:跟时间无关,但要求所有操作在所有进程上被看到的顺序必须一致相同
- Casual:跟时间无关,但要求有因果关系的操作在所有进程上被看到的顺序必须一致
- PRAM:跟时间无关,但要求同一个进程中的多个写操作在所有进程上被看到的顺序必须一致,而不同进程上的写操作可以不一致。其忽略了读操作所带来的因果关系的要求
II. Linearizability和Sequential比较
- 图a是满足Sequential Consistency(顺序一致性),但是不满足Linearizability Consistency(线性一致性)。原因在于,从全局时钟的观点来看,P2进程对变量X的读操作在P1进程对变量X的写操作之后,然而读出来的却是旧的数据。但是这个图却是满足Sequential Consistency(顺序一致性)的,因为两个进程P1,P2的一致性并没有冲突。从这两个进程的角度来看,顺序应该是这样的:Write(y,2) , Read(x,0) , Write(x,4), Read(y,2),每个进程内部的读写顺序都是合理的,但是显然这个顺序与全局时钟下看到的顺序并不一样。
- 图b满足Linearizability Consistency(线性一致性),因为每个读操作都读到了该变量的最新写的结果,同时两个进程看到的操作顺序与全局时钟的顺序一样,都是Write(y,2) , Read(x,4) , Write(x,4), Read(y,2)。
- 图c不满足Sequential Consistency(顺序一致性),当然也就不满足Linearizability Consistency(线性一致性)。因为从进程P1的角度看,它对变量Y的读操作返回了结果0。那么就是说,P1进程的对变量Y的读操作在P2进程对变量Y的写操作之前,这意味着它认为的顺序是这样的:write(x,4) , Read(y,0) , Write(y,2), Read(x,0),显然这个顺序又是不能被满足的,因为最后一个对变量x的读操作读出来也是旧的数据。因此这个顺序是有冲突的,不满足顺序一致性。
- 两者的详细比较
Linearizability | Sequential consistency |
---|---|
单一进程要求按照时间序 | 单一进程内要求按照编程序 |
不同进程要求按照时间序 | 不同进程读写顺序无要求 |
可以通过主动备份实现 | 可以通过被动备份实现 |
III. Casual、Sequential和PRAM比较
- 图a满足 Sequential Consistency(顺序一致性),因此也满足Casual Consistency(因果一致性),因为从这个系统中的四个进程的角度看,它们都有相同的顺序也有相同的因果关系。
- 图b满足Casual Consistency(因果一致性)但是不满足 Sequential Consistency(顺序一致性)。首先P1和P2的写是没有因果关系的,从P3看来,Read(x,7) 表示P2的 Write(x,7)一定在P3的Read(x,7)之前, P3的Read(x,2)表示P1的Write(x,2)一定在P3的Read(x,2)之前,又因为P3中Read(x,7) 在Read(x,2)之前(本地因果顺序),因此,从P3角度看P1和P2的执行顺序应该是:Write(x,7)、Write(x,2)、Write(x,4)。同样的分析方法,可以得出从P4角度看P1和P2的执行顺序应该是:Write(x,2)、Write(x,4)、Write(x,7)。由于P3和P4看到的执行顺序不一致,因此这不满足Sequential Consistency(顺序一致性)要求。
- 图c展示了比Casual Consistency(因果一致性)更弱的一种一致性模型: PRAM(Pipelined Random Access Memory)管道式存储器,是Lipton和Sandberg于1988年在学术报告”PRAM: A scalable shared memory”中提出。如前所述, Sequential Consistency(顺序一致性)要求所有进程看到的程序执行顺序必须一致,而Casual Consistency(因果一致性)降低了一致性要求,它要求有因果关系的操作在所有进程上看到必须一致,而PRAM Consistency进一步降低一致性要求。先看PRAM定义:“…Writes done by a single process are received by all other processes in the order in which they were issued, but writes from different processes may be seen in a different order by different processes.” 意即在PRAM中,不同进程可以看到不同的执行顺序,但在某一进程上的多个写操作,在所有进程上看到的顺序必须一致,而不同进程上的写操作在不同进程上看起来其执行顺序则可以不一致。图c展示的例子而言,从P4角度看,无法对P1和P2中的操作进行排序,从而得到P4中的视图,因此肯定不满足Casual Consistency。但如果不考虑P2中读操作带来的因果关系,P4依次看到了P2中的Write(x,7)和P1中的Write(x,2)和Write(x,4),其满足PRAM的要求
参考文献
- Linearizability versus Serializability
- 分布式系统一致性
- Consistency Models
- Kshemkalyani A D, Singhal M. Distributed computing: principles, algorithms, and systems[M]. Cambridge University Press, 2011.