关于CAP理论的一些笔记

CAP的概念

2000年,Eric Brewer 教授在 ACM 分布式计算年会上指出了著名的 CAP 理论:

分布式系统不可能同时满足一致性(C: Consistency),可用性(A: Availability)和分区容错性(P: Tolerance of network Partition)这三个需求。大约两年后,Seth Gilbert 和 Nancy lynch 两人证明了CAP理论的正确性。

三者的含义如下:

  • Consistency:一致性,一个服务是一致的完整操作或完全不操作(A service that is consistent operates fully or not at all,精确起见列出原文),也有人将其简称为数据一致性,任何一个读操作总是能读取到之前完成的写操作结果,也就是在分布式环境中,多点的数据是一致的。
  • Availability:可用性,每一个操作总是能够在确定的时间内返回,也就是系统随时都是可用的。
  • Tolerance of network Partition:分区容忍性,节点 crash 或者网络分片都不应该导致一个分布式系统停止服务。

关于 CAP 理论的历史和介绍可以参考 Brewer’s CAP Theorem 和 中文翻译

基本CAP的证明思路

CAP 的证明基于 异步网络,异步网络也是反映了真实网络中情况的模型。

真实的网络系统中,节点之间不可能保持同步,即便是时钟也不可能保持同步,所有的节点依靠获得的消息来进行本地计算和通讯。这个概念其实是相当强的,意味着任何超时判断也是不可能的,因为没有共同的时间标准。之后我们会扩展 CAP 的证明到弱一点的异步网络中,这个网络中时钟不完全一致,但是时钟运行的步调是一致的,这种系统是允许节点做超时判断的。

CAP 的证明很简单,假设两个节点集{G1, G2},由于网络分片导致 G1 和 G2 之间所有的通讯都断开了,如果在 G1 中写,在 G2 中读刚写的数据, G2 中返回的值不可能是 G1 中的写值。由于 A 的要求,G2 一定要返回这次读请求,由于 P 的存在,导致 C一定是不可满足的。

为什么不能完全保证这个三点了,个人觉得主要是因为一旦进行分区了,就说明了必须节点之间必须进行通信,涉及到通信,就无法确保在有限的时间内完成指定的行为,如果要求两个操作之间要完整的进行,肯定会存在某一个时刻只完成一部分的业务操作,在通信完成的这一段时间内,数据就是不一致性的。如果要求保证一致性,那么就必须在通信完成这一段时间内保护数据,使得任何访问这些数据的操作不可用。

如果想保证一致性和可用性,那么数据就不能够分区。一个简单的理解就是所有的数据就必须存放在一个数据库里面,不能进行数据库拆分。这个对于大数据量,高并发的互联网应用来说,是不可接受的。

这里引用 Brewer’s CAP Theorem 中的图和文字来说明。

上图显示了网络中的两个节点 N1,N2,他们共享同一数据 V,其值为 V0。N1 上有一个算法 A,我们可以认为 A 是安全、无 bug、可预测和可靠的。N2 上有一个类似的算法 B。在这个例子中,A 写入 V 的新值而 B 读取 V 的值。

正常情况过程如下:

  • 1) A 写入新的 V 值,我们称作 v1。
  • 2) N1 发送信息给 N2,更新 V 的值。
  • 3) 现在 B 读取的 V 值将会是 V1。

如果网络断开,意味着从 N1 无法发送信息到 N2,那么在第3步的时候,N2 就会包含一个步一致的 V 值。

即使将其扩展到几百个事务中,这也会成为一个大问题。如果 M 是一个异步消息,那么 N1 无法知道 N2 是否收到了消息。即使 M 是保证能发送的,N1 也无法知道是否消息由于分区事件的发生而延迟,或 N2 上的其他故障而延迟。即使将 M 作为同步消息也不能解决问题,因为那将会使得 N1 上 A 的写操作和 N1 到 N2 的更新事件成为一个原子操作,而这将导致同样的等待问题。Gilbert 和Lynch已经证明,使用其他的变种方式,即使是部分同步模型(每个节点上使用安排好的时钟)也无法保证原子性。

