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. Spring框架——事务管理方式搭建一个小的项目

    学习Spring框架,通过事务管理的方式搭建一个小的项目,该项目可以查询对数据库中的图书库存数量进行修改. 首先,使用MVC分层的设计模式思想搭建项目目录结构. 此部分代码源码之中都有相关注释,所以尽 ...

  2. sql画图

    ---------------------------------------------------------------------------------------------------- ...

  3. python中numpy库的一些使用

    想不用第三方库实现点深度学习的基础部分,发现numpy真的好难(笑),在此做点遇到的函数的笔记 惯例官方文档:https://docs.scipy.org/doc/numpy-1.16.1/refer ...

  4. docker(4)解决pull镜像速度缓慢

    前言 上一篇讲到pull 镜像,但是pull镜像的时候下拉的速度实在感人,有什么解决办法吗?我们只需将docker镜像源修改为国内的 将docker镜像源修改为国内的: 在 /etc/docker/d ...

  5. 嵌入式的我们为什么要学ROS

  6. HDOJ 1078

    标准的DAG上的DP,其实之前一直不大想得明白为什么dp[i][j]为什么一定是在(i,j)状态上的局部最优解了呢? 其实仔细想想和我一般所做的DP是一个道理,因为运用dfs的方法,因此可以确定的是, ...

  7. AtCoder Beginner Contest 171

    比赛链接:https://atcoder.jp/contests/abc171/tasks A - αlphabet 题意 给出一个字母,如果为大写输出 'A',如果为小写输出 'a' . 代码 #i ...

  8. HDU4358 Boring counting【dsu on tree】

    Boring counting Problem Description In this problem we consider a rooted tree with N vertices. The v ...

  9. codeforces626E.Simple Skewness(三分)

    Define the simple skewness of a collection of numbers to be the collection's mean minus its median. ...

  10. windows常用快捷键和dos命令

    windows常用快捷键 Ctrl+C (复制) Ctrl+V (粘贴) Ctrl+S (保存) Ctrl+A (全选) Ctrl+Z (撤销) Alt+F4 (关闭当前窗口) shift+Delet ...