重温分布式系统的CAP理论

1. CAP理论的历史

2000年7月,Eric Brewer教授提出CAP猜想;2年后,Seth Gilbert和Nancy Lynch从理论上证明了CAP;之后,CAP理论正式成为分布式计算领域的公认定理。

2. CAP的背景和定义

CAP理论讨论的对象是分布式场景。一个分布式系统需要满足三个最基本的特性,分别是一致性(Consistency)、可用性(Availability)和分区容错性(Partition Tolerance,这个中文翻译很不直观,没能体现Partition原来的意思,这也人为拉高了理解成本,至少对以前的我是这样,后面会单独介绍)。CAP理论的简单解释就是,不可能存在一个完美的分布式架构,能同时满足这三个特性。架构师们不要试图花精力去设计一个“完美”的架构来满足这三个特性,而是应该因地制宜,根据实际的需求在CAP之间做权衡。

这里也只是从字面意思对CAP做了个翻译,并不便于理解,下面结合一个具体的例子来说明。

下图是一个假想的最小(典型的)分布式应用场景:

  • 两台服务器Node1, Node2(在分布式环境中,习惯叫节点)构成一个服务集群,对外提供服务
  • 客户Client可以随机访问任何一台服务器上的服务
  • 两台服务器内部之间也可以互相访问

这个简单的分布式系统需要满足哪些特性才算得上是一个比较好的系统(产品)呢?思考以下几个场景:

  1. 客户访问Node1时写入了一个数据(比如往账户存了100元),当客户要读取该值时又随机访问了Node2,系统需要保证Node2也能够返回正确的值,这个就是所谓的一致性要求(Consistency)。

    一致性的权威解释如下(来自证明CAP理论的原作者):

    Consistency

    any read operation that begins after a write operation completes must return that value, or the result of a later write operation

  2. 当客户访问某个节点时,如果该节点正常工作,系统需要保证该节点必须要给客户一个响应(可以是错误的响应,也可以有一定的延迟,但是不能没有响应),也就是说任何时刻必须保证请求能得到响应,这就是系统的可用性要求(Availability)

    Availability

    every request received by a non-failing node in the system must result in a response

  3. 在分布式环境中,每个节点都不是可靠的,各节点之间的通信也可能出问题。当某些节点出现故障(或者节点本身的故障,或者部分网络故障)时,整个系统就产生了所谓的”分区“。当系统产生”分区“的时候,如果还能对外提供比较好的服务(例如较好的一致性和可用性),就可以说该系统具有较好的”分区容错性“(Partition Tolerance)。

    如果对分区还不好理解的话,看看partition的英文解释吧:

    (n.) a wall or screen that separate one part of a room from another

    (v.) to separate one area, one part of a room, etc. from another with a wall or screen

    就是分割、隔离的意思,也就是说因为某些原因,部分节点被隔离到集群之外的时候,整个系统还能够正常工作,对外表现得就像没事儿一样。

    Partition Tolerance

    the network will be allowed to lose arbitrarily many messages sent from one node to another

3. CAP为什么不能同时满足

有兴趣深入了解的同学,可以在这里看原始的证明:

https://groups.csail.mit.edu/tds/papers/Gilbert/Brewer2.pdf

浅显易懂点的,可以参考这篇文章:

https://mwhittaker.github.io/blog/an_illustrated_proof_of_the_cap_theorem/

再简单点的解释就是这样,考虑下面的一个场景:

Client写入数据到Node1;Node2出现分区导致Node1的数据没有同步到Node2;Client访问Node2读取数据

  • 同时满足AP:系统保证在Node2出现分区的情况下,还能立即返回结果给Client。但此时Node2还没有同步到Node1的数据,所以没法保证数据的一致性
  • 同时满足CP:系统保证在Node2出现分区的情况下,能返回一致的结果给Client。这个只能等到Node2正确同步到Node1的数据之后才能返回(有可能永远同步不了),因此不能立即返回(也可能永远无法返回),也就失去了可用性
  • 同时满足CA:Node2能保证返回准确一致的数据给到Client,但考虑到这是一个分布式系统,是没法保证每个节点都能正常工作不产生分区的(虽然集群的所有节点同时出现故障的概率非常低,但是单个节点出现故障的概率还是比较高的)

4. CAP理论在现实中的应用

既然理论是这样,我们就不要浪费时间去设计完美的分布式系统,这就是方法论起的作用。

考虑到在分布式场景中,系统产生分区的情况无法避免,我们就只能尽量提供一个比较好的”分区容错性“的产品。换句话说,我们需要在系统出现分区的时候,在一致性和可用性之间做权衡。

  • CP:优先保证数据的一致性,在数据没有一致的情况下,可以适当降低系统的可用性,比如放弃当前的请求,让客户端重试;或者降低对客户端的响应速度(比如银行转账结束时等待5s的提示界面)。ZooKeeper被设计为在分布式系统中协调服务、保证各服务节点数据一致的产品,就是CP的例子。还有各种分布式数据库产品,如Redis、HBase,也都是偏向数据一致性的CP的例子。
  • AP:优先保证系统的可用性,降低数据的一致性诉求。比如电商网站的下单界面展示的可购买数量,这个是时时变化的。如果要保证一致性,则需要系统时时刷新获取最新的数据,势必会影响网站的响应速度,也就降低了可用性,影响用户体验(可以改为在真正下单的那一刻再提示库存是否满足下单条件)。

