一致性
-
强一致性:系统中的某个数据被成功更新后,后续任何对该数据的读取操作都将得到更新后的值;
-
弱一致性:系统中的某个数据被更新后,后续对该数据的读取操作可能得到更新后的值,也可能是更改前的值。但经过“不一致时间窗口”这段时间后,后续对该数据的读取都是更新后的值;
-
最终一致性:是弱一致性的特殊形式,存储系统保证在没有新的更新的条件下,最终所有的访问都是最后更新的值。
-
序列一致性(sequential consistency)[13]:不要求时序一致,A操作先于B操作,在B操作后如果所有调用端读操作得到A操作的结果,满足序列一致性
线性化的一致性要求操作生效的顺序等于实际的实时操作排序。顺序一致性允许操作被重新排序,只要在每个节点上观察到的顺序保持一致。
http://www.sigma.me/2011/05/06/sequential-consistency.html
任意一次执行的结果都像所有处理器的操作以某种顺序的次序执行所得到的一样,而且各处理器的操作都按照各自程序所指定的次序出现在这个顺序中。
这个定义意味着,当程序在各个机器上并行运行时,任何一种有效的交错存储器访问顺序都是可认可的行为,但所有处理器必须看见的是同样的访问顺序。如果一个进程(处理器)看见的是一种交错,另一进程看见的是另一种交错,则这样的存储器不是一个顺序一致性的存储器。然而,同一程序再次并行运行,其存储器访问的交错次序会不同于上次的交错次序,这是允许的。在一块存储器中,若一个进程(或处理机)看到一种交错,另一进程看到另一个交错,这就不是顺序一致存储器。注意,这与时间无关,没有最近存入的概念。在这里,进程可以看到所有进程写,但只能看到本进程读。
在顺序一致性中衍生了一个可线性化概念:
线性化是一种弱于严格一致性但又强于顺序一致性的一致性模型。这种模型假设操作具有一个全局的时间戳。设TSop(x)表示在x上的操作op执行时的时间戳, op可以是读操作,也可以是写操作。如果TSop1(x)< TSop2(y),则在顺序一致性模型中的读/写操作顺序下,操作op1(x)必须在操作op2(y)之前。
线性化的数据存储也是顺序一致的。它们的区别在于:线性化是根据时间戳确定操作顺序的。在实际应用中,线性化主要用于并发算法的形式验证。线性化的实现比顺序一致性的实现开销更大。
zookeeper的读操作是 sequential consistency 的,ZooKeeper 的写操作是 linearizability 的。