拜托!这才是分布式系统CAP的正确打开方式!
Posted Hollis
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了拜托!这才是分布式系统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)
如果有多个事务同时发生,互相之间不能被影响,并且不知道对方的存在。咱们还去买苹果,我挑了苹果去结账,有个大妈也挑了苹果也去结账。这时我们之间是互不影响的,相互独立的。我没带钱买苹果失败也不影响大妈买苹果成功。当然如果结完账大妈看小伙子我长得帅,硬给我塞几个苹果,我也没办法以上是关于拜托!这才是分布式系统CAP的正确打开方式!的主要内容,如果未能解决你的问题,请参考以下文章
Docker基础操作,原来这才是正确打开Docker的新方式!
Docker基础操作,原来这才是正确打开Docker的新方式!