拜托!这才是分布式系统CAP的正确打开方式!
“纸面”上的CAP
相信很多同学都听过CAP这个理论,为了避免我们认知不同,我们先来统一下知识起点。
CAP理论在1999年一经提出就成为了分布式系统领域的顶级教义。并表明分布式服务中,存在三要素:一致性、可用性、分区容错性。而“CAP”就是Consistency/Availability/Partition Tolerance三个单词缩写。
一致性
:分布式系统中,一份数据一般会存在多个副本,要求多副本数据对于数据的更新与单份数据相同,即强一致性
。可用性
:在任意的时刻,对分布式系统来说要保证在限定延时内正常响应客户端的读写请求,并且不会报错
。(提前纠正一个误区,这里的可用性并不是咱们通常理解的服务的SLA可用性,即3个9、4个9之类的定义。实际上指的是是数据访问的可达性。)分区容错性
:在分布式服务中,节点之间网络通信异常导致(丢包、延迟、中断等)的网络分区现象是必然存在的,要保证出现网络分区现象时,分布式系统不受影响
。原论述表明CAP是不可以兼得的,一个系统需要放宽一点才能满足其他两点,因此此时对于分布式系统来说其实就三个选项CP、AP、CA三种,但是不能同时满足CAP。但是由于网络问题是不可避免的现象,所以预想的分布式系统都会往AP和CP上去权衡靠拢。如下所示:
-
尝试沙盘推演分布式系统的CA、AP、CP选型
-
先说说CA选型
在CAP中“迷失”
-
误区一 "三选二"的先入为主
-
误区二 CAP的定义极端
-
设计具体分布式服务时,实际上需要区分多个子模块,如计算模块/调度模块/存储模块等,在遭遇网络分区时,会实行将部分子模块降级等策略,从而细粒度取舍A和C,而不是直接影响整个服务、所有数据。
-
误区三 CAP的标准模糊
-
针对网络分区可以按照一定通信周期,分敛成单机网络分区、机器组网络分区(比如HDFS的机架感知实际上就是针对的就是后者); -
针对一致性可以分成若干种一致性程度(后面的文章会讲到); -
针对数据访问效率来说,按照P95/P99读写进行数据访问性能的进行区分也不失为一种手段。
-
误区四 CAP理论是否要带Client玩?
-
假设网络分区发生在Cient和分布式服务中间,那么A肯定就无法达到了。 -
分布式服务一致性的效果就不是这么明显了,因为读请求都到不了分布式系统。 -
如果Client和分布式服务中间发生网络分区,此时分布式服务无论再怎么努力其实都是无用的。
CAP的正确打开方式
-
CAP的目标状态
-
精细化CAP理论
-
ACID原则
-
原子性(Atomicity)
在事务中一个事务要么成功,要么失败。不允许一个事务成功一半失败一半。原子性就像我中午午休经常会去超市买水果,要么就买选苹果+结完账才算购买成功;苹果没选好或者选好了没结账 都不算购买成功。 -
一致性(Consistency)
在事务的开始和结束时,需要满足一致性约束条件。什么是一致性约束,咱们依旧拿去超市买苹果举例,超市只剩下20个苹果了,我买了一个,对应的超市就应该减去一个苹果。另外注意ACID中的一致性,是逻辑的一致性,而不是CAP中数据的一致性。 -
独立性(Isolation)
如果有多个事务同时发生,互相之间不能被影响,并且不知道对方的存在。咱们还去买苹果,我挑了苹果去结账,有个大妈也挑了苹果也去结账。这时我们之间是互不影响的,相互独立的。我没带钱买苹果失败也不影响大妈买苹果成功。当然如果结完账大妈看小伙子我长得帅,硬给我塞几个苹果,我也没办法😄 -
持久性(Durability)
当事务运行成功的时候,对整个系统来说,这个更新就是永久的。我们依旧去去买苹果,买完苹果结账之后,如果苹果是好的,我想退款,超市是不会给我退的,对于超市来说这个账单永久的,除非我买到了坏苹果并且退款成功。
-
BASE原则
(这里就不用买苹果举例了,因为找不到同一个苹果的多个副本。😄 ) -
基本可用(Basically Available)
系统大多数时间是可用的,允许偶尔的失败。相比CAP的可用性来说,BASE中的基本可用,是允许分布式服务在请求响应时间上有损失的,原来10ms返回,现在100ms也不算做异常。 -
软状态(Soft State)
允许分布式系统中的数据存在一个中间状态,这就意味允许系统在多个不同节点的数据副本存在数据延时。比如Kafka 的partition多个replica之间并不是一直同步的。相比CAP强一致性这种硬状态来说,BASE中的S是允许同一数据的多副本之间存在延时的软状态。 -
最终一致性(Eventual Consistency)
上面说到允许分布式系统存在中间的软状态,但是总得有个时间期限。否则就没法玩儿了。在这个时间周期过后,必须保证所有副本保持数据一致性。从而达到数据的最终一致性。 -
CAP和BASE、ACID的关系
有道无术,术可成;有术无道,止于术
好文章,我在看❤️