CAP

CAP 理论是分布式系统中的一个老生常谈的理论了,最早由 Eric Brewer一个讲座中提出。在这个讲座中,在传统 ACID 理论以及当时比较流行但是比较抽象的的设计指导理论 BASE 理论(当时的 BASE 理论还很抽象,直到好几年后才出现一份比较权威的被广泛接受的 BASE 理论完整解释和设计)的类比中,提出

  • C(Consistency,一致性):在一个分布式的系统中,同一个数据所有备份,在同一时刻是否有相同的值。也就是,对于同一个数据的读写,是否立刻对于所有副本都能看到一致的结果。一种比较常见的强一致性实现就是,在看到一致的结果之前,写请求不返回,读请求阻塞或者超时。
  • A(Availability,可用性):在集群中一些节点故障时,集群还可以响应读写请求
  • P(Partition-tolerance,分区容忍性):分布式系统具有多个节点,如果节点间网络中断,就会造成分区

并且提出了,CAP 并不能全部满足,而是一般选两个满足

之后,Seth Gilbert 以及 Nancy Lynch一篇 Notes中,证明了 CAP 并不能同时都满足。并且,将 CAP 定义的更加清晰:

  • C: 需要满足原子一致性,也就是任何读写都是具有原子性的,也就是对于同一个数据的写之后的读取,一定能读取到写的值,也就是最新的值
  • A:对于所有成功的请求,都需要在有限的时间内返回,也就是成功请求是有效的,可终止的。
  • P:可能节点间传输丢失一些消息

CA 系统

也就是不允许分区的系统,也其实就不是分布式系统,而是单机系统。例如单机数据库,或者是共享存储数据库,比如 Aurora DB 类似的思路设计的数据库,共享同一份存储,上面建立不同的 MySQL 进程,一个 MySQL 读写,其他的只读,由于使用的同一块存储,并且只有一个 MySQL 进程写入,满足 ACID 的事务特性,能保证强一致性,以及可用性。

CP 系统

也就是不要求高可用性,但是要求强一致性的系统,哪怕当前业务不可用,也不能出现数据不一致的情况。并且,如果节点间传输消息丢失导致没有同步成功,或者重试,或者返回更新失败,回滚更新请求

CP 的一种实际应用就是分布式锁,一般的,如果没有获取到锁,或者获取锁失败,我们都会选择阻塞等待,或者直接失败,而不会冒着可能会有并发危险而去执行业务。并且,分布式锁必须保持所有节点看到的锁状态一致,不能有差异,否则认为获取锁失败。

同时,大部分分布式数据库都是 CP 系统,但是他们的一致性协议方案是不同的,常见的例如 Paxos,2PC,3PC,RAFT等等。

AP 系统

也就是要求高可用性,但是不用强一致性的系统。在这种情况下,一旦分区发生,节点间的数据可能不一致,每个节点用自己的本地数据继续提供服务。这样情况下,可能会出现数据不一致,系统一般会实现最终一致性。也就是在分区结束后,通过一些机制将数据同步。

基本上具有多层缓存的系统,都是 AP 的系统设计。例如 DNS,客户端缓存,浏览器缓存以及进程内缓存等等。

一个 CP 与 AP 系统的对比

一个比较经典的例子就是 Zookeeper 作为注册中心和 Eureka 作为注册中心。

假设注册中心有两个接口,一个是注册实例,一个是读取实例。

如果以 Zookeeper 为注册中心,对于注册实例请求也就是更新请求,采用的是过半写以及 2 PC 的同步机制。

只有过半 2PC 更新成功,这个注册请求才成功,这样读取每个节点都会读取到这个更新请求,否则会回滚已经更新的节点。并且每个节点数据是一致的。如果过半的节点不可用,那么整个集群都不能处理注册实例请求以及读取实例的请求。这样保证的强一致性,但是可用性是打了折扣的。

如果以 Eureka 为注册中心,注册请求发到一个 Eureka 实例上之后,这个 Eureka 会转发到集群内其他 Eureka 节点。

即使某些节点失败,也不会将已经更新的回滚。并且无论集群内哪些 Eureka 挂了,也不会影响其他正常的 Eureka 继续服务工作,虽然可能读取到比较老的数据,以及有一些数据不一致。

目前的 CAP 理论

随着技术的不断发展以及理论的不断完善,我们发现,分区并不是会经常出现的情况,大部分情况下,如果我们忽略 P ,其实就是可以实现 CA 共存的情况。如果分区是可以感知的,纳闷我们可以提前制定响应策略,例如进入服务降级限制某些操作,通过恢复补偿逻辑修正数据不一致。

在 CAP 基础上演变的 PACELC 理论,就是针对这种情况的更为实际的指导意见。在出现分区的情况下,取前半部分,其实还是 CAP 理论。如果不出现分区的情况,也就是大部分的情况下,我们考虑 L(Latency,延迟) 与 C(Consistency 一致性)的权衡。

微信搜索“我的编程喵”关注公众号,每日一刷,轻松提升技术,斩获各种offer

