【转】CAP定理的含义
转自:https://blog.csdn.net/pengjunlee/article/details/86517935
1998年,加州大学的计算机科学家 Eric Brewer 提出了分布式系统的三个指标:
C:Consistency,一致性。在分布式系统中的所有数据备份,在同一时刻具有同样的值,所有节点在同一时刻读取的数据都是最新的数据副本(all nodes see the same data at the same time)。
A:Availability ,可用性,好的响应性能。完全的可用性指的是在任何故障模型下,服务都会在有限的时间内处理完成并进行响应(Reads and writes always succeed)。
P:Partition Tolerance ,分区容错性,即分布式系统在遇到某些节点或网络分区故障的时候,仍然能够对外提供满足一致性或可用性的服务。分区容错性要求一个分布式系统中有某一个或者几个节点故障时,其他剩下的节点还能够正常运转并对外提供服务,对于用户而言并没有什么体验上的影响。
Eric Brewer 指出任何分布式系统只可同时满足CAP三个指标中的两个,无法三者兼顾,这个结论就叫做 CAP 定理。

定理解读
分布式的服务化系统都需要满足分区容忍性,那么我们必须在一致性(C)和可用性(A)之间进行权衡。在网络分区故障发生时,两个分布式节点之间无法进行通信,那么我们对一个节点进行的修改操作将无法同步到另外一个节点,所以数据的一致性(C)将无法满足,因为两个分布式节点的数据不再保持一致。除非我们牺牲可用性(A),也就是在网络分区故障发生时,暂停分布式系统对外提供修改数据服务,直到网络状况完全恢复正常再继续对外提供修改数据服务。
CP满足的情况下,A不能满足的原因:
若要满足一致性(C)就需要在多个分布式节点之间进行数据同步,在数据同步完成之前整个系统都将不可用。节点数量越多分区容错性(P)越好,同时数据同步所耗费的时间自然也就越长,从而无法在有限的时间内完成请求响应,导致可用性(A)不能满足。
CA满足的情况下,P不能满足的原因:
若要满足一致性(C)就需要在多个分布式节点之间进行数据同步,在数据同步完成之前整个系统都将不可用。需同步的节点数量越多,数据同步所需耗费的时间越长,可用性(A)也越差。若要同时保证可用性(A),那么需同步的节点数量就需要尽量减少,从而导致分区容错性(P)无法满足。
AP满足的情况下,C不能满足的原因:
节点的数量越多,分区容错性(P)越好,节点间数据同步所需耗费的时间越长,若要在有限的时间内完成请求响应即保证可用性(A),那么数据就可能不能及时地同步到其他节点,从而无法保证节点间的数据一致性(C)。
如何抉择
对于现如今大多数的互联网应用场景,都倾向于采用分布式微服务架构,它们通常节点众多、部署相对分散,随着集群规模变得越来越大,节点故障、网络故障已是常态。
在这种情况下,对于那些对数据一致性(C)要求不高的场景,例如电商系统,我们只需要保证分区容错性(P)和可用性(A),对于数据一致性(C)退而求其次仅保证数据的最终一致性即可。这虽然会某些地方影响客户体验,但并不会达到造成用户流失的严重程度。
对于像银行系统这类对数据一致性(C)要求较高的场景,数据一致性(C)必须保证。网络发生故障宁可停止服务(或者只读不写),这是保证分区容错性(P)和数据一致性(C),舍弃可用性(A)。
目前比较主流的注册中心有 Zookeeper、Eureka、Consul、Etcd 等,以Zookeeper 和Eureka为例, 在进行注册中心选择时,CAP又该如何抉择呢?
Zookeeper:CP设计,保证了一致性,集群搭建的时候,某个节点失效,则会进行选举新的Leader,或者半数以上节点不可用,则无法提供服务,因此可用性(A)没法满足。
Eureka:AP设计,无主从节点,一个节点挂了,自动切换其他节点继续使用,去中心化,但数据一致性(C)不满足。
在分布式系统中分区容错性(P)肯定要满足,所以只能在CA中二选一, 没有最好的选择,只有更适合的,我们需要根据自己的业务场景来进行架构设计:
如果要求一致性,则选择 Zookeeper,如金融行业
如果要求可用性,则选择 Eureka,如电商系统
【转】CAP定理的含义的更多相关文章
- 【转】CAP 定理的含义
原文链接:CAP 定理的含义 作者: 阮一峰 日期: 2018年7月16日 分布式系统(distributed system)正变得越来越重要,大型网站几乎都是分布式的. 分布式系统的最大难点,就是各 ...
- CAP 定理的含义
分布式系统(distributed system)正变得越来越重要,大型网站几乎都是分布式的. 分布式系统的最大难点,就是各个节点的状态如何同步.CAP 定理是这方面的基本定理,也是理解分布式系统的起 ...
- 佳文分享:CAP定理
1976年6月4号,周5,在远离音乐会大厅的一个楼上的房间内,在位于Manchester的Lesser Free Trade Hall ,Sex Pistols 乐队(注:Sex Pistols的经理 ...
- 架构设计之「 CAP 定理 」
在计算机领域,如果是初入行就算了,如果是多年的老码农还不懂 CAP 定理,那就真的说不过去了.CAP可是每一名技术架构师都必须掌握的基础原则啊. 现在只要是稍微大一点的互联网项目都是采用 分布式 结构 ...
- CAP定理(原则)以及BASE理论
CAP定理(原则)以及BASE理论 CAP定理(原则)概念 CAP原则又称CAP定理,指的是在一个分布式系统中, Consistency(一致性). Availability(可用性).Partiti ...
- 架构设计之CAP定理
一.什么是 CAP? 「 CAP定理 」又被称为 布鲁尔定理,它提出对于一个分布式系统而言,不能同时满足以下三点: Consisteny(一致性) Availability(可用性) Partitio ...
- 架构师都该懂的 CAP 定理
面对可能出现的网络延迟,不可预估的请求流量等情况,设计一个分布式系统,我们通常围绕系统高可用,数据一致性的目标去规划和实现,想要完全实现这个目标,却并非易事.由此,分布式系统领域诞生了一个基本定理,即 ...
- 关于ACID,BASE和CAP定理的探究
前言 当我看到"根据CAP理论,由于分布式系统必须保证分区容错性,所以只能选择AP原则或者CP原则"这种结论时,我感到很疑惑: 什么是分区容错性? 为什么分布式系统必须保证分区容错 ...
- CAP定理
from wikipedia CAP定理 CAP定理(CAP theorem),又被称作布鲁尔定理(Brewer's theorem),它指出对于一个分布式计算系统来说,不可能同时满足以下三点: 一致 ...
随机推荐
- Java基础00-形参和返回值22
1. 形参和返回值 1.1 类名作为形参和返回值 1.2 抽象类名作为形参和返回值 代码示例: 方法的形参是抽象类名 抽象动物类:定义了一个抽象的eat方法 动物的操作类:创建一个useAnimal方 ...
- SLAM的数学基础(4):先验概率、后验概率、贝叶斯准则
假设有事件A和事件B,可以同时发生但不是完全同时发生,如以下韦恩图所示: 其中,A∩B表示A和B的并集,即A和B同时发生的概率. 如此,我们很容易得出,在事件B发生的情况下,事件A发生的概率为: 这个 ...
- 排列组合的实现(js描述)
组合的实现 排列组合描述和公式 犹记得高中数学,组合表示C(m, n),意思为从集合m,选出n个数生成一项,总共有多少个项的可能?组合是无序的,排列是有序的.所以排列的项数量多于组合 排列A(n,m) ...
- Samba 远程命令执行漏洞(CVE-2017-7494)
该漏洞影响Samba 3.5.0之后的所有版本,在4.6.4/4.5.10/4.4.14修复了这个漏洞 use exploit/linux/samba/is_known_pipename set rh ...
- php中英文字符串转字母转大小写
<?php //转小写 function lowercase($a){ $b = str_split($a, 1); $r = ''; foreach($b as $v){ $v = ord($ ...
- AT指令集及其通信测试方式
1 前言 AT即Attention,AT指令集是从终端设备(Terminal Equipment,TE)向终端适配器(Terminal Adapter, TA)发送的.通过TA,TE发送AT指令来控制 ...
- iTop安装 vm虚拟机、Linux、centos7安装itop 2.6.1
itop安装流程,是我基于下面两位博主发布的文章整理出来的,欢迎大家学习,如有错误之处请大家留言指出我看到之后及时更新.谢谢 https://blog.csdn.net/qq_23565543/art ...
- java 注释,关键字和标识符
注释 注释是为了防止当写代码的时间过久了之后,忘记了这行代码的意思或者是在一个大型的项目里面,不可能每一个模块的功能你都记得,所以需要一个注释来帮助记忆. 注释不会被执行 平时写代码一定要养成写注释的 ...
- 【网络编程】TCPIP_1_快速入门
目录 前言 1. 快速入门 1.1 服务端编程简要步骤 1.2 客户端编程简要步骤 1.3 参考 前言 说明: demo 基于 Linux. 1. 快速入门 以下步骤简略了很多细节,但是通过下面的几个 ...
- Linux系统CPU信息查询方法
lscpu cat /proc/cpuinfo对绝大多数Linux适用,lscpu更简练 cat /proc/cpuinfo 下面是一个实例: processor : 0 vendor_id : Ge ...