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

印象中CAP理论开始流行是从Amazon Dynamo的论文开始的,Amazon的CTO还在他的博客中介绍了最终一致性的概念,从此以后,各种会议和交流中都少不了CAP的影子。然而,对于分布式系统工程设计和开发来说,CAP意味着什么呢?

CAP 理论由 Berkerly 的 Brewer 教授提出,三者的含义如下:

  • 一致性 ( Consistency) :任何一个读操作总是能读取到之前完成的写操作结果;
  • 可用性 ( Availability) :每一个操作总是能够在确定的时间内返回;
  • 分区可容忍性 (Tolerance of network Partition) :在出现网络分区的情况下,仍然能够满足一致性和可用性;

CAP 理论认为,三者不能同时满足,并给出了证明,简单阐述如下:假设系统出现网络分区为 G1 和 G2 两个部分,在一个写操作 W1 后面有一个读操作 R2 , W1 写 G1 , R2 读取 G2 ,由于 G1 和 G2 不能通信,如果读操作 R2 可以终结的话,必定不能读取写操作 W1 的操作结果。

由于CAP三者无法同时满足,Amazon Dynamo论文中引入了用户可配置的NWR策略,在CAP三个特性中作出权衡。比如N=3, W=3, R=1强调一致性;N=3, W=1, R=1强调可用性;N=3, W=2, R=2是一种折衷的策略。另外,还有一些NOSQL系统把CAP理论当成一种借口,认为既然我们不能同时满足一致性和可用性,那NOSQL系统就牺牲一致性。这些说法本身虽然不能说有错,但我们至少需要思考两个问题:

  1. CAP理论在工程的角度意味着什么?
  2. 一致性的具体含义?

笔者认为,最初的CAP理论只是粗略地告诉我们”天下没有免费的午餐”,对于NOSQL系统设计指导意义不大。原始的CAP理论描述有如下缺陷:

  1. 缺少时间因素。比如对于可用性描述,10s中停服务和1个小时停服务完全是两个概念,只停写服务和同时停读写服务的影响也是很不一样的。
  2. 一致性描述问题。每个读操作虽然能够读取到之前写操作结果,但是假设某些写操作发生在机器A,某些写操作发生在机器B,一致性依赖于对机器A和机器B上写操作的合并,操作的顺序是无法保证的。比如Dynamo&Cassandra系统中由于可能出现同一个<key, value>对被多个节点同时修改的情形,即使在NWR策略中配置W + R > N,也需要依赖冲突合并来保证一致性,这从理论上是没有完美做法的。
  3. 网络分区描述过于模糊。工程上容易出现的网络问题一般是机房之间网络不通,某个机房停电,某台机器故障或者某些机器因为机架电源或者交换机的原因发生故障。单个机器故障也可以认为是网络分区,但这和机房网络不通对系统设计带来的挑战差别是很大的。

一般可以认为:工程上网络分区总是存在,比如机器故障或者网络异常,一致性和可用性不能同时满足。且工程上从来不要求绝对的一致性或者可用性,而是寻求一种平衡,可以将一致性和可用性分别重定义为HarvestYield

  • Harvest (对应一致性):percent of required data actually included in the responses (请求结果的真实程度);
  • Yield (可用性):percent of requests answered successfully (成功请求占的百分比);

CAP理论可以演化为在工程上寻找一种方法,在”成功请求占的百分比”和”请求结果的真实程度”之间取得一个权衡,详细描述可以参考Coda的博客。然而,这个描述仍然不够具体,下面我们就有总控节点的系统(如GFS+Bigtable)和P2P系统(如Amazon Dynamo)两类系统的CAP含义分别进行说明。

首先我们必须明确一致性的概念。NOSQL系统经常提到最终一致性模型:假如客户端A写入一个值到存储系统,客户端B最终总是能够读取到A写入的最新值,这里有一个时间窗口,依赖于交互延迟,系统负载以及复制技术中的replica的个数。Amazon CTO宣称Dynamo为最终一致性系统,然而,这里的最终一致性具有很大的欺骗性,因为虽然客户端B能够读到其它客户端写入的所有数据,但是可能出现多个节点更新同一个值的情况,需要依赖冲突合并来解决多机操作顺序问题。后续的文章中,我们都会把Amazon Dynamo这种需要依赖操作合并,可能会丢失数据的模型从最终一致性模型中排除出去。最终一致性模型要求同一份数据同一时刻只能被一台机器修改,也就是说机器宕机时需要停很短时间写服务。