实际上,随着基础设施越来越完善,分布式系统中出现P的情况也可以控制的越来越精细。在不用特别担心P的情况下,系统在大多数情况下是可以做到完美的C和A的,具体可参考原作者的另外一篇文章(强烈推荐):CAP 理论十二年回顾:"规则"变了

中文版:https://www.infoq.cn/article/cap-twelve-years-later-how-the-rules-have-changed

英文版:https://www.infoq.com/articles/cap-twelve-years-later-how-the-rules-have-changed

原文地址:https://www.cnblogs.com/justinme/p/10371684.html

时间: 2024-10-09 09:34:48

重温分布式系统的CAP理论的相关文章

分布式系统的CAP理论

一.CAP理论概述 一个分布式系统最多只能同时满足一致性(Consistency).可用性(Availability)和分区容错性(Partition tolerance)这三项中的两项. 二.CAP的定义 1.Consistency 一致性 一致性指"all nodes see the same data at the same time",即更新操作成功并返回客户端完成后,所有节点在同一时间的数据完全一致. 对于一致性,可以分为从客户端和服务端两个不同的视角. 从客户端来看,一致性

【D】分布式系统的CAP理论

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

分布式系统之CAP理论

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

转载:分布式系统的CAP理论

原文转载Hollis原创文章:http://www.hollischuang.com/archives/666 2000年7月,加州大学伯克利分校的Eric Brewer教授在ACM PODC会议上提出CAP猜想.2年后,麻省理工学院的Seth Gilbert和Nancy Lynch从理论上证明了CAP.之后,CAP理论正式成为分布式计算领域的公认定理. CAP理论概述 一个分布式系统最多只能同时满足一致性(Consistency).可用性(Availability)和分区容错性(Partiti

分布式系统CAP理论

引言 CAP是分布式系统.特别是分布式存储领域中被讨论最多的理论,“什么是CAP定理?”在Quora 分布式系统分类下排名 FAQ 的 No.1.CAP在程序员中也有较广的普及,它不仅仅是“C.A.P不能同时满足,最多只能3选2”,以下尝试综合各方观点,从发展历史.工程实践等角度讲述CAP理论.希望大家透过本文对CAP理论有更多地了解和认识. CAP定理 CAP由Eric Brewer在2000年PODC会议上提出[1][2],是Eric Brewer在Inktomi[3]期间研发搜索引擎.分布

分布式系统的CAP和BASE理论

1. 背景 网络分区:俗称“脑裂”.当网络发生异常情况,导致分布式系统中部分节点之间的网络延时不断变大,最终导致组成分布式系统的所有节点中,只有部分节点之间能够进行正常通信,而另一些节点则不能.当网络分区出现时,分布式系统会出现局部小集群. 2. CAP CAP理论指的是在一个分布式系统中,不可能同时满足Consistency(一致性).Availablity(可用性).Partition tolerance(分区容错性)这三个基本需求,最多只能满足其中的两项. 2.1 一致性(C) 数据在多个

从分布式一致性谈到CAP理论、BASE理论

问题的提出 在计算机科学领域,分布式一致性是一个相当重要且被广泛探索与论证问题,首先来看三种业务场景. 1.火车站售票 假如说我们的终端用户是一位经常坐火车的旅行家,通常他是去车站的售票处购买车票,然后拿着车票去检票口,再坐上火车,开始一段美好的旅行----一切似乎都是那么和谐.想象一下,如果他选择的目的地是杭州,而某一趟开往杭州的火车只剩下最后一张车票,可能在同一时刻,不同售票窗口的另一位乘客也购买了同一张车票.假如说售票系统没有进行一致性的保障,两人都购票成功了.而在检票口检票的时候,其中一

CAP理论 (转)

CAP理论在互联网界有着广泛的知名度,知识稍微宽泛一点的工程师都会把其作为衡量系统设计的准则.大家都非常清楚地理解了CAP:任何分布式系统在可用性.一致性.分区容错性方面,不能兼得,最多只能得其二,因此,任何分布式系统的设计只是在三者中的不同取舍而已. 事实上,让人吃惊的是,CAP在国外的响力完全不如所想,相反还伴随着诸多的争论.下面我们系统地阐述一下CAP的来龙去脉. 1.CAP的历史 1985年Lynch证明了异步通信中不存在任何一致性的分布式算法(FLP Impossibility)的同时

分布式领域CAP理论

分布式领域CAP理论具体如下:Consistency(一致性):数据一致更新,所有数据变动都是同步的:Availability(可用性):好的响应性能:Partition tolerance(分区容错性):可靠性: 定理:任何分布式系统只可同时满足二点,没法三者兼顾.忠告:架构师不要将精力浪费在如何设计能满足三者的完美分布式系统,而是应该进行取舍. 关系数据库的ACID模型拥有 高一致性 + 可用性,很难进行分区:Atomicity原子性:一个事务中所有操作都必须全部完成,要么全部不完成.Con