分布式系统下的CAP定理
本文参考EricBrewer博客加上自己的理解整理。
CAP定理又被成为布鲁尔定理,是加州大学计算机科学家埃里克·布鲁尔提出来的猜想,后来被证明成为分布式计算领域公认的定理。

CAP定义,在高并发的场景下要做取舍,在大型集群中分区容错很难保证,一旦要确保容错性,那么就会损失数据一致性和高可用特性。所以可以认为CAP 的 P 总是成立,剩下的 C 和 A 无法同时做到。
1 CAP理解
C 一致性(Consistency)
系统由G1,G2两台服务器组成,两台服务器都有一个数据 V,初始值为V0。G1和G2相互可以通信,也可以与客户端通信。如下图

客户端向G1写入数据,将G1中的V值改成V1,并从G1中读取V的值。目前操作是具备一致的的。如下图

那么此时如果向G2发起读请求的话,因为数据没有同步,就会得到V的值为V0,实际已经向集群写入了V=V1,此时数据不一致。如下图

我们可以通过G1将数据同步到G2,这时客户端再去读取,就会解决一致性的问题。如下图

小结
一致性是指分布式系统中,数据在多节点存在副本,数据如果一直不修改,在读的时候是不存在问题的,访问哪个节点的数据都一样。可一旦要是发生了修改,如果数据同步无法在修改的瞬间广播到所有副本节点那么在读的时候就可能发生数据脏读。
A 可用性(Availability)
指的是服务是否可用,范围涵盖终端客户访问我们的系统或者是集群内部相互通讯交换数据,也就是说在Client向Server发起请求时,服务器返回了正确的响应,称之为可用,反之为不可用。
这里有一个问题,如果发送请求在很久之后才返回数据,那么算不算可用?
所以要提出访问延迟的概念,在某个时间范围内响应才算可用。
1s法则
1S法则是面向WEB端,H5链路上加载性能 和体验方向上的一个指标,具体指:
- “强网” (4G/WIFI)下,1秒完全完成页面加载,包括首屏资源,可看亦可用;
- 3G下1秒完成首包的返回 ;
- 2G下1秒完成建连。
P 分区容错性(Partition tolerance)
指发生在分布式系统内部相互访问的通信网络不可以用,但系统依然正常对外提供服务。如下图