因此,CAP 告诉我们,如果想让 A 和 B 是高可用的(例如,以最小的延迟提供服务)并且想让所有的 N1 到 Nn(n的值可以是数百甚至是上千)的节点能够冗余网络的分区(丢失信息,无法传递信息,硬件无法提供服务,处理失败),那么有时我们就得面临这样的情况:某些节点认为 V 的值是 V0 而其他节点会认为 V 的值是 V1。

让我们从事务的角度分析一下。下面的图中 a 是整个过程,要具有一致性的话需要等待 a1 进行 write,然后同步到 a2,然后 a2 再进行 write,只有整个事务完成以后,a2 才能够进行 read。但是这样的话使得整个系统的可用性下降,a2 一直阻塞在那里等待 a1 同步到 a2。这个时候如果对一致性要求不高的话,a2 可以不等待 a1 数据对于 a2 的写同步,直接读取,这样虽然此时的读写不具有一致性,但是在后面可以通过异步的方式使得 a1 和 a2 的数据最终一致,达到 最终一致性

BASE理论

BASE 理论是 CAP 理论结合实际的产物。 BASE(Basically Available, Soft-state,Eventuallyconsistent)英文中有碱的意思,这个正好和 ACID 的酸的意义相对,很有意思。BASE 恰好和 ACID 是相对的,BASE 要求牺牲高一致性,获得可用性或可靠性。

  • Basically Availble: 基本可用(支持分区失败)
  • Soft-state:软状态/柔性事务(无状态连接,支持异步)
  • Eventual Consistency: 最终一致性(不要求高一致性,只要求最终能够一致)

BASE 理论的核心是:牺牲高一致性,获得可用性或可靠性

CAP选择

当处理 CAP 的问题时,你会有几个选择。最明显的是:

  • 放弃 Tolerance of network Partition。如果你想避免分区问题发生,你就必须要阻止其发生。一种做法是将所有的东西(与事务相关的)都放到一台机器或者一个机架上。这样还是有可能部分失败,但你不太可能碰到由分区问题带来的负面效果。当然,这个选择会严重影响系统的扩展。
  • 放弃 Availability。相对于放弃 Tolerance of network Partition 来说,其反面就是放弃 Availability。一旦遇到分区事件,受影响的服务需要等待数据一致,因此在等待期间就无法对外提供服务。在多个节点上控制这一点会相当复杂,而且恢复的节点需要处理逻辑,以便平滑地返回服务状态。
  • 放弃 Consistency。放弃一致性,你的系统可能返回不太精确的数据,但系统将会变得“最终一致”,即使是网络发生分区的时候也是如此。

下面是一个使用 CAP 理论的生态系统的分布图:

任何架构师在设计分布式的系统的时候,都必须在这三者之间进行取舍。首先就是是否选择分区,由于在一个数据分区内,根据数据库的ACID特性,是可以保证一致性的,不会存在可用性和一致性的问题,唯一需要考虑的就是性能问题。对于可用性和一致性,大多数应用就必须保证可用性,毕竟是互联网应用,牺牲了可用性,相当于间接的影响了用户体验,而唯一可以考虑就是一致性了。

牺牲一致性

对于牺牲一致性的情况最多的就是缓存和数据库的数据同步问题,我们把缓存看做一个数据分区节点,数据库看作另外一个节点,这两个节点之间的数据在任何时刻都无法保证一致性的。

异常错误检测和补偿

还有一种牺牲一致性的方法就是通过一种错误补偿机制来进行

两阶段提交协议

第一阶段和第二阶段之间,数据也可不能是一致性的,也可能出现同样的情况导致异常。

CAP的反对声音

1,2008年9月CTO of atomikos写了一篇文章“A CAP Solution (Proving Brewer Wrong)”,试图达到CAP都得的效果。

这篇文章的核心内容就是放松Gilbert和Lynch证明中的限制:“系统必须同时达到CAP三个属性”,放松到“系统可以不同时达到CAP,而是分时达到”。

