CAP理论在分布式系统领域非常重要,在我们做分布式系统的架构设计时会通过CAP原理验证方案的合理性。

CAP说的是在分布式系统下,存在三个要素:一致性、可用性、分区容错性。

  • 一致性:在分布式系统中,一份数据一般会存在多个副本,要求多个副本对数据的更新可以体现在所有副本上,也就是”强一致性“,不返回最新数据,就返回错误;

  • 可用性:在分布式系统中,任一时刻,分布式系统都需要保证在限定延时内可以正常响应客户端读写,获取非错误的响应,但不能保证获得的是最新数据;

  • 分区容错性:在分布式系统中,节点之间可能因为网络异常导致网络分区(丢包、延迟、中断等),需要保障在网络分区出现时,分布式系统不受影响;

CAP原理说在分布式系统下,只能满足其中两个特性,不能三者同时满足。

根据Cap定理的CA分布式系统是否存在?

答案:没有

关于分区容忍性。

第一版解释:出现消息丢失或分区错误时,系统能够继续运行;

第二版解释:当出现网络分区后,系统能够继续工作;

两版的区别是对分区的定义,不仅仅限定于消息丢失情况,可能是丢包、中断、拥塞等情况。

那有没有满足CA的系统呢?

有人说CA选型的系统是Oracle和MySQL,他们拥有强一致性和可用性,虽然Oracle RAC看似是分布式,但依然是通过共享存储实现的。MySQL主从则可以理解成多个单点的MySQL,通过Binlog实现数据同步到所有单点上。虽然看似实现了CA,但他们两者归根结底还是单点系统。

如果选择了CA放弃了P,那么当出现网络分区时,为了保障C那么就需要禁止写入,也就不能实现A了。

这里扩展下,我们所了解的一致性算法,包括2PC/3PC、Paxos、M/S,M/M 整个系统总是可以达到一致状态的,具体怎么达成一致,可能受时效性影响,也就是最终一致性还是强一致性。

由于分布式系统下,网络问题是不可避免的现象,不保证P很难叫分布式系统,P必然被实现,所以分布式系统一般都会在CP和AP上权衡。

选择CP的系统是什么逻辑?

CP系统意味着放弃了整体可用性,在分布式系统下,每个数据都是有副本的。

CP系统可以简单理解为副本数为1,客户端可以访问不同的副本进行数据读写,由于只有一个副本,不需要做副本之间数据同步,所以数据是强一致性的,也就满足了CP,一旦发生了网络分区问题,数据就会出现丢失或难以更新,会要求停止写,此时对客户端来说就不满足A了(读不到值、也写不进去了)。

选择AP的系统是什么逻辑?

AP的系统一般要求数据具有多个副本,即使出现网络分区,也不会因为丢失数据或数据不一致导致不可用,但多个副本划分在不同网络分区,会出现副本之间数据不一致情况。

比如D1有三个副本,D1-1、D1-2、D1-3分布在不同节点上,正常情况下客户端写数据可以三个副本都复制成功,客户端读取任一副本可以得到最新更新的值;但当出现网络分区时,副本之间出现数据不可达,导致副本D1-3数据和另外两个副本不一致,这样不同客户端可以读取不同副本数据(或做故障转移),但不可以保障副本的一致性,就出现了一致性问题。

如何以CPA原理实现架构设计呢?

总的来说,在分布式系统下P是基础,需要在CA中找平衡,且这两者也不是百分百的。

比如虽然很多人认为单机系统是满足CA的,但是P不是简单的分布式网络上的节点,也有可能是多个协作的任务,任务之间是异步的,如果要求强一致性,那必然是同步的,但在数据未达成一致性时是不能对外提供服务的,也就不满足A了。

那么有没有100%的A呢?

要求任何情况下不出现问题其实是很难实现的,基本不存在,我们说的可用性是相对于容错性来说,容错率低、故障恢复时间快在某个领域下的一个可承受的阈值。

