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. Prometheus+Grafana+kafka_exporter监控kafka

    Prometheus+Grafana+kafka_exporter搭建监控系统监控kafka 一.Prometheus+Grafana+kafka_exporter搭建监控系统监控kafka 1.1K ...

  2. Spark 将DataFrame所有的列类型改为double

    Spark 将DataFrame所有的列类型改为double 1.单列转化方法 2.循环转变 3.通过:_* 1.单列转化方法 import org.apache.spark.sql.types._ ...

  3. 一统江湖的大前端(10)——inversify.js控制反转

    <大史住在大前端>前端技术博文集可在下列地址访问: [github总基地][博客园][华为云社区][掘金] 字节跳动幸福里大前端团队邀请各路高手前来玩耍,团队和谐有爱,技术硬核,字节范儿正 ...

  4. getline()的使用注意

    在使用getline读入一整行时,若是前面是使用getchar().cin这类读入了一个字母,但是不会读入后续换行\n符号或者空格的输入时,再接getline()就容易出现问题. 这是因为输入数字之后 ...

  5. 博弈论入门——Nim游戏引入

    说实话,我真的对这个游戏看得是一脸懵逼,因为(我太弱了)我没有明白一些变量的意思,所以一直很懵,现在才明白,这让我明白博弈论(还可以骗钱)博大精深; 以下是我自己思考的过程,也许不严谨,但是最终明白了 ...

  6. ZeptoLab Code Rush 2015 B. Om Nom and Dark Park

    Om Nom is the main character of a game "Cut the Rope". He is a bright little monster who l ...

  7. css整理之-----------选择器

    背景 在20年初时总感觉自己的css 不够用,想把css 相关的东西整理下,去年一整年都比较忙,忙着就到2021了,今天趁着有点时间,先从选择器开始吧. 听说图片可以提升颜值.... 选择器 CSS选 ...

  8. k8s-0-集群

    Docker回顾 docker容器封装应用程序好处 内核在3.8以上,才能完整使用docker隔离功能(所有centos6不推荐用) Docker容器化封装应用程序缺点 容器编排工具有哪些 一: K8 ...

  9. JPG学习笔记1(附完整代码)

    #topics h2 { background: rgba(43, 102, 149, 1); border-radius: 6px; box-shadow: 0 0 1px rgba(95, 90, ...

  10. Sublime text 3 中 Package Control安装

    安装前 ctrl+shift+p  在命令板中输入PC,如下图表示没安装: 使用ctrl+~调出sublime软件的控制台命令窗口:粘贴运行 import urllib.request,os,hash ...