分布式理论之CAP定理(布鲁尔定理)

系列文章 -> 分布式理论html

  1. 分布式理论之CAP定理(布鲁尔定理)
  2. 分布式理论之BASE理论
  3. 分布式理论之2PC协议(2阶段提交协议)

定义

在理论计算机科学中,CAP定理(CAP theorem),又被称做布鲁尔定理(Brewer's theorem),它指出对于一个分布式计算系统来讲,不可能同时知足如下三点git

选项 具体意义
一致性(Consistency) 全部节点访问同一份最新的数据副本
可用性(Availability) 每次请求都能获取到非错的响应,可是不保证获取的数据为最新数据
分区容错性(Partition tolerance) 分布式系统在遇到任何网络分区故障的时候,仍然可以对外提供知足一致性和可用性的服务,除非整个网络环境都发生了故障

而CAP指的就是上述三个指标的首字母github

分别解释每一个指标

一致性(Consistency)

这里指的是强一致性,而最终一致性后续讨论
在写操做完成后开始的任何读操做都必须返回该值,或者后续写操做的结果
也就是说,在一致性系统中,一旦客户端将值写入任何一台服务器并得到响应,那么以后client从其余任何服务器读取的都是刚写入的数据算法

用以下系统进行解释segmentfault

clipboard.png

  1. 客户端向G1写入数据v1,并等待响应
  2. 此时,G1服务器的数据为v1,而G2服务器的数据为v0,二者不一致
  3. 接着,在返回响应给客户端以前,G2服务器会自动同步G1服务器的数据,使得G2服务器的数据也是v1
  4. 一致性保证了无论向哪台服务器(好比这边向G1)写入数据,其余的服务器(G2)能实时同步数据
  5. G2已经同步了G1的数据,会告诉G1,我已经同步了
  6. G1接收了全部同步服务器的已同步的报告,才将“写入成功”信息响应给client
  7. client再发起请求,读取G2的数据
  8. 此时获得的响应是v1,即便client从未写入数据到G2

可用性(Availability)

系统中非故障节点收到的每一个请求都必须有响应
在可用系统中,若是咱们的客户端向服务器发送请求,而且服务器未崩溃,则服务器必须最终响应客户端,不容许服务器忽略客户的请求安全

分区容错性(Partition tolerance)

容许网络丢失从一个节点发送到另外一个节点的任意多条消息,即不一样步
也就是说,G1和G2发送给对方的任何消息都是能够放弃的,也就是说G1和G2可能由于各类意外状况,致使没法成功进行同步,分布式系统要能容忍这种状况。服务器

clipboard.png

CAP三者不可能同时知足

假设确实存在三者能同时知足的系统网络

  • 那么咱们要作的第一件事就是分区咱们的系统,因为知足分区容错性,也就是说可能由于通讯不佳等状况,G1和G2之间是没有同步

clipboard.png

  • 接下来,咱们的客户端将v1写入G1,但G1和G2之间是不一样步的,因此以下G1是v1数据,G2是v0数据。

clipboard.png

  • 因为要知足可用性,即必定要返回数据,因此G1必须在数据没有同步给G2的前提下返回数据给client,以下

clipboard.png

  • 接下去,client请求的是G2服务器,因为G2服务器的数据是v0,因此client获得的数据是v0

clipboard.png

很明显,G1返回的是v1数据,G2返回的是v0数据,二者不一致。
其他状况也有相似推导,也就是说CAP三者不能同时出现。分布式

CAP三者如何权衡

三选二利弊如何

  • CA (Consistency + Availability):关注一致性和可用性,它须要很是严格的全体一致的协议,好比“两阶段提交”(2PC)。CA 系统不能容忍网络错误或节点错误,一旦出现这样的问题,整个系统就会拒绝写请求,由于它并不知道对面的那个结点是否挂掉了,仍是只是网络问题。惟一安全的作法就是把本身变成只读的。
  • CP (consistency + partition tolerance):关注一致性和分区容忍性。它关注的是系统里大多数人的一致性协议,好比:Paxos 算法 (Quorum 类的算法)。这样的系统只须要保证大多数结点数据一致,而少数的结点会在没有同步到最新版本的数据时变成不可用的状态。这样可以提供一部分的可用性。
  • AP (availability + partition tolerance):这样的系统关心可用性和分区容忍性。所以,这样的系统不能达成一致性,须要给出数据冲突,给出数据冲突就须要维护数据版本。Dynamo 就是这样的系统。

clipboard.png

如何进行三选二

权衡三者的关键点取决于业务
放弃了一致性,知足分区容错,那么节点之间就有可能失去联系,为了高可用,每一个节点只能用本地数据提供服务,而这样会容易致使全局数据不一致性。对于互联网应用来讲(如新浪,网易),机器数量庞大,节点分散,网络故障再正常不过了,那么此时就是保障AP,放弃C的场景,而从实际中理解,像门户网站这种偶尔没有一致性是能接受的,但不能访问问题就很是大了。post

对于银行来讲,就是必须保证强一致性,也就是说C必须存在,那么就只用CA和CP两种状况,当保障强一致性和可用性(CA),那么一旦出现通讯故障,系统将彻底不可用。另外一方面,若是保障了强一致性和分区容错(CP),那么就具有了部分可用性。实际究竟应该选择什么,是须要经过业务场景进行权衡的(并非全部状况都是CP好于CA,只能查看信息但不能更新信息有时候还不如直接拒绝服务)

参考

CAP原则(CAP定理)、BASE理论
分布式理论(一) - CAP定理
CAP定理
An Illustrated Proof of the CAP Theorem
分布式系统的一致性协议之 2PC 和 3PC

相关文章
相关标签/搜索