分布式系统中,必然无法同时满足一致性、可用性和分区容忍性。
分布式系统指一组电脑连成的网络。
一致性(Consistency,简称C)指同一时刻全网数据完全一致,相当于军训队伍整齐划一,越整齐一致性就越高。
可用性(Availability,简称A)一部分节点更新数据后,分布式系统能基于最新数据响应用户读写请求。排头兵挪动后,没跟上的队伍走样越小、排齐耗时越少,可用性就越高。
分区容忍性(Partition Tolerance,简称P)只有两个可选参数:不容忍和容忍。
不容忍分区好比你一个人在word里打字,无需穿行网络,一台电脑全盘搞定;容忍分区就是分布式系统,至少有两台计算机联机组成,比如你保存word文档的瞬间,如果我的电脑没和你交互,就读不到你刚写的文字。
CAP定理意思是:C、A、P三者最多得二。
具体来说:分布式系统必然容忍分区(P),所以一致性(C)与可用性(A)注定互斥。如果你想左拥右抱C和A,那就别指望分布式系统,只能用单机版的中心化方式(不容忍分区,无P)。
但是,分布式系统中C和A的不可兼得,与中文语境下鱼和熊掌的不可兼得不同。CAP定理是说:一条队伍永远存在可能不齐的瞬间。这看着像句废话,但只有理解这点,才能避免对CAP原理最习以为常的误解:现在不齐,所以永远无法整齐。
你不是教官脑中的提线木偶,不会根据教官意念自动排齐。排头兵一个喷嚏把自己打出去半步,二号兵才能开始反应,跟出瞄齐,而他脖子位置的变化向三号兵发出指令:来,跟上。
最后才轮到你,怎么可能快?所有人的反应时间之外,还要加上挪步用时,于是耗时必然大于零。
映射到分布式系统:如果想要严格一致的数据,那分布式系统就没法用了,因为你无法确保使用数据的瞬间,网络中其他节点不会更新数据;如果你想用相对新的数据,那就得候着。
所以,分布式系统天生就慢。
这种慢,更像是迟钝,原因很简单:分布式系统范围一大,节点间的通信耗时就长。
如果你想获得可靠的最新信息,就得等所有节点汇集出最新数据,这样能保住一致性、放弃可用性。可如果你说全网这么多节点,等到什么时候才能一致?CAP原理告诉你:别等了,你就放弃点一致性,先用着吧,否则你啥也用不了。
2000年加州大学伯克利分校计算机教授布鲁尔提出了CAP的三选二猜想,两年后被麻省理工学院的两位教授基尔伯特和林奇证明。
他们的反证法让证明过程出奇地简单:
假设存在一个算法同时满足一致性、可用性和分区容忍性,那么在两个节点的网络中,存储的信息分为不相关的非空集合{G和G'},假设G和G'间没有通信,那么,一个节点读的操作将无法访问另一节点稍早前写的结果。
类比一个你熟悉的场景:
妈妈和儿子一起把两只蛋关进冰箱,妈妈回房看电视,儿子一饿之下把蛋全煮了扒光吃尽,此时爸爸在房里问妈妈:冰箱里还有多少蛋?
妈妈关上房门的刹那,本来共享的鸡蛋余额数据就发生了分区。
如果妈妈追求严格一致性,那她应该跑去冰箱检查余额后再答复爸爸,可妈妈追起剧来特别专注,所以直接回答:还有两个。这个回复没有基于准确的最新余额,但为了可用,放弃了一致。
可这并不影响爸爸第二天就去超市买蛋,因为不管零个蛋还是两个蛋,都不够全家吃。
所以,一致性并非不可放弃,只是需要权衡。放弃追求一致性,就能少打断一次电视剧情,少跑一个来回所增加的便利,如果大于因为蛋数认定不一致带来的不便,那不一致就不一致吧。
这是很简单的取舍,但正如“去中心”常被人们误解为“去掉所有中心”一样,人们也常常误读CAP定理中“三者只能居其二”的含义:
CAP定理的确告诉我们:分布式系统中抓走可用性就意味着放手一致性,但并不说明用户想要的一致性被冲进了马桶,再也捞不回来。真实情况是,我们可以在短时间内追回些一致性,就像经过严格训练的队伍可以比普通队伍用更短的时间排齐一样。
很可惜,即使我们只用一刹那的时间就能追回先前所有的不一致,我们也没有办法追回这一刹那本身所产生的不一致,这是分布式系统命中注定的无奈。
但这只是CAP定理在理论上的陈辞,实际场景中我们需要关注的是如何在C、A之间权衡利弊,最终获得最大的经济收益。在这方面,银行业贡献给我们两个案例:
版权申明:本内容来自于互联网,属第三方汇集推荐平台。本文的版权归原作者所有,文章言论不代表链门户的观点,链门户不承担任何法律责任。如有侵权请联系QQ:3341927519进行反馈。