分布式系统设计权衡之CAP

写在最前:


1.为什么学习并记录分布式设计理念一系列相关的东西


在日常工作中系统设计评审的时候,经常会有一些同事抛出一些概念,高可用性,一致性等等字眼,他们用这些最基本的概念去反驳系统最初的设计,但是很多人理解的可用性,一致性等等问题,都是自己拍脑袋想的,或者根本和最原始表达的意思就不是一个东西,在这种情况下PK,就像不再一个频段的人在交流,除了争论,没有任何实质性的进展,所以有必要熟悉其理论基础,以免贻笑大方。(其实类似的例子还有很多,国内的技术人员都喜欢把一些此词模糊化,混淆而谈。例如XX云,实际卖的就是vps
和一小部分saas,这就叫cloud computing?)

2.准备说哪些东西

分布式系统设计在评审时,争论得最多的地方,其实也就是著名的cap理论,本文也主要对CAP理论加以自己的理解和应用

CAP理论


什么是分布式系统

部分在不同的节点上,通过网络协同工作的系统叫做分布式系统

CAP分别代表什么


? Consistency
  ? (all nodes see the same data at the same
time)
? Availability
  ? Reads and writes always succeed.
?
Partition tolerance
  ? (the system continues to operate despite
arbitrary message loss or failure of part of the system)

一致性: 更新操作成功并返回客户端完成后,分布式的所有节点在同一时间的数据完全一致

可用性:     读和写操作都能成功

分区容错性:再出现网络故障导致分布式节点间不能通信时,系统能否继续服务

CAP的是什么关系

It states, that though its desirable to have Consistency, High-Availability
and Partition-tolerance in every system, unfortunately no system can achieve all
three at the same time.
在分布式系统的设计中,没有一种设计可以同时满足一致性,可用性,分区容错性
3个特性


注意:不要将弱一致性,最终一致性放到CAP理论里混为一谈(混淆概念的坑真多)
弱一致性,最终一致性
你可以认为和CAP的C一点关系也没有,因为CAP的C是更新操作完成后,任何节点看到的数据完全一致,
弱一致性。最终一致性本身和CAP的C一致性是违背的,所以你可以看到那些谎称自己系统同时具备CAP
3个特性是多么的可笑,可能国内更多的场景是:一个开放人员一旦走上讲台演讲,就立马转变为了营销人员,连最基本的理念也不要了。
这里有一篇标题很大的文章 
cap-twelve-years-later-how-the-rules-have-changed
,实际上本文的changed更多的是在思考方式上,而本身CAP理论是没有changed的

为什么会是这样

我们来看一个简单的问题, 一个DB服务   搭建在两个机房(北京,广州),两个DB实例同时提供写入和读取

1.
假设DB的更新操作是同时写北京和广州的DB都成功才返回成功
     
在没有出现网络故障的时候,满足CA原则,C 即我的任何一个写入,更新操作成功并返回客户端完成后,分布式的所有节点在同一时间的数据完全一致, A
即我的读写操作都能够成功,但是当出现网络故障时,我不能同时保证CA,即P条件无法满足

2.
假设DB的更新操作是只写本地机房成功就返回,通过binlog/oplog回放方式同步至侧边机房
     
这种操作保证了在出现网络故障时,双边机房都是可以提供服务的,且读写操作都能成功,意味着他满足了AP
,但是它不满足C,因为更新操作返回成功后,双边机房的DB看到的数据会存在短暂不一致,且在网络故障时,不一致的时间差会很大(仅能保证最终一致性)

3.
假设DB的更新操作是同时写北京和广州的DB都成功才返回成功且网络故障时提供降级服务
     
降级服务,如停止写入,只提供读取功能,这样能保证数据是一致的,且网络故障时能提供服务,满足CP原则,但是他无法满足可用性原则

选择权衡

通过上面的例子,我们得知,我们永远无法同时得到CAP这3个特性,那么我们怎么来权衡选择呢?
选择的关键点取决于业务场景

对于大多数互联网应用来说(如网易门户),因为机器数量庞大,部署节点分散,网络故障是常态,可用性是必须需要保证的,所以只有设置一致性来保证服务的AP,通常常见的高可用服务吹嘘5个9
6个9服务SLA稳定性就本都是放弃C选择AP

对于需要确保强一致性的场景,如银行,通常会权衡CA和CP模型,CA模型网络故障时完全不可用,CP模型具备部分可用性,实际的选择需要通过业务场景来权衡(并不是所有情况CP都好于CA,只能查看信息不能更新信息有时候从产品层面还不如直接拒绝服务)

延伸

BASE(Basically Available, Soft State, Eventual Consistency 
基本可用、软状态、最终一致性) 对CAP AP理论的延伸, Redis等众多系统构建与这个理论之上
ACID  传统数据库常用的设计理念,
ACID和BASE代表了两种截然相反的设计哲学,分处一致性-可用性分布图谱的两极。

扩展阅读

