hadoop学习笔记之二:分布式系统中的CAP理论


from:http://divinedm.iteye.com/blog/2252845

首先,CAP理论描述的对象是一个分布式系统,其中 
C:从客户端来的读请求访问任何一个分布式系统节点,必定能读到最近的一次写请求的结果 
A:访问任何一个还存活的分布式系统节点,必定可以在一个时间范围内返回一个确定的结果(成功或者失败,不能是超时或者错误) 
P:分布式系统允不容许不一样节点间的网络消息丢失。网络


关于P特性,他的概念不像A和C那样直观,网上书上有不少错误的理解。想弄明白请读下面这段话。 

关于P特性我有话要说,一个常见的定义,你确定很是熟悉:“若是网络异常将一个分布式系统分红了不能通讯的两个子组,那么P特性就是要求分布式应用在每个子组内都能正常处理请求”,这个定义并非特别的准确,我稍后解释。网络上还有不少中文文章都是抄来抄去再加上抄的人本身的错误理解的例子就太多了,不胜枚举,甚至还有更夸张明显是错误的版本,好比<从paxos到zookeeper>中分区容错的错误定义Page11,该书将P特性定义成“分布式系统在遇到任何网络分区故障的时候,仍然须要可以保证对外提供知足一致性和可用性的服务”,简直就是胡说八道。想弄明白P特性,仍是要看英文文档。这里推荐一个连接http://blog.cloudera.com/blog/2010/04/cap-confusion-problems-with-partition-tolerance/,这篇文章援引了2002 SIGACT paper中对p的准肯定义。即P特性本质上描述的是对网络的一个限制要求--网络中允不容许节点间消息传递丢失。若是你的分布式系统容许网络的P特性,那么你必然不能同时知足一致性和可用性(试想,网络出现问题,若是还想保证不一样group的数据一致,势必服务须要报错,从而不知足可用性。若是追求可用,在给定时间内有成功响应,那么也就失去了一致性),若是不容许,那么是能作到一致性和可用性的。知足P特性就是要求你在C和A中必须作出取舍,换一个等式也许更容易理解 
Possibility of Network Partitions => not(availability and consistency) 
这样的等式没有CAP如今的3选2这么简洁,但这也是不少人都错误理解CAP的缘由所在。回过头来再看我提到的那个很是熟悉的定义,它看上去更像是在描述A特性(若是一个写请求到了某一个group,它会如何响应?) 

上面这三点对CAP分别得定义是正确理解cap theory的精髓所在!!!!! 

再回到流传最多的白话版本,Brewer的CAP理论证实了:对于任何一个分布式系统,最多只能知足cap三点中的两点,不可能同时知足所有。 

这是由于,从实践的角度来看,网络是一个不稳定的存在,对于一个分布式系统而言,若是网络出现问题,系统就不能服务,这显然是不能接受的,所以,P特性每每是分布式系统首先须要知足的条件。 

以此为基础,咱们接下来看一下下面两种组合 

1 CP 分布式

系统追求了C特性和P特性,也就是容忍了A的不足。也就是说,若是节点间网络出现问题,为了追求数据的一致性,容许读请求超时或者返回错误。 
来个例子加深理解,考虑一个分布式系统由n一、n2两个节点构成,若是n一、n2之间的网络出现了问题,致使n一、n2数据同步中止,此时一个readrequest过来访问到n2节点,n2须要和n1协商谁的数据是最新的,可是因为网络中断,一直不能得出协商的结论,最后以超时或者错误返回给客户端(具体是超时仍是错误由应用方而定,并无要求) 

2 AP 

系统追求了A特性和P特性,也就是容许C的不足。也就是说,若是节点间网络出现问题,为了每一个节点均可以及时响应不报错,那么就容许了读请求拿得不是最新更新后的数据。 
来个例子加深理解,和上面同样的分布式系统,若是n一、n2之间的网络出现了问题,致使数据同步中止。这时候一个readrequest过来访问n2节点,因为不须要和n1协商谁的数据最新,所以n2能够直接响应返回,不会超时或者报错,可是返回的数据就可能不会是最新的了,也就失去了c特性
spa