他设计的系统如下:

  • (1)程序如果能够读取数据库的话读取数据库,如果不能的话可以使用缓存代替。
  • (2)所有的读取操作使用版本号或者其他可以使用乐观锁的机制。
  • (3)客户端的所有更新操作全部放在队列中顺序处理。更新操作中要包括该更新的读取操作时的版本信息。
  • (4)当分区数量足够少的时候,可以处理队列中的更新操作。比较简单的方式是建立一个跨越所有分布式副本的事务,对每个副本进行更新操作(其他方式比如quorum等等也可以)。如果该更新的读取操作时的版本信息不是当前数据库中数据的版本信息,则将失败返回给客户端,否则返回成功。
  • (5)数据库操作结果(确认或者取消)通过异步的方式发送到客户端,可以通过邮件,消息队列或者其他异步方式。

该系统符合CAP如下:

  • 符合C(高一致性):读取的数据都是基于快照的,而且错误的更新操作不会执行。
  • 符合A(高可用性):读取和更新都会返回数据。
  • 符合P(高分区容错性):允许网络或者节点出错。

该设计是符合BASE理论的。

缺点:

  • 1) 读数据可能会不一致,因为之前的写还在排队
  • 2) partition必须在有限的时间内解决
  • 3) update操作必须在所有的节点上保持同样的顺序

2, 2011年11月Twitter的首席工程师Nathan Marz写了一篇文章,描述了他是如何试图打败CAP定理的: How to beat the CAP theorem

本文中,作者还是非常尊重CAP定律,并表示不是要“击败”CAP,而是尝试对数据存储系统进行重新设计,以可控的复杂度来实现CAP。

Marz认为一个分布式系统面临CAP难题的两大问题就是:在数据库中如何使用不断变化的数据,如何使用算法来更新数据库中的数据。Marz提出了几个由于云计算的兴起而改变的传统概念:

  • 1) 数据不存在update,只存在append操作。这样就把对数据的处理由CRUD变为CR
  • 2) 所有的数据的操作就只剩下Create和Read。把Read作为一个Query来处理,而一个Query就是一个对整个数据集执行一个函数操作。

在这样的模型下,我们使用最终一致性的模型来处理数据,可以保证在P的情况下保证A。而所有的不一致性都可以通过重复进行Query去除掉。Martz认为就是因为要不断的更新数据库中的数据,再加上CAP,才导致那些即便使用最终一致性的系统也会变得无比复杂,需要用到向量时钟、读修复这种技术,而如果系统中不存在会改变的数据,所有的更新都作为创建新数据的方式存在,读数据转化为一次请求,这样就可以避免最终一致性的复杂性,转而拥抱CAP。

时间: 2024-10-31 19:47:50

关于CAP理论的一些笔记的相关文章

浅谈 CAP 理论

本文介绍了介绍了分布式系统著名的 CAP 理论.什么是 CAP 理论?为什么说 CAP 只能三选二?了解 CAP 对于系统架构又有什么指导意义?本文将一一作答. 什么是 CAP 理论 在计算机科学理论,CAP 定理(也称为 Brewer 定理),是由计算机科学家 Eric Brewer 提出的,即在分布式计算机系统不可能同时提供以下全部三个保证: 一致性(Consistency):所有节点同一时间看到是相同的数据: 可用性(Availability):不管是否成功,确保每一个请求都能接收到响应:

CAP理论十二年回顾:"规则"变了

CAP理论断言任何基于网络的数据共享系统,最多只能满足数据一致性.可用性.分区容忍性三要素中的两个要素.但是通过显式处理分区情形,系统设计师可以做到优化数据一致性和可用性,进而取得三者之间的平衡. 自打引入CAP理论的十几年里,设计师和研究者已经以它为理论基础探索了各式各样新颖的分布式系统,甚至到了滥用的程度.NoSQL运动也将CAP理论当作对抗传统关系型数据库的依据. CAP理论主张任何基于网络的数据共享系统,都最多只能拥有以下三条中的两条: 数据一致性(C),等同于所有节点访问同一份最新的数

持续可用与CAP理论 – 一个系统开发者的观点

