CAP原理
C:Consistency(一致性)。即所有节点上的数据时刻保持同步。一致性严谨的表述就是原子的读写,数据的写操作对后面的读操作是可见的。 A:Avaliability(可用性)。任何非故障的节点必须在有限的时间内给出响应,不论请求是否成功。 P:Tolerance to the partition of network(分区容错性)当节点故障,无法进行正常通信,在丢失消息的情况下,系统能正常工作 首先CAP原理是不可能三者同时被满足的,最多只能同时满足两个。因为是分布式系统,我们首要实现分区容错性,即原理P,下面给出只能实现AP和CP的简要说明
AP满足但不满足C:要求系统高可用性和具备分区容错的能力,只能放弃一致性。当发生网络分区时,节点之间不能通信,为了满足高可用性,在有限事件给出响应,节点只能使用本地的数据提供服务,这样就导致了数据的不一致。
CP满足但不满足A:满足CP的分布式系统要求数据强一致的,当出现网络分区时会导致同步的时间延长,在此期间,节点对请求可能不会响应,这样不满足系统的高可用性
CAP原理指出分布式系统不能同时满足这三种属性,了解CAP帮助我们更好地理解实际的分布式协议的实现过程对CAP的取舍。
一致性模型详谈
我们知道分布式系统会构建集群来保证分区容错性,那么如何保证集群中的数据的一致性?
一致性与结果的正确性无关,是系统对外呈现的状态是否一致。若所有的节点达成一个错误的共识也是一致性的一种表现
对于一致性模型,可以从客户端和服务端两个视角进行分析。客户端角度,一致性主要指并发访问时如何获取更新过的数据的问题。服务端角度,如何将更新复制到整个系统,保证数据的最终一致性。因此一致性模型可以分两个角度查看:
以数据为中心的一致性模型 以用户为中心的一致性模型 以数据为中心的一致性模型
严格一致性(Strong Consistency):即强一致性,时要求最高的一致性模型。任何一个写操作在任意时刻对所有进程都是可见的,同时还要维护一个绝对全局时间顺序。一旦存储器中的值发生改变,那么不管读写之间的时间间隔多么小,之后的进程读出的都是最新值。强一致性很难高效的实现,通常会采用顺序一致性模型 顺序一致性(Sequential Consistency):全局时钟导致很难实现严格的一致性,而顺序一致性采用分布式时钟实现。顺序一致性指所有的进程都以相同的顺序看到了修改。读操作未必能及时得到其他进程对同一数据的写操作,但是每个进程读到该数据不同值的顺序一致。即只要求系统中所有进程达成自己的一致性即可,所谓“错一起错,对一起对” 因果一致性(Causal Consistency):仅要求有因果关系的操作顺序性得到保证,非因果关系的操作顺序性没有要求。即具有因果关系的写操作,每个进程看到的顺序应该是一致的,不存在因果关系的并发写操作在不同主机之间被看到的顺序可以不一致。熟知的例子是微信朋友圈评论,知乎这种问答应用场景中的数据一致性的设计采用因果一致性,保证回答在问题之后 以用户为中心的一致性模型
最终一致性(Eventual Consistency):最终一致性即更新的间隔时间比较长,所有的副本都能达到最终一致性。最终一致性情况下,系统能保证用户最终读取到最后更新过的数据。DNS系统在最终一致性方面做的很出色,一个更新的域名 IP,会根据配置策略和缓存控制策略,最终所有的用户都会看到最新的值
复制状态机 复制状态机主要用来管理存在于多个副本中的数据,它的基本思想是一个分布式的复制状态机系统由多个复制单元组成,每个复制单元均是状态机,它的状态保存在一组变量中。状态机的状态只能够通过外部命令来实现。
状态变量通常是基于日志操作实现的,每个复制单元存储着一个包含一系列指令的日志,并且严格按照顺序执行日志上的指令。因为每个外部命令都将产生相同的日志,每个日志都是按照相同得顺序包含相同的指令,所以每一个服务器都会执行相同的指令序列,并且最终达到一致性的状态。所以在复制状态机模型下,一致性算法的主要工作就是办证日志一致性 、