本文参考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定理的更多相关文章

  1. 在分布式系统里看CAP定理

    本文转自:http://zhuanlan.51cto.com/art/201703/534587.htm 计算机界有很多高大上又难于理解的术语,CAP就是其中之一, 什么一致性(Consistency ...

  2. 分布式系统领域的 CAP 定理

    C 为数据一致性: A 为服务可用性: P 为服务对网络分区故障的容错性. 这三个特性在任何分布式系统中都不能同时满足,最多同时满足两个.

  3. CAP定理与BASE理论

    1. CAP定理 C:Consistency,一致性 A:Availability,可用性 P:Partition tolerance,分区容错性 CAP定理,指的是在一个分布式系统中,一致性.可用性 ...

  4. 分布式系统CAP定理

    分布式系统领域有个著名的CAP定理: C-数据一致性: A-服务可用性: P-服务对网络分区故障的容错性 这三个特性在任何分布式系统中不能同时满足,最多同时满足两个 ZooKeeper是个CP的,即任 ...

  5. 分布式系统CAP定理与BASE理论

    CAP定理: 一个分布式系统不可能同时满足一致性(C:Consistency).可用性(A:Availability)和分区容错性(P:Partition tolerance)这三个基本要求,最多只能 ...

  6. 简单了解下CAP定理与BASE定理

    分布式环境下的各种问题 通信异常 网络不可用风险高,消息丢失.消息延迟非常普遍 网络分区(脑裂)   网络发生异常情况,延迟增加,导致所有组成分布式系统的节点中,只有部分节点之间能够正常通信,而另一些 ...

  7. 分布式系统的CAP定理

    CAP定理: 在一个分布式系统中,Consistency(数据一致性). Availability(服务可用性).Partition tolerance(分区容错性),三者不可兼得. 一致性(Cons ...

  8. CAP原则(CAP定理)

    CAP原则又称CAP定理,指的是在一个分布式系统中, Consistency(一致性). Availability(可用性).Partition tolerance(分区容错性),三者不可得兼. CA ...

  9. 佳文分享:CAP定理

    1976年6月4号,周5,在远离音乐会大厅的一个楼上的房间内,在位于Manchester的Lesser Free Trade Hall ,Sex Pistols 乐队(注:Sex Pistols的经理 ...

随机推荐

  1. 带你十天轻松搞定 Go 微服务系列(八、服务监控)

    序言 我们通过一个系列文章跟大家详细展示一个 go-zero 微服务示例,整个系列分十篇文章,目录结构如下: 环境搭建 服务拆分 用户服务 产品服务 订单服务 支付服务 RPC 服务 Auth 验证 ...

  2. 右键没有word?excel?ppt?注解表该改改啦

    ✿[office 2019]office2010版本以上的都可以(例如:office 2010.office 2016.office 2019) 一.快速方法解决右键没有word: 在电脑桌面右键一个 ...

  3. C++ 子函数参数传递过程

    编译环境:Visual Studio 2015 参数传递与汇编语言有很大关系.子函数传递参数主要方式有三种(这三种参数传递方式都可用用于x86汇编语言甚至其它汇编语言): 寄存器方式传递参数 存储器方 ...

  4. Spring Cloud Alibaba Nacos 服务注册与发现功能实现!

    Nacos 是 Spring Cloud Alibaba 中一个重要的组成部分,它提供了两个重要的功能:服务注册与发现和统一的配置中心功能. 服务注册与发现功能解决了微服务集群中,调用者和服务提供者连 ...

  5. Maven 项目报出警告:Warning:java: source value 1.5 is obsolete and will be removed in a future release

    感谢原文作者:Hxinguan 原文链接:https://www.cnblogs.com/Hxinguan/p/6132446.html 问题: 1.创建maven项目的时候,jdk版本是1.5版本, ...

  6. aidl的应用场景

    支付宝 package com.tesy.alipay; import com.test.alipay.Iservice.Stub; import android.app.Service; impor ...

  7. NSMutableDictionary基本概念

    1.NSMutableDictionary 基本概念 什么是NSMutableDictionary NSMutableDictionary是NSDictionary的子类 NSDictionary是不 ...

  8. autorelease注意事项

    1.autorelease使用注意 并不是放到自动释放池代码中,都会自动加入到自动释放池 @autoreleasepool { // 因为没有调用 autorelease 方法,所以对象没有加入到自动 ...

  9. Swift 学习网址精选 By HL

    虽然目前iOS大部分的项目开发语言用的不是Swift,但随着Swift的不断强大,取代Objective-C 指日可待,所以学习Swift是十分必要的.但毕竟是亲儿子,目前只有Foundation被翻 ...

  10. Nginx+Tomcat 实现负载均衡 ,动静分离集群部署

    Nginx + Tomcat 实现负载均衡,动静分离集群部署 1.Nginx实现负载均衡原理 2.Nginx配置反向代理主要参数 3.实验 1.Nginx实现负载均衡原理: Nginx服务器作为前端, ...