Daniel Abadi认为  CAP  应该叫 PACELC  
http://dbmsmusings.blogspot.jp/2010/04/problems-with-cap-and-yahoos-little.html
Brewer‘s
CAP Theorem  
http://www.julianbrowne.com/article/viewer/brewers-cap-theorem
Foundationdb
的CAP权衡选择  https://foundationdb.com/white-papers/the-cap-theorem

分布式系统设计权衡之CAP,布布扣,bubuko.com

时间: 2024-10-14 03:23:21

分布式系统设计权衡之CAP的相关文章

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

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

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

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

分布式系统设计系列 -- 基本原理及高可用策略

转自:http://blog.csdn.net/gugemichael/article/details/36688043 ==> 分布式系统中的概念==> 分布式系统与单节点的不同==> 分布式系统特性==> 分布式系统设计策略==> 分布式系统设计实践 [分布式系统中的概念] 三元组 其实,分布式系统说白了,就是很多机器组成的集群,靠彼此之间的网络通信,担当的角色可能不同,共同完成同一个事情的系统.如果按"实体"来划分的话,就是如下这几种:       

分布式系统设计系列 -- 概要

在现在的"大数据"."云平台"这些前沿技术的背景下,衍生了很多平台型技术点,Nosql.Hadoop.Storm等层出不穷.这些华丽的技术后面其实处处都离不开"分布式"这个虽然提出了很久,但是大数据.云计算带火了的技术.以致于开个玩笑说,如果不懂一些"分布式"下的技术和原理的,会有点不好意思说自己是后端开发 -- (玩笑而已!! ^_^). 本人从事分布式系统相关设计.开发也有一段时间了,在做很多系统的设计.架构时,惯性的会多

分布式系统设计系列 -- 总结

在今天的"大数据"."云平台"背景下,这些尖端技术,从一个非常多平台技术派生点,Nosql.Hadoop.Storm和其他新兴.技术落后,这些华丽是分不开的,其实无处不在"分散式"虽然这做了一个很长的时间,但是大数据.云计算技术与火.玩笑说.假设不懂一些"分布式"下的技术和原理的,会有点不好意思说自己是后端开发 -- (玩笑而已!! ^_^). 本人从事分布式系统相关设计.开发也有一段时间了,在做非常多系统的设计.架构时,惯性

[转载]浅析海量用户的分布式系统设计

我们常常会听说,某个互联网应用的服务器端系统多么牛逼,比如QQ拉.微信拉.淘宝拉.那么,一个互联网应用的服务器端系统,到底牛逼在什么地方?为什么海量的用户访问,会让一个服务器端系统变得更复杂?本文就是想从最基本的地方开始,探寻服务器端系统技术的基础概念. 承载量是分布式系统存在的原因 当一个互联网业务获得大众欢迎的时候,最显著碰到的技术问题,就是服务器非常繁忙.当每天有1000万个用户访问你的网站时,无论你使用什么样的服务器硬件,都不可能只用一台机器就承载的了.因此,在互联网程序员解决服务器端问

浅析海量用户的分布式系统设计

我们常常会听说,某个互联网应用的服务器端系统多么牛逼,比如QQ拉.微信拉.淘宝拉.那么,一个互联网应用的服务器端系统,到底牛逼在什么地方?为什么海量的用户访问,会让一个服务器端系统变得更复杂?本文就是想从最基本的地方开始,探寻服务器端系统技术的基础概念. 承载量是分布式系统存在的原因 当一个互联网业务获得大众欢迎的时候,最显著碰到的技术问题,就是服务器非常繁忙.当每天有1000万个用户访问你的网站时,无论你使用什么样的服务器硬件,都不可能只用一台机器就承载的了.因此,在互联网程序员解决服务器端问

分布式事务,EventBus 解决方案:CAP【中文文档】(转)

出处:http://www.cnblogs.com/savorboard/p/cap-document.html 前言 很多同学想对CAP的机制以及用法等想有一个详细的了解,所以花了将近两周时间写了这份中文的CAP文档,对 CAP 还不知道的同学可以先看一下这篇文章. 本文档为 CAP 文献(Wiki),本文献同时提供中文和英文版本,英文版本目前还在翻译中,会放到Github Wiki 中. 目录 前言 1.Getting Started 1.1 介绍 1.2 应用场景 1.3 Quick St

.NET Core 事件总线,分布式事务解决方案:CAP

背景 相信前面几篇关于微服务的文章也介绍了那么多了,在构建微服务的过程中确实需要这么一个东西,即便不是在构建微服务,那么在构建分布式应用的过程中也会遇到分布式事务的问题,那么 CAP 就是在这样的背景下诞生的. 最初打算做这个东西是在去年(2016)年底,最初是为了解决分布式系统中的分布式事务的问题,然后当时有了一个大概的概念轮廓,当时我对于前面两篇文章中关于异步消息和微服务之间通讯还不是太了解,只是觉得这样能够解决这一系列的问题,然后就着手做了,最后发现和这些概念竟然不谋而合. 经过大半年的不