从去年开始接触NoSQL的知识,CAP理论可以说是整个NoSQL运动者的理论指导。
CAP理论由UC Berkeley的Eric Brewer教授在2000年提出,并于2002年由MIT的Seth Gilbert & Nancy Lynch给出了严谨的证明。
CAP理论认为以下三者不能同时满足:
- 一致性(Consistency): 所有的节点在同一时刻看到同样的数据。
- 可用性(Availability): 节点失效不会影响系统的读写。
- 分区容忍性(Partition Tolerance): 系统能支持网络分区,即使分区之间的消息丢失系统也正常工作。
对C、A、P三者的解读很有很多种,具体可以看后面的参考。
通过上图我们可以看出,根据业务的不同,不同的存储系统会根据自身业务的需求在CAP三者中进行权衡,因此CAP理论的意义应该是一种在分布式数据存储系统设计时tradeoff,而非绝对的认为三者必须舍弃一者,特别是在CAP理论中没有提到系统的响应时间因素,而数据的访问时延是很重要的可用性因素。
Yale的Daniel Abadi认为CAP理论简单的描述有可能造成错误的解读,重新定义了一个模型PACELC,添加了系统中的Latency描述。
上图的意思是,如果一个系统需要进行分区,那就必须在可用性(A)或者一致性(C)之间做出一种tradeoff,否则就需要在系统的延迟(L)和一致性(C)之间做出tradeoff,此模型描述了大多数NoSQL数据库中实现CAP理论的方式,也更具备工程中的意义。
参考:
Julian Browne, Brewer’s CAP Theory 懒得看英文的可以看译文
D. Abdi, Problems with CAP, andYahoo’s little known NoSQL system