2000年7月,加州大学伯克利分校的Eric Brewer教授在ACM PODC会议上提出CAP猜测。2年后麻省理工学院的Seth Gilbert和NancyLynch从理论上证实了CAP,以后CAP理论正式成为分布式计算领域的公认定理。node
CAP是一个已经通过证明的理论:一个分布式系统最多只能同时知足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三项中的两项。mysql
CAP理论是由下面三个概念组成的,且在分布式系统中三者不能兼得,只能同时知足两种条件。sql
一致性(C)数据库
All nodes see the same data at the same time网络
全部数据库集群节点在同一时间点看到的数据彻底一致,即全部节点能实时保持数据同步。并发
咱们知道ACID中事务的一致性是指事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行先后,数据库都必须处于一致性状态。也就是说,事务的执行结果必须是使数据库从一个一致性状态转变到另外一个一致性状态。异步
和ACID中的一致性不一样,分布式环境中的一致性是指数据在多个副本之间是否可以保持一致的特性。分布式
分布式系统中,数据通常会存在不一样节点的副本中,若是对第一个节点的数据成功进行了更新操做,而第二个节点上的数据却没有获得相应更新,这时候读取第二个节点的数据依然是更新前的数据,即脏数据,这就是分布式系统数据不一致的状况。
在分布式系统中,若是可以作到针对一个数据项的更新操做执行成功后,全部的用户都能读取到最新的值,那么这样的系统就被认为具备强一致性(或严格的一致性)。网站
可用性(A)搜索引擎
Reads and writes always succeed
读写操做永远是成功的。即服务一直是可用的,即便集群一部分节点故障,集群总体还能正常响应客户端的读写请求。
可用性是指系统提供的服务必须一直处于可用的状态,对于用户的每个操做请求老是可以在有限的时间内返回结果,若是超过了这个时间范围,那么系统就被认为是不可用的。
“有限的时间内”是在系统的运行指标,不一样系统会有差异。例如搜索引擎一般在0.5秒内须要给出用户检索结果。
“返回结果”是可用性的另外一个重要指标,它要求系统完成对用户请求的处理后,返回一个正常的响应结果,要明确的反映出对请求处理的成功或失败。若是返回的结果是系统错误,好比"OutOfMemory"等报错信息,则认为此时系统是不可用的。
分区容错性(P)
The system continues to operate despite arbitrary message loss or failure of part of the system
尽管系统中有任意的信息丢失或故障,系统仍在继续运行。以实际效果而言,分区至关于对通讯的时限要求。系统若是不能在时限内达成数据一致性,就意味着发生了分区的状况,必须就当前操做在C和A之间作出选择。
一个分布式系统中,节点组成的网络原本应该是连通的。然而可能由于某些故障,使得有些节点之间不连通了,整个网络就分红了几块区域,而数据就散布在了这些不连通的区域中,这就叫分区。
当你一个数据项只在一个节点中保存,那么分区出现后,和这个节点不连通的部分就访问不到这个数据了。这时分区就是没法容忍的。
提升分区容忍性的办法就是一个数据项复制到多个节点上,那么出现分区以后,这一数据项仍然能在其余区中读取,容忍性就提升了。然而,把数据复制到多个节点,就会带来一致性的问题,就是多个节点上面的数据多是不一致的。要保证一致,每次写操做就都要等待所有节点写成功,而这等待又会带来可用性的问题。
总的来讲就是,数据存在的节点越多,分区容忍性越高,但要复制更新的数据就越多,一致性就越难保证。为了保证一致性,更新全部节点数据所须要的时间就越长,可用性就会下降。
一、保留CA,放弃P
若是想避免分区容错性问题的发生,一种作法是将全部的数据(与事务相关的)都放在一台机器上。虽然没法100%保证系统不会出错,但不会碰到由分区带来的负面效果。固然这个选择会严重的影响系统的扩展性。
做为一个分布式系统,放弃P,即至关于放弃了分布式,一旦并发性很高,单机服务根本不能承受压力。
像不少银行服务,确确实实就是舍弃了P,只用单台小型机+ORACLE保证服务可用性。
二、保留CP,放弃A
相对于放弃“分区容错性“来讲,其反面就是放弃可用性。一旦遇到分区容错故障,那么受到影响的服务须要等待必定的时间,所以在等待期间系统没法对外提供服务。
做为分布式系统,有分区服务发生问题颇有可能,若是由于某些服务不能用,致使整个服务都不能用,这个根本不是好的分布式系统。
三、保留AP,舍弃C
这里所说的放弃一致性,并非彻底放弃数据一致性,而是放弃数据的强一致性。即放弃了同一时刻的数据一致性,而保留数据的最终一致性。
以网络购物为例,对只剩下一件库存的商品,若是同时接受到了两份订单,那么较晚的订单将被告知商品告罄。
一般状况下,不少分布式服务系统都是采用该方案,保证可用性性,分布式服务,由于某些分区服务发生问题,先容忍,最终经过一些折中的方法达到最终数据一致性。
CAP面临的问题:
对于多数大型互联网应用的场景,主机众多、部署分散,并且如今的集群规模愈来愈大,因此节点故障、网络故障是常态,并且要保证服务可用性达到N个9,即保证P和A,舍弃C。
BASE理论是对CAP理论的延伸,思想是即便没法作到强一致性(CAP的一致性就是强一致性),但能够采用适当的采起弱一致性,即最终一致性。
BASE是指基本可用(Basically Available)、软状态( Soft State)、最终一致性( Eventual Consistency)。
基本可用是指分布式系统在出现故障的时候,容许损失部分可用性(例如响应时间、功能上的可用性),容许损失部分可用性。须要注意的是,基本可用毫不等价于系统不可用。
响应时间上的损失:正常状况下搜索引擎须要在0.5秒以内返回给用户相应的查询结果,但因为出现故障(好比系统部分机房发生断电或断网故障),查询结果的响应时间增长到了1~2秒。
功能上的损失:购物网站在购物高峰(如双十一)时,为了保护系统的稳定性,部分消费者可能会被引导到一个降级页面。
软状态是指容许系统存在中间状态,而该中间状态不会影响系统总体可用性。分布式存储中通常一份数据会有多个副本,容许不一样副本同步的延时就是软状态的体现。mysql replication的异步复制也是一种体现。
最终一致性是指系统中的全部数据副本通过必定时间后,最终可以达到一致的状态。弱一致性和强一致性相反,最终一致性是弱一致性的一种特殊状况。