CAP理论举例及说明

面试去,一个哥们叫嚣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吧。那么现在的操作应该有四种,

  • h1读记作1r,
  • h1写->1w
  • h2读->2r
  • h2写->2w

一致性要求四个操作随意做,都对其他可见,因此1w之后2r就需要考虑一下怎么实现了。我们有两种实现策略:

同步或者异步。


  •        同步:意味着1w的过程中,需要同时执行2w且成功后,1w才能返回成功(否则1w对2r不可见)
  • 异步:意味着1w结束后,发出2w的命令即返回结果。
先说异步,异步牺牲了一致性,以保证可用性,因为此时等待时间仅剩下单机h1上的操作,不管你是锁着呢,还是出现故障,都可以通过程序进行处理,因此异步数据降低了C,保证了A。

3. 使用同步策略:(也是那个人把我问住的地方)

显然同步策略能够保证强一致性。因为你在所有节点写入书记之后才返回,所以写入操作对所有节点可见。

但要求一致性的时候,为什么一定是要求可用性下降?

        我当时是这么说的,这是两个机器:10000台机器呢?总有一些机器因为故障,锁住,网络等原因响应缓慢,这样你初始的1w操作至少要等一会吧?

我知道,你肯定要说,为什么备份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

你可能感兴趣的:(CAP,理论,分布式)