对于带有总控节点的系统,将CAP理论的定义做出适当的调整如下:

  • 一致性:读操作总是能读取到之前完成的写操作结果,且不需要依赖于操作合并
  • 可用性:读写操作总是能够在很短的时间内返回,即使某台机器发生了故障,也能够通过其它副本正常执行,而不需要等到机器重启或者机器上的服务分配给其它机器以后才能成功;
  • 分区可容忍性:能够处理机器宕机,机房停电或者出现机房之间网络故障等异常情况;

带有总控节点的NOSQL系统一般是最终一致性系统,允许机器宕机时停止很短时间,比如10s的部分数据写服务,但是不允许停读服务,且服务恢复时间越短越好。大多数NOSQL系统都是对一份数据保留多个备份,同一时刻只有一个备份为主,提供写服务,其它备份为辅,同步主备份的写操作,所有的备份都可以提供读取服务,且主备份提供保证强一致性的读服务。当主备份所在机器发生故障时,需要等一段时间才能由原来的辅备份接替主备份提供写服务。

类似Amazon的P2P去中心化系统提供需要依赖冲突合并的一致性,比如Cassandra中的“last write wins”冲突合并策略,虽然并不完美但确实能够解决很多问题。这样的系统能够通过用户配置NWR策略来权衡一致性和可用性,可以做到单台机器宕机时读写服务都不停止。

最后,再次提醒大家设计系统时:不要过分迷恋CAP,认清最终一致性,理智对待NWR。

时间: 2024-08-19 22:26:44

【分布式系统工程实现】CAP理论及系统一致性的相关文章

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

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

分布式系统之CAP理论

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

分布式服务化系统一致性的“最佳实干”

李艳鹏 易宝支付平台架构师,专注线上和线下支付平台的应用架构和技术架构的规划与落地,负责交易.支付.渠道.账务.计费.风控.对账等系统的设计与实现,在移动支付.聚合支付.合规账户.扫码支付.标记化支付等业务场景上有产品应用架构规划的经验. 1 背景 一致性是一个抽象的.具有多重含义的计算机术语,在不同应用场景下,有不同的定义和含义.在传统的IT时代,一致性通常指强一致性,强一致性通常体现在你中有我.我中有你.浑然一体:而在互联网时代,一致性的含义远远超出了它原有的含义,在我们讨论互联网时代的一致

关于CAP理论的一些笔记

CAP的概念 2000年,Eric Brewer 教授在 ACM 分布式计算年会上指出了著名的 CAP 理论: 分布式系统不可能同时满足一致性(C: Consistency),可用性(A: Availability)和分区容错性(P: Tolerance of network Partition)这三个需求.大约两年后,Seth Gilbert 和 Nancy lynch 两人证明了CAP理论的正确性. 三者的含义如下: Consistency:一致性,一个服务是一致的完整操作或完全不操作(A

浅谈 CAP 理论

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

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

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

CAP理论十二年回顾:&quot;规则&quot;变了

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

【分布式系统工程实现】GFS&amp;Bigtable设计的优势

目前,知名度比较高的通用存储系统包括:Google GFS&Bigtable,Amazon Dynamo,Microsoft Azure存储系统及Yahoo PNUTS.其中,GFS&Bigtable,Azure存储系统及Yahoo PNUTS都有总控节点,Amazon Dynamo采用去中心化的P2P设计. Amazon Dynamo看起来很优美,比如Dynamo论文中提到的技术比较酷,Dynamo没有中心节点,可以支持更大的系统规模.然而,Dynamo不是我心目中的理想架构,因为Dyn

棱镜-分布式实时计算的跟踪校验系统

该文章来自于阿里巴巴技术协会(ATA)精选文章. 摘要:*目前,各种分布式实时计算系统已经在各大互联网公司得到了广泛应用.但是,这些实时系统的计算过程多不进行持久化,如果出现消息丢失等异常情况,通常很难定位问题出现的位置和具体原因,更无法做到主动发现消息丢失.对于广告营销等对消息准确性要求较高的业务场景来说,这种消息丢失的代价通常很高,即便很低的消息丢失率也会造成大量的财物损失.为此,阿里妈妈开发了一套面向分布式实时计算框架storm的实时跟踪校验系统--棱镜系统,棱镜系统实时记录每条消息在st