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 MVC参数处理

    使用Servlet API作为参数 HttpServletRequest HttpServletResponse HttpSession 使用流作为参数 总结 Spring MVC通过分析处理处理方法 ...

  2. 封装各种生成唯一性ID算法的工具类

    /** * Copyright (c) 2005-2012 springside.org.cn * * Licensed under the Apache License, Version 2.0 ( ...

  3. GLIBC升级

    GLIBC升级 1.安装 1.1 说明 目前大部分架构都已经是GLIBC2.14了,难免会有一些老的机器会是GLIBC2.12,所以下面是我升级GLIBC的过程及步骤. GLIBC是系统核心服务,升级 ...

  4. DEDECMS的20位MD5加密密文解密

    解密20位md5,20位md5加密算法.   dedecms的20位md5加密算噶是从32位md5中截取的20位,所以去掉前3位喝最后1位,即可获得16位md5值,即可破解15位md5.   例如:  ...

  5. docker 搭建 nginx负载均衡

    本文描述如何在一台机器上搭建nginx负载均衡,我将会启动3个nginx的docker,分别是1台前置nginx负责分发,后面2台负责处理请求. 首先我切换到/usr/local/docker/文件夹 ...

  6. Pytest(5)美化插件进度条pytest-sugar

    前言 在我们进行自动化测试的时候,用例往往是成百上千,执行的时间是几十分钟或者是小时级别.有时,我们在调试那么多用例的时候,不知道执行到什么程度了,而pytest-sugar插件能很好解决我们的痛点. ...

  7. PAT(乙级)2020年秋季考试

    比赛链接:https://pintia.cn/market/item/1302816969611366400 7-1 多二了一点 (15分) 题解 模拟. 代码 #include <bits/s ...

  8. Ancient Printer HDU - 3460 贪心+字典树

    The contest is beginning! While preparing the contest, iSea wanted to print the teams' names separat ...

  9. 记一次基于springboot+aop实现日志记录实战

    1. 为什么要记录日志 好处: a. 可以对一些重要功能进行记录,方便以后跟踪是谁操作此功能的. b. 在操作某些功能时可能会发生异常,但每次出现异常我们想定位日志都要去服务器查看我们的日志.有了日志 ...

  10. LVS-DR 模式

    SNAT(Source Network Address Translation)源地址转换,类似家里路由器设置,内网地址向外访问时,发起访问的内网ip地址转换为指定的 IP 地址 DNAT(Desti ...