上图说明:
集群中存在3台节点:server1、server2、server3 。集群内部server1和server3网络不可用,但是server1和server2,server2和server3相互通信是正常的。客户端client1可以与server1和server2通信,客户端client2可以与server2和server3通信。整个集群对于客户端来说不会因为server1和server3之前网络不可用而停止服务。因此我们可以认为集群分区具备容错性。
小结
分区容错性是指分区具有容错性,我们可以尽可能的提高容错性,但是无法避免,如果发生失败,就要在A和C之间做出选择。要么停止系统进行错误恢复,要么继续服务但是降低一致性,所以我们只能保证AP或CP。
2 BASE理论
eBay的架构师Dan Pritchett源于对大规模分布式系统的实践总结,在ACM上发表文章提出BASE理论,BASE理论是对CAP理论的延伸,核心思想是即使无法做到强一致性(StrongConsistency,CAP的一致性就是强一致性),但应用可以采用适合的方式达到最终一致性(Eventual Consitency)。
基本可用(Basically Available)
在分布式系统出现故障的时候,允许损失部分可用性,支持分区失败,即保证核心可用。
软状态(Soft State)
接受一段时间的状态不同步,及中间状态,而改中间状态不影响系统整体可用性。这里的中间状态就是CAP理论中的数据不一致性。
最终一致性(Eventually Consistent)
上面说软状态,然后不可能一直是软状态,必须有个时间期限。在期限过后系统能够保证在没有其他新的更新操作的情况下,数据最终一定能够达到一致的状态,因此所有客户端对系统的数据访问最终都能够获取到最新的值。
3 基于CAP架构选型对比
Zookeeper集群
保证CP。即任何时刻对zookeeper的访问请求能得到一致性的数据结果,同时系统对网络分割具备容错性,但是它不能保证每次服务的可用性。从实际情况来分析,在使用zookeeper获取服务列表时,如果zk正在选举或者zk集群中半数以上的机器不可用,那么将无法获取数据。所以说,zk不能保证服务可用性。
Redis集群
保证AP。Redis通过AOF和RDB将数据同步到子节点。如果Master节点挂了,可以很迅速的将Slave提升为Master,尽可能的保证了系统的可用性,但是可能存在数据丢失的问题。所以Redis其实并不适合做分布式锁。
Eureka集群
保证AP,eureka在设计时优先保证可用性,每一个节点都是平等的,一部分节点挂掉不会影响到正常节点的工作,不会出现类似zk的选举leader的过程,客户端发现向某个节点注册或连接失败,会自动切换到其他的节点,只要有一台eureka存在,就可以保证整个服务处在可用状态,只不过有可能这个服务上的信息并不是最新的信息。
分布式系统下的CAP定理的更多相关文章
- 在分布式系统里看CAP定理
本文转自:http://zhuanlan.51cto.com/art/201703/534587.htm 计算机界有很多高大上又难于理解的术语,CAP就是其中之一, 什么一致性(Consistency ...
- 分布式系统领域的 CAP 定理
C 为数据一致性: A 为服务可用性: P 为服务对网络分区故障的容错性. 这三个特性在任何分布式系统中都不能同时满足,最多同时满足两个.
- CAP定理与BASE理论
1. CAP定理 C:Consistency,一致性 A:Availability,可用性 P:Partition tolerance,分区容错性 CAP定理,指的是在一个分布式系统中,一致性.可用性 ...
- 分布式系统CAP定理
分布式系统领域有个著名的CAP定理: C-数据一致性: A-服务可用性: P-服务对网络分区故障的容错性 这三个特性在任何分布式系统中不能同时满足,最多同时满足两个 ZooKeeper是个CP的,即任 ...
- 分布式系统CAP定理与BASE理论
CAP定理: 一个分布式系统不可能同时满足一致性(C:Consistency).可用性(A:Availability)和分区容错性(P:Partition tolerance)这三个基本要求,最多只能 ...
- 简单了解下CAP定理与BASE定理
分布式环境下的各种问题 通信异常 网络不可用风险高,消息丢失.消息延迟非常普遍 网络分区(脑裂) 网络发生异常情况,延迟增加,导致所有组成分布式系统的节点中,只有部分节点之间能够正常通信,而另一些 ...
- 分布式系统的CAP定理
CAP定理: 在一个分布式系统中,Consistency(数据一致性). Availability(服务可用性).Partition tolerance(分区容错性),三者不可兼得. 一致性(Cons ...
- CAP原则(CAP定理)
CAP原则又称CAP定理,指的是在一个分布式系统中, Consistency(一致性). Availability(可用性).Partition tolerance(分区容错性),三者不可得兼. CA ...
- 佳文分享:CAP定理
1976年6月4号,周5,在远离音乐会大厅的一个楼上的房间内,在位于Manchester的Lesser Free Trade Hall ,Sex Pistols 乐队(注:Sex Pistols的经理 ...
随机推荐
- centos7 查看开机启动项
使用 systemctl list-unit-files 查看开机启动项 systemctl is-enabled redis.service 是否开机启动
- Ali云组件概念
- Spring专题2: DI,IOC 控制反转和依赖注入
合集目录 Spring专题2: DI,IOC 控制反转和依赖注入 https://docs.spring.io/spring/docs/2.5.x/reference/aop.html https:/ ...
- HTML 基础3
表格 示例1: <h4>水平表头+普通边框</h4> <table border="1"> <caption>caption标签展示 ...
- Spring源码-IOC部分-Spring是如何解决Bean循环依赖的【6】
实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring ...
- JoJoGAN 实践
JoJoGAN: One Shot Face Stylization. 只用一张人脸图片,就能学习其风格,然后迁移到其他图片.训练时长只用 1~2 min 即可. code paper 效果: 主流程 ...
- Hive安装教程
Hive的安装和使用 我的版本: JAVA_HOME=/usr/local/soft/jdk1.8.0_171 HADOOP_HOME=/usr/local/soft/hadoop-2.7.6 HIV ...
- Antd组件Table树型多选全选问题
组件库antd里面的树型选择不能做到勾选父组件然后一起勾选子组件情况,我也不知道是组件库的问题还是原本设计就是这样 刚好组件库存在rowselection的配置项,既然存在拓展方法,又遇到需求,那么就 ...
- js Array.prototype.slice.call(arguments,0) 理解
Array.prototype.slice.call(arguments,0) 经常会看到这段代码用来处理函数的参数 网上很多复制粘帖说:Array.prototype.slice.call(argu ...
- 使用ajax上传文件
1. XMLHttpRequest(原生ajax) [](javascript:void(0) <input class="file" type="file&quo ...