面试去,一个哥们叫嚣CAP理论有问题,让我给他证明,很丢人,我真的没证明出来,甚至连清楚的说明都不算。原来看的真的太皮毛了。
zhibing问你有啥技术博客么,我尴尬的摇摇头,所以啊,还是多记录点东西,自己搞明白,讲清楚,才能真的搞明白。
CAP理论也称在Brewer定理,在2000年由Eric Brewer在ACM研讨会上提出,其认为当应用系统变得越来越web化,应当放弃对数据一致性(data consistency)的担忧,因为要想获得这种新的分布式系统的高可用性(high availability),确保数据一致性是我们无法做到的,这样给予任何人3台服务器和一双关注客户体验的眼睛就可以建立一家互联网公司。Brewer的信徒(当天就有的和后来皈依的)包括像Amazon,EBay和Twitter这类公司。
Brewer认为在分布式的环境下设计和部署系统时,有3个核心的系统需求(systemic requirements),以一种特殊的关系存在。(他主要是谈论Web类的应用,但如今非常多的公司业务是多站点/多国家的,因此该理论同样适用于你的数据中心/LAN/WAN的设计)这3个核心的需求是:Consistency,Availability和Partition Tolerance,赋予了该理论另外一个名字 - CAP。
2年后,2002年,麻省理工(MIT)的Seth Gilbert和Nancy Lynch,理论上证明了Brewer猜想是正确的,就此Brewer定理(Theorem)诞生了。
CAP:理论定义:在系统设计当中,针对一个数据的Consistent,Availability以及Partition-Consistency,是不可能同时兼顾的。即,不可能三项均达到最佳程度。
首先需要明确定义一下这三个性能:
Consistent:一致性,一致性类型分很多,这个可以单开一章讲了。在这里只讨论强一致性和最终一致性即可。一致性是针对分布式系统读写操作获得结果的一种描述。
Availability:可用性。指一个请求是否在有限的时间内应答。具体来说,在分布式系统中进行一项操作之后需要一个结果等待时间,根据我的理解,Availability与该响应时间成反比。即:相应延时越低,Availability越高。
Partition-Consistency:分区容忍性。这个众说纷纭,我觉得最合理的解释是:能否避免单点故障导致数据丢失。
Gilbert 和Lynch是这样定义partition tolerance的,除了整个网络的故障外,其他的故障(集)都不能导致整个系统无法正确响应。(No set of failures less than total network failure is allowed to cause the system to respond incorrectly),请注意Brewer的注释,单节点partition就等同于服务器crash,因为如果无法连接它,那它就和不存在一样.
人家理论说CAP不能同时满足,你得说明为什么啊。下面我们针对一组数据举一个例子。
需求:你需要存出一个INT变量,保证任意时间可读可写。
分析:
1. 首先你不能只把这个变量存在一个机器上,因为这个机器挂了,你的数据就丢了。这就是P特性,你如果不要P特性了,也就是不管单点故障了。就存一个机器上,用个数据库,A和C妥妥的。所以,不要P,AC是可以保证的。
2,既然存在多个机器上,假设2个机器h1和h2吧。那么现在的操作应该有四种,
一致性要求四个操作随意做,都对其他可见,因此1w之后2r就需要考虑一下怎么实现了。我们有两种实现策略:
同步或者异步。
我知道,你肯定要说,为什么备份10000份,我就用3倍副本你怎么着?为什么还要牺牲可用性。
其实我和他都陷入了误区,你三倍副本又如何就这例子中2倍副本也是同样降低了可用性的。为什么?
我们看一下同步策略过程中都发生了什么,1w开始,1w本地完成,1w发送消息给h2,2w完成,发送消息给h1,h1确认1w,2w都完成,则返回1w结束。
对比异步策略:1w开始,1w完成,发送消息给h2,1w结束。
这就是可用性降低了,为什么?你还需要额外等待h2的操作啊,当然,大部分时间下h2都可以正常完成,但总之你依赖了更多的网络,依赖更多的其他机器,那么你的可用性就必然下降。
所以,结论是,不要P,可以有AC并存,一旦要了P,AC无法并存。
至于说其他几种,用的很少,就不证明了。
http://www.infoq.com/cn/articles/cap-twelve-years-later-how-the-rules-have-changed/
参考文献:
http://blog.sina.com.cn/s/blog_493a8455010161hi.html