关于分布式系统一致性级别的划分,有些文章划分为强一致性,顺序一致性以及弱一致性。数据库
最终一致性属于弱一致性,最终一致性根据更新数据后各进程访问到数据的时间和方式的不一样划分为:网络
另外一种,根据一致性的强弱程度不一样,直接划分为强一致性、单调一致性、会话一致性、最终一致性和弱一致性。并发
最终一致性和顺序一致性的差异很是大。分布式
顺序一致性是更强的一致性模型,最终一致性模型是很是弱的一致性模型。能够这么说,知足顺序一致性的系统必定知足最终一致性,但知足最终一致性的系统不必定知足顺序一致性。好比,Zookeeper是顺序一致性,Zookeeper也知足最终一致性;Cassandra是最终一致性,但Cassandra不知足顺序一致性。post
博文《线性一致性(Linearizability)是并发控制的基础》中提到【在分布式领域中,咱们也会说线性一致性,例如Zookeeper是线性一致性的,再好比分布式领域著名的CAP定理中的C,也是指线性一致性。】.net
做者的意思是他在文章中提到的【Zookeeper是线性一致性的】是为了举例说明线性一致性也会用来描述分布式系统,由于线性一致性最先在并行计算领域提出。server
其实,各个领域的线性一致性都是同样的。线性一致性最先在并行计算领域提出,如今在分布式领域、数据库领域都在用,含义是同样的。咱们能够把线性一致性称做为强一致性,或者原子一致性。准确的来讲,Zookeeper若是只有写请求时,是线性一致性的;若是从读和写的角度来讲是顺序一致性的。blog
严格说【Zookeeper若是只有写请求时,是线性一致性的;若是从读和写的角度来讲是顺序一致性的】进程
正如上面所说,Zookeeper若是只有写请求时,是线性一致性的;若是从读和写的角度来讲是顺序一致性的。get
如何理解Zookeeper的顺序一致性请参看 juejin.im/post/5d5a2a…
而根据 Zookeeper 的 ZAB 协议来看,Zookeeper 保证的一致性是单调一致性(任什么时候刻,任何用户一旦读到某个数据在某次更新后的值,那么就不会再读到比这个值更旧的值。也就是说,获取的数据顺序必是单调递增的。)
缘由:
假设有2n+1个server,在同步流程中,leader 向 follower 同步数据,当同步完成的 follower 数量大于 n+1时同步流程结束,系统可接受 client 的链接请求。若是client 链接的并不是同步完成的follower,那么获得的并不是最新数据,但能够保证单调性。
假设是 follower 接收的写请求,而后转发给 leader 处理;leader 完成两阶段提交的机制。向全部 server 发起提案,当提案得到超过半数(n+1)的 server 认同后,将对整个集群进行同步,超过半数(n+1)的 server 同步完成后,该写请求完成。若是 client 链接的并不是同步完成 follower,那么获得的并不是最新数据,但能够保证单调性。
(1)C(一致性): Zookeeper保证了顺序一致性(知足最终一致性),在十几秒能够Sync到各个节点
(2)A(可用性): Zookeeper保证了可用性,数据老是可用的,没有锁。而且有一大半的节点所拥有的数据是最新的、实时的。 若是想保证取得是数据必定是最新的,须要手工调用Sync()
(3)P(分区容错性): 有两点须要分析