盖理论与MongoDB一致性,可用性的一些思考

大约在五六年前,第一次接触到了当时已经是hot topic的NoSql。不过那个时候学的用的都是mysql,Nosql对于我而言还是新事物,并没有真正使用,只是不明觉厉。但是印象深刻的是这么一张图片(后来google到图片来自这里):

  CAP理论与MongoDB一致性、可用性的一些思考

    这张图片是讲数据库(包括传统的关系型数据库和NOSQL)与CAP理论的关系。由于并NoSql并没有实践经验,也没有去深入了解,对于CAP理论更是一知半解。因此,为什么某一款数据库被划分到哪一个阵营,并不清楚。

    工作之后对MongoDB使用得比较多,有了一定的了解,前段时间又看到了这张图,于是想搞清楚,MongoDB是不是真的属于CP阵营,又是为什么?怀疑这个问题的初衷是因为,MongoDB的经典(官方推荐)部署架构中都会使用replica set,而replica set通过冗余和自动failover提供高可用性(Availability),那么为什么上图中说MongoDB牺牲了Avalability呢?而我在MongoDB的官方文档中搜索“CAP”,并没有搜索到任何内容。于是我想自己搞清楚这个疑问,给自己一个答案。

  本文先阐明什么是CAP理论,以及关于CAP理论的一些文章,然后讨论MongoDB在一致性与可用性之间的折中与权衡。

  本文地址:http://www.cnblogs.com/xybaby/p/6871764.html

 

CAP理论

回到顶部

  对CAP理论我只知道这三个单词的意思,其解释也是来自网上的一些文章,并不一定准确。所以首先得追根溯源,搞清楚这个理论的起源和准确的解释。我觉得最好的开始就是wikipedia,从上面可以看到比较准确的介绍,更为重要的是可以看到很多有用的链接,比如CAP理论的出处,发展演变过程。

 

  CAP理论是说对于分布式数据存储,最多只能同时满足一致性(C,Consistency)、可用性(A, Availability)、分区容错性(P,Partition Tolerance)中的两者。

  一致性,是指对于每一次读操作,要么都能够读到最新写入的数据,要么错误。

  可用性,是指对于每一次请求,都能够得到一个及时的、非错的响应,但是不保证请求的结果是基于最新写入的数据。

  分区容错性,是指由于节点之间的网络问题,即使一些消息对包或者延迟,整个系统能继续提供服务(提供一致性或者可用性)。

 

  一致性、可用性都是使用非常宽泛的术语,在不同的语义环境下具体所指是不一样的,比如在cap-twelve-years-later-how-the-rules-have-changed一文中Brewer就指出“CAP中的一致性与ACID中的一致性并不是同一个问题”,因此后文中除非特别说明,所提到的一致性、可用性都是指在CAP理论中的定义。只有明确了大家都是在同样的上下文环境,讨论才有意义。

    

  对于分布式系统,网络分区(network partition)这种情况是难以避免的,节点间的数据复制一定存在延迟,如果需要保证一致性(对所有读请求都能够读到最新写入的数据),那么势必在一定时间内是不可用的(不能读取),即牺牲了可用性,反之亦然。

  按照维基百科上的描述,CAP之间的相互关系大约起源于1998年,Brewer在2000年的PODC(Symposium alt="CAP理论与MongoDB一致性、可用性的一些思考">

  简而言之:BASE通过最终一致性来尽量保证服务的可用性。注意图中最后一句话“But I think it‘s a spectrum”,就是说ACID BASE只是一个度的问题,并不是对立的两个极端。

  

  2002年,在Brewer's conjecture and the feasibility of consistent, available, partition-tolerant web services中,两位作者通过异步网络模型论证了CAP猜想,从而将Brewer的猜想升级成了理论(theorem)。但实话说,我也没有把文章读得很明白。

  

  2009年的这篇文章brewers-cap-theorem,作者给出了一个比较简单的证明:

  CAP理论与MongoDB一致性、可用性的一些思考

  如上图所示,N1,N2两个节点存储同一份数据V,当前的状态是V0。在节点N1上运行的是安全可靠的写算法A,在节点N2运行的是同样可靠的读算法B,即N1节点负责写操作,N2节点负责读操作。N1节点写入的数据也会自动向N2同步,同步的消息称之为M。如果N1,N2之间出现分区,那么就没法保证消息M在一定的时间内到达N2。

盖理论与MongoDB一致性,可用性的一些思考