本文是《如何学习分布式系统》中,关于一致性模型的相关介绍。
在学习一致性模型的过程中,发现了很多相关的数学证明,因为水平有限,基本都没看懂。在这里罗列一下,并且附上原文,有兴趣的同学可以看看。
Linearizability的locality
《Linearizability: A Correctness Condition for Concurrent Objects》一文中指出,指定一个属性P,如果每个独立的object都满足P,那么这些object组合起来也能满足P,那么P就认为是local的。可以证明Linearizability是local的。
当且仅当对每个object x,H|x是linearizable时,H也是linearizable
Linearizability的locality的重要性在于,可以模块化的设计和构建分布式系统。
Linearizability的nonblocking
《Linearizability: A Correctness Condition for Concurrent Objects》一文中指出linearizability是nonblocking属性:一个pending的invocation不会要求去等待另一个pending的invocation去complete。
它提出如下定理:假设inv是一个total 操作的invocation,如果<x inv P>
是linearizable history H中的一个pending invocation,那么存在着response <x res P>
,使得H·<x res P>
也是linearizable。
在文中,作者指出,Serializability天然是blocking的。
Serializability is inherently a blocking property
Linearizability的验证
《Linearizability: A Correctness Condition for Concurrent Objects》一文给出了Linearizability实现的检验方法。一个实现可以认为是一系列的history,在这些history中,有两个object:
- 一个表现类型object REP——a representation (or rep) object REP of type REP
- 一个抽象类型object ABS——an abstract object ABS of type ABS
这两个对象上的事件按照以下方式交互:
- 子历史
H|REP
和H|ABS
都是well-formed - 对于每个进程P,REP的操作被abstract操作所包含。
如果对于一个实现中所有的H来说,H|ABS
是linearizable的,那么这个实现就是正确的。
文章后面介绍了验证的具体算法,有兴趣的同学自己研究吧。
Linearizability和Sequential Consistency效率对比
Linearizability比Sequential Consistency要严格,但是实现起来效率差多少?《Sequential Consistency versus Linearizability》一文给出了证明。
文章中作者一共研究了三种不同类型的实现:FIFO队列,stack,读写对象。节点之间的消息传递延迟为[d-u,d],d是最坏情况下的延迟。u是最大的波动,本地处理时间为0。
在文中,作者对比了不同情况下的实现效率。
节点时间大致同步,消息延迟不确定
- 读写对象
为了实现linearizability一致性,最差情况的读操作是至少u/4,最差情况的写操作是u/2
为了实现sequential consistency一致性,存在一个算法保证瞬时的读操作和2d时间的写操作,而存在的另一个算法则正好相反 - FIFO队列
为了实现linearizability一致性,最差情况的入队操作是至少u/2
为了实现sequential consistency一致性,存在一个算法保证瞬时的入队操作和2d时间的出队操作 - stack
stack的情况和FIFO队列的情况一致,弹栈操作和出队操作作用一致而入栈操作和入队操作作用一致
节点时间精确同步,消息延迟不确定
- 读写对象
为了实现sequential consistency一致性,最差情况下的读操作和写操作的时间之和至少为d
为了实现linearizability一致性,存在一个算法能够瞬时的完成读操作,并且在d时间之内完成写操作,并且存在另一个相反的算法 - FIFO队列
为了实现sequential consistency一致性,最差情况下出队操作时间至少为d
为了实现linearizability一致性,有一个算法能够瞬时完成入队操作,在d时间内完成出队操作 - stack
同样,stack的结果和FIFO队列是一致的。
更多相关内容,请参考系列文章《如何学习分布式系统》。