所以对于CAP理论的使用,不是简单的字面之间的权衡,非此即彼,而是要当做一种分布式系统设计的指导思想,需要更动态的看待自己的系统。

比如一个分布式系统是多服务、多模块的,涉及到计算服务与存储服务,在面对网络分区时,可以通过降级、预案等手段实现细粒度的A、C的取舍,而不是简单、整体的对外反映系统整体的服务、数据维度的响应结果。

以中间件处理脑裂情况为例:

  • T1时刻,一切正常,两个节点都是S状态;

  • T2时刻,出现网络分区,导致两个节点状态出现S1、S2的分歧;

  • T3时刻,网络分区恢复,依据脑裂处理算法,两个节点达成最终状态S`;

正是因为CAP原理不能简单的适用于所有分布式系统场景,所以在分布式系统领域,还有其他一些理论做细化处理。

ACID

  • A:原子性,一个事务要么成功要么失败;

  • C:一致性,在事务开始前和事务结束后,数据满足一致性约束(这里是逻辑上的一致性,不是CAP里面的数据维度的一致性);

  • I:隔离性:如果多个事务同时发生,不应该互相影响;

  • D:持久性:当事务提交之后,对于整个系统来说,这次更新将是持久的;

ACID一般用在关系数据库的事务原则上。

BASE

  • BA:基本可用,分布式系统大部分时间是可用的,而不是百分百可用,允许偶尔的失败,相比于CAP的A来说,BA更符合真实场景;

  • S:软状态,分布式系统中的数据副本之间存在一个中间状态,也就是允许一部分数据副本是新的,一部分是老的,其实大部分中间件的副本都属于这种情况,副本之间存在延迟;

  • E:最终一致性,副本之间存在一致性延迟,但最终会变成数据一致的,这个往往是对外承诺的时间;

BASE和ACID可以认为是对于CAP的细化,让技术选型多了参考:

  • CA的选型一般对应ACID原则,针对于关系型数据库等;

  • AP的选型对应BASE原则,一般适用于存储型中间件,因为多副本是必须的,但副本同步是有延迟的,但最终会是数据一致的的;

  • CP的选型在分布式系统下暂时还没发现,正如上面说的,不会有人在分布式系统下只做一个副本吧,有人说Spanner是CP,可能仅仅是因为他的可用性太高,TiDB貌似也是CP系统,但感觉是一种障眼法,不让你读到错误的数据不就行了;

CAP只能三选二,可以选CA吗?相关推荐

  1. 三十二楼层选几层最好_楼房哪些楼层不能选, 买房楼层选不好开始大忌

    摘要:大家知道选楼层是由讲究的吗?其实当我们去到一些别的城市的时候,电梯有些其实是不是不叫那个名字的,举例:18楼是可以叫做17B楼,那就是寓意不好,现在又是有很多都是高层小区,所以在选楼上如果没有做 ...

  2. 三十二楼层选几层最好_楼层风水几楼最好 1一32高楼层选最佳楼层

    现在的住房多是高层,这意味着人们的选也变多了,但是不同楼层给人的居住体验是不同的,因此人们就想了解高层中,哪些楼层比较好,下面就与小编一起看看楼层风水几楼最好,1一32高楼层选最佳楼层.(推荐阅读:楼 ...

  3. 三十二楼层选几层最好_【高层住宅几层最好】33、32层高层住宅几层最好,26、18高层住宅几层最好-吉屋网知识专区...

    输入您的找房需求,10秒找到理想房源 期望城市: 期望区域: 期望户型: 购房目的:不限 期望预算:不限 手机号码: 立即找房 30层高层住宅几层最好呢? 一.楼房的选择需要结合很多情况,不同的楼 ...

  4. 三十二楼层选几层最好_跟大家探讨一下三十二层的楼房买几层的最好

    展开全部 十二到二十楼之间. 大家都知道32313133353236313431303231363533e58685e5aeb931333365643661买房时,即使是同一栋楼,不同的楼层价钱也是不 ...

  5. 三十二楼层选几层最好_楼层是三十二层,如果要买,几层好?买房子要卡率哪些方面的细节?...

    你好!买房看风水,选房要看楼层风水.在选房时如何挑选楼层风水一座大厦的外在风不环境.山形道路对住宅风水会有影响.在同一栋楼里面,由于存在着命相与层数之五行的相生相克关系,因此,不同的楼层,也会对居住者 ...

  6. 三十二楼层选几层最好_1一32高楼层选最佳楼层在几楼

    1一32高楼层选最佳楼层在几楼 来源:网络 日期:2019/3/14 11:28:59 累计阅读:7065次 选择一个风水好的楼层是一件很重要的事情,毕竟一个楼层的风水好坏,与一个房子的风水好坏是相关 ...

  7. 三十二楼层选几层最好_32层的房子买几楼好

    展开全部 对于很多人来说,新房就住户安定在一个城市的家,但是城市中的新房并非像家中自己e69da5e6ba90323131333532363134313032313635333133343364376 ...

  8. 三十二楼层选几层最好_买房子选几层最好?网友:我是按这个公式来计算黄金楼层,你咋看?...

    温馨提示:内容如有侵权请您告知我们会在第一时间处理或撤销:互联网是一个资源共享的生态圈,我们崇尚分享 中国人讲成家立业,似乎都跟房子有关.买房可以算是人生中很重要的一件大事,因为很多人不辞辛劳.每天忙 ...

  9. 三十二楼层选几层最好_一般买房买几楼比较好 1一32高楼层选最佳楼层

    在购房时,很多业主都非常纠结买房买几楼比较好.都是说楼层越高越好,售楼处也是楼层越高越贵,确实高楼层空气好,噪音小,蚊虫也要少几只,为了一辈子的窝,不少的购房者都愿意多花钱,买高楼层的房子,可是并不是 ...

最新文章

  1. “半真半假”DeepFake换脸也能精准识别?阿里安全提出全新检测方法
  2. where引导的定语从句与状语从句区别
  3. RHCE课程-RH253Linux服务器架设笔记五-DNS服务器配置(2)
  4. ansible(1)——安装
  5. 1.5编程基础之循环控制 37 雇佣兵
  6. MySQL工作笔记-使用JPA映射mysql数据库要注意的地方
  7. php const用法详解
  8. nod32 linux升级方法,打造全自动的NOD32升级服务器
  9. python 的csr_python - 以便携式数据形式保存/加载scipy稀疏csr_matrix
  10. Embedded ProC(嵌入式ProC)与Tuxedo中间件
  11. OTSU算法/大津法/最大类间方差法 python实现
  12. php开发 公众号自动回复,微信公众号开发之文本消息自动回复php代码_php实例 - sha1...
  13. Halcon图像分割-多个threshold阈值处理算子讲解
  14. 软件一般是用什么语言开发的
  15. 在线编辑excel文件实现服务器后台存储,及页面还原
  16. [渝粤教育] 西南科技大学 工程经济学 在线考试复习资料
  17. 【Rust日报】2021-09-05 perseus:完全支持 SSR 和 SSG 的 Rust 高端前端开发框架
  18. sa387gr11cl2相当于什么材料,sa387gr11cl2对应国内材质
  19. 颈椎牵引器的介绍-颈托护颈
  20. Mysql快速入门 在python、java使用

热门文章

  1. Latex所有常用数学符号吐血整理!(包含大括号、等式对齐、矩阵)
  2. java集成钉钉sdk_JAVA maven项目使用钉钉SDK获取token、用户
  3. 496.下一个更大元素I
  4. 数据库基础笔记(MySQL)3 —— 基础操作
  5. poj3680(最小费用流 + 拆点)
  6. python 重载_python模块重载的五种方法
  7. JAVA 多用户商城系统b2b2c-kafka处理超大消息
  8. UICollectionView的headerView、footerView使用以及与UITableView加载headerView、footerView的区别...
  9. C语言----项目构建Make,Automake,CMake
  10. 《中国人工智能学会通讯》——5.15 案例速览