2021-2-22:请你说下 CAP 理论并举例的更多相关文章

  1. Linux下分布式系统以及CAP理论分析

    CAP理论被很多人拿来作为分布式系统设计的金律,然而感觉大家对CAP这三个属性的认识却存在不少误区,那么什么是CAP理论呢?CAP原本是一个猜想,2000年PODC大会的时候大牛Brewer提出的,他 ...

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

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

  3. (转)CAP理论十二年回顾:"规则"变了

    编者按:由InfoQ主办的全球架构师峰会将于2012年8月10日-12日在深圳举行,为了更好地诠释架构的意义.方法和实践,InfoQ中文站近期会集中发布一批与架构相关的文章,本篇即为其中之一.Info ...

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

    问题的提出 在计算机科学领域,分布式一致性是一个相当重要且被广泛探索与论证问题,首先来看三种业务场景. 1.火车站售票 假如说我们的终端用户是一位经常坐火车的旅行家,通常他是去车站的售票处购买车票,然 ...

  5. CAP理论

    自打引入CAP理论的十几年里,设计师和研究者已经以它为理论基础探索了各式各样新颖的分布式系统,甚至到了滥用的程度.NoSQL运动也将CAP理论当作对抗传统关系型数据库的依据. CAP理论主张任何基于网 ...

  6. 精彩的解释CAP理论的文章

    强一致性(Consistency):  更新操作成功并返回客户端完成后,分布式的所有节点在同一时间的数据完全一致. 可用性(Availability):读和写操作都能成功. 分区容错性(Partiti ...

  7. 可能是CAP理论的最好解释

    一篇非常精彩的解释CAP理论的文章,翻译水平有限,不准确之处请参考原文,还请见谅. Chapter 1: "Remembrance Inc" Your new venture : ...

  8. ZooKeeper和CAP理论及一致性原则

    一.CAP理论概述CAP理论告诉我们,一个分布式系统不可能同时满足以下三种 一致性(C:Consistency)可用性(A:Available)分区容错性(P:Partition Tolerance) ...

  9. 分布式系统理论--CAP理论、BASE理论

    问题的提出 在计算机科学领域,分布式一致性是一个相当重要且被广泛探索与论证问题,首先来看三种业务场景. 1.火车站售票 假如说我们的终端用户是一位经常坐火车的旅行家,通常他是去车站的售票处购买车票,然 ...

随机推荐

  1. K8s (常用命令)

    查看集群信息: [root@kubernetes-master pods]# kubectl cluster-infoKubernetes master is running at http://lo ...

  2. mysql在8.0版本下修改密码的命令

    ubuntu20.04上边部署了一个新的mysql服务,默认没密码,想要修改密码. 使用如下手段 第一种:ALTER USER 'root'@'localhost' IDENTIFIED BY '密码 ...

  3. 2019牛客暑期多校训练营(第六场)C Palindrome Mouse (回文树+DFS)

    题目传送门 题意 给一个字符串s,然后将s中所有本质不同回文子串放到一个集合S里面,问S中的两个元素\(a,b\)满足\(a\)是\(b\)的子串的个数. 分析 首先要会回文树(回文自动机,一种有限状 ...

  4. 2019牛客暑期多校训练营(第一场)H XOR(线性基)

    题意:给你n个数字,然后让你求所有满足异或和为0的子集的大小之和. 先对n个数求线性基,设线性基大小为r,可以分别计算线性基内数的贡献和线性基外数的贡献 1.线性基外:共n-r个数,枚举每个数x,将线 ...

  5. CodeForces - 721C 拓扑排序+dp

    题意: n个点m条边的图,起点为1,终点为n,每一条单向边输入格式为: a,b,c     //从a点到b点耗时为c 题目问你最多从起点1到终点n能经过多少个不同的点,且总耗时小于等于t 题解: 这道 ...

  6. 无所不能的Embedding6 - 跨入Transformer时代~模型详解&代码实现

    上一章我们聊了聊quick-thought通过干掉decoder加快训练, CNN-LSTM用CNN作为Encoder并行计算来提速等方法,这一章看看抛开CNN和RNN,transformer是如何只 ...

  7. PHP的常用函数 持续更新

    PHP的常用函数 前言: 由于害怕遗忘,故在此记录下常用的php函数,以便复习 1 define函数 作用:定义常量 用法 <?php define('a',100); ?> 2 intv ...

  8. Linunx系统引导过程及MBR/GRUB故障

    Linunx系统引导过程 系统初始化进程 init进程 Systemd Systemd单元类型 允许级别所对应的systemd目标 修复MBR扇区故障 解决思路 操作 修复GRUB引导故障 解决思路 ...

  9. JVM ZeroTLAB 是什么意思呢?

    ZeroTLAB 是 JVM 的一个布尔型 Flag,意思是是否将新创建的 TLAB 内的所有字节归零. 默认:false 举例:-XX:+ZeroTLAB 当分配出来 TLAB 之后,根据 Zero ...

  10. Leetcode(712)-账户合并

    给定一个列表 accounts,每个元素 accounts[i] 是一个字符串列表,其中第一个元素 accounts[i][0] 是 名称 (name),其余元素是 emails 表示该帐户的邮箱地址 ...