持续可用 本文主要针对金融数据库,认为金融数据库的持续可用包含两点:一个是强一致性:另外一个是高可用性. 数据库系统必须是强一致性的系统,这是因为数据库系统有事务ACID的基本要求,而弱一致系统无法做到.业内也有一些流行的NOSQL系统,例如各种类Dynamo系统,如开源的Cassandra,对同一个最小数据单位(同一行数据)允许多台服务器同时写入,虽然采用NWR机制处理冲突,但是由于不可能解决多台服务器之间的时序问题,而只能支持弱一致语义.弱一致语义的问题很多,例如无法支持复杂功能,无法构建严

【分布式系统工程实现】CAP理论及系统一致性

印象中CAP理论开始流行是从Amazon Dynamo的论文开始的,Amazon的CTO还在他的博客中介绍了最终一致性的概念,从此以后,各种会议和交流中都少不了CAP的影子.然而,对于分布式系统工程设计和开发来说,CAP意味着什么呢? CAP 理论由 Berkerly 的 Brewer 教授提出,三者的含义如下: 一致性 ( Consistency) :任何一个读操作总是能读取到之前完成的写操作结果: 可用性 ( Availability) :每一个操作总是能够在确定的时间内返回: 分区可容忍性

《云数据管理:挑战与机遇》2.1.7 CAP理论

本节书摘来自华章出版社<云数据管理>一书中的第2章,第1节,作者迪卫艾肯特·阿格拉沃尔,更多章节内容可以访问"华章计算机"公众号查看 CAP理论 Brewer[2000]提出了下列理论,后来由Gilbert and Lynch[2002]加以证明:一个分布式共享数据系统最多同时满足下列三个属性中的两种: 一致性(C) 可用性(A) 网络分区容忍性(P) 该理论就是著名的CAP理论.一般情况下,大规模云数据中心的分布式系统需要支持分区,以便能够处理大规模操作.此时,在进行网络

分布式系统之CAP理论

任老师第一节主要讲了分布式系统实现时候面临的八个问题,布置的作业就是这个,查询CAP理论. 笔者初次接触分布式,所以本文主要是一个汇总. 一.CAP起源 CAP原本是一个猜想,2000年PODC大会的时候大牛Brewer提出的,他认为在设计一个大规模可扩放的网络服务时候会遇到三个特性:一致性(consistency).可用性(Availability).分区容错(partition-tolerance)都需要的情景,然而这是不可能都实现的.之后在2003年的时候,Mit的Gilbert和Lync

网站运营:《长尾理论》学习笔记

笔记|网站运营 1.<注意力经济>是互联网新经济第一个基础理论.它假设,这个世界物质并不稀缺,所以,不用费劲再钻在传统的经济学的资源配置效益最大化里面,它假设,注意力稀缺.是什么带来了注意力稀缺,是互联网导致的信息过载. 2.互联网时代,信息过载是不可避免的事实.所以,在互联网时代,拥有新闻的版权,并不重要,拥有读者的眼球,比拥有新闻版权更重要,所以,新浪比新华网有价值.在互联网时代,新华网所拥有的新闻版权并不稀缺,各报社设置个人Blog都可以提供替代品. 3.2000年,互联网泡沫破灭,人们

CAP和BASE理论

1. CAP理论 2000年7月,加州大学伯克利分校的Eric Brewer教授在ACM PODC会议上提出CAP猜想.2年后,麻省理工学院的Seth Gilbert和Nancy Lynch从理论上证明了CAP.之后,CAP理论正式成为分布式计算领域的公认定理. CAP理论为:一个分布式系统最多只能同时满足一致性(Consistency).可用性(Availability)和分区容错性(Partition tolerance)这三项中的两项. 1.1 一致性(Consistency) 一致性指"

《分布式系统的事务处理》笔记(二)——消息传递的一致性

本文摘录自<分布式系统的事务处理>. Master-Slave Master-Slave结构中,Slave一般是Master的备份. 由Master负责读写请求 写请求到Master上后,由Master同步到Slave. 同步方式: 异步或同步. Master来push或者slave来pull. 属于最终一致性. 异步的问题 如果Master在同步的周期内垮掉,会导致这段时间的数据丢失.如果不想出现数据丢失,Slave就需要设为Read-Only等待Master恢复. 如果能容忍数据丢失,可以