概述 CAP 和 BASE 理论
基本上接触过分布式系统的朋友都知道 CAP 和 BASE 理论,这两个理论对工程实践中的分布式架构设计具有重要的影响。CAP 理论是加州大学伯克利分校的 Eric Brewer 教授提出的,并被 MIT 的 Seth Gilbert 和 Nancy Lynch 使用学术理论进行了严格的证明。
CAP 和 BASE 理论都有数学证明,但今天打算以一种轻松些的方式来最两个理论做个浅显的解释。
最近偶尔刷一集《大明王朝1566》,这部剧之前看过开头几集,后来因为画质差没资源没有继续看,最近优酷貌似重制了,清晰度好了一些,就偶尔有时间刷一集,这真是一部好剧啊。今天就拿大明王朝的故事背景来对 CAP 和 BASE 理论做个介绍吧,希望不会写的太烂。
大明王朝故事背景
历史上学过明朝设有内阁和司礼监,皇帝通过管理内阁和司礼监来管理天下,这种机制其实应该是很先进的皇权机制了。不过,明嘉靖帝,沉迷修道升仙,执政期间严嵩父子把持朝政、一手遮天、贪墨不计其数。虽说内阁和司礼监腐败严重,但剧里内阁的严嵩和司礼监的吕公公在决策上还是会听皇帝的。这就不讲了,现在回归主题吧,现在主要引入剧中的如下几个人:
- 嘉靖:明朝皇帝,对于重要决策,一般会联合内阁和司礼监进行商讨,最终各方达成一致;
- 严嵩:内阁首辅,主要管理两京一十三省的各地官员;
- 吕芳:司礼监总管,主要管理宫廷有关的事宜;
- 杨金水:吕芳干儿子,任浙江任织造局总管,主要负责江浙织造丝绸管理,卖丝绸,其实就是替皇帝做生意的;
- 郑泌昌、何茂才:严嵩手下,一个任浙江巡抚,一个是按察使,属封疆大吏;
- 海瑞:时任杭州淳安县知县,由裕王举荐而来,奉命处理堤坝决堤后的赈灾事情;
为什么 CAP 无法同时被满足?
故事发生时,南有戚继光抗倭激战,北有鞑靼入侵,急需大量军需,然经过长达二十多年的朝政腐败,国库空虚,皇帝经过与内阁和司礼监商量后,决定在浙江推行改稻为桑的国策,就是把稻田改为桑田养蚕生丝,进而多织丝绸出口赚钱,然而遭到农民反对,郑必昌何茂才在收到严嵩儿子密令后,决定决堤淹城,以达到改稻为桑的目的,事发后,淳安全部被淹、建德半数被淹,灾民无数。这时,海瑞出场了,其到达淳安后,发现贪腐严重,堤坝被毁另有隐情,阻止改稻为桑,决定一查到底。
海瑞毕竟是皇帝儿子举荐的官儿,郑何和杨金水等人不敢任意干掉海瑞,只能上书上司,杨金水就写信给吕芳,郑何二人就写信给严嵩儿子。因为改稻为桑推行不下去是大事啊,所以严嵩和吕芳都非常重视,收到来信后立即想了对策,然而两人想的对策不一样,等皇上来决定吧,决定完了下发到浙江官员。正巧这个时候嘉靖在修道升仙,闭关不问世事。这样,两个人的意见不一致,并且无法达到统一,底下人都在等着回信,如果十天收不到回信下面可能就乱了,但是皇帝要闭关一个月。
上面这段陈述中:
-
皇帝闭关就相当于严嵩和吕芳达成一致的通道断了,在分布式中就是两个节点发生了网络分区;
-
底下人等着回信,十天没收到回信就乱了,如果十天内收到了上面的回信,对应到分布式中就是保证了可用性;
-
严嵩和吕芳就意见无法达成一致,那么对应到分布式中就是没有保证一致性
再简述一下分布式系统中 CAP 的意义:
-
P 代表着分区容忍性,要满足 P 就表示允许网络分区的发生(允许嘉靖帝闭关);
-
C 表示一致性,满足 C 就要求所有节点数据需要一致(严嵩和吕芳意见应该达成一致);
-
A 表示可用性,就是说对于他人的请求,节点需要提供服务响应的返回(严嵩和吕芳不让下面的人等过久)
那为什么 CAP 无法同时满足呢?
-
如果满足 CP,那么由于嘉靖帝闭关的一个月期间(P),严嵩和吕芳无法通过嘉靖帝达成一致,如果要保证一致(C),那就只能等嘉靖帝出关,然而这需要一个月的时间,下面的人早就等疯了,这就相当于服务不可用了,所以无法满足 A;
-
如果满足 AP,那么严嵩和吕芳必须在10天内回复(A),然而皇帝闭关一个月(P),那么两人在十天内是无法达成一致的,也就是无法满足 C;
-
如果满足 CA,要在10天内回复下层官员,另外严嵩和吕芳两人也要意见一致,那只能在10天内请皇帝出关了,那就无法满足 P;
不知道这么讲是否够明白,CAP三个要求是无法同时满足的,那 BASE 理论在 CAP 的基础上做了什么让步和平衡?下面一起来看看。
BASE 基于 CAP 做了什么样的权衡?
BASE 包含三个方面:Basically Available(基本可用)、Soft state(弱状态)和 Eventually consistent(最终一致性)。我们从上面的故事来说一下这几个概念。
对于分布式系统来说,必须要满足分区容错性,否则各个节点就相当于一个节点了,分布式就没有任何意义了。在满足分区容错性的条件下:
- Basically Available
就是说节点在出现问题时,不是完全不可用,而是允许损失部分可用性。例如,严嵩和吕芳无法达成一致,这时不能让下面等待一个月没有回信,这时发送一个降级的决策(例如让下面官员先跟海瑞等进行斡旋,不让其查到要命的证据),或者下面官员自己先搞一些应对措施,然后加长等待时间(可以等待一个月),这样,整个系统不至于完全乱掉,而是先有一些应对措施。这就是基本可用。
- Soft state
严嵩和吕芳先将自己的第一个建议性的决策下发,等待皇帝出关后再进行一致性决策。在第一个建议性的决策到最终一致性决策期间,其实两方的意见并不一致,BASE理论允许在一定时间内存在这种状态。这就是软状态。
- Eventually consistent
在皇帝出关后,吕芳严嵩立即与皇帝协商,然后得到一致的决策。这个时候,如果下面应付不了,那么会再次上书,这时,严嵩吕芳已经有了一致的结论,那么再次下发给下层官员时,就是一致的决策了,这样郑必昌、何茂才、杨金水就可以已一致性的态度对待海瑞了。这就是最终一致性。