Brewer’s CAP Theorem(1)

最近一直在学习ACID,CAP,BAse等NoSQL思想。下面这批CAP理论文章很不错,分享给大家。原文:http://pt.alibaba-inc.com/wp/dev_related_728/brewers-cap-theorem.html

Amazon和EBay一直在喝的酷爱(kool aid)饮料。

by Julian Browne on 2009.1.11 (经Julian授权翻译此文,原文参见

1976年6月4号,周5,在远离音乐会大厅的一个楼上的房间内,在位于Manchester的Lesser Free Trade HallSex Pistols乐队(注:Sex Pistols的经理人Malcolm McLaren 2010.4.8去世)开始了他们的第一次演出(gig,注:规模太小称不上演唱会)。关于当晚谁出席了那场演出有些混乱,部分是因为6周后的另一场音乐会,但最主要的还是因为,这场演出被认为是永久改变西方音乐文化的一场演出。这场演出是如此的重要且富有象征意义,以至于David Nolan写了一本书:《我发誓我在那里:那场改变了世界的演出》,对那些声称自己看过那场演出的人做出判断。因为6月4号被认为是punk摇滚的开始。

在这之前(大约是在1971年左右)曾有一些protopunk乐队,例如New York DollsVelet Underground,但从音乐民俗学来说,是Sex Pistols开启了这场革命,在这场运动中驱动了Buzzcocks乐队的吉他,The Smiths乐队哀怨的哭诉,The Fall乐队的电子切音,Joy DivisionSimply Red乐队华丽的升调(我猜你不了解所有的含义)(注:我缺乏摇滚方面的知识,这部分翻的不是很满意,好在不影响大局,有punk摇滚知识的同学可以提供帮助

2000年7月19号,周三,对主流文化来说并不(象前者一样)具有同样的重要性,但这个日子对互联网公司来说,和25年Sex Pistols对音乐所做的一样,具有同样的影响。这就是Eric Brewer在ACM研讨会上关于分布式计算的原则(Principles of Distributed Computing)所做的开题演讲 (keynote speech)。

Sex Pistols向同时代的人展示了几乎无限制的狂躁远比学院派的结构主义重要的多,给任何人3根弦以及一些许可就可以组建一支乐队。Eric Brewer,在那时被称为Brewer猜想,认为当应用系统变得越来越web化,应当放弃对数据一致性(data consistency)的担忧,因为要想获得这种新的分布式系统的高可用性(high availability),确保数据一致性是我们无法做到的,这样给予任何人3台服务器和一双关注客户体验的眼睛就可以建立一家互联网公司。Brewer的信徒(当天就有的和后来皈依的)包括像Amazon,EBayTwitter这类公司

2年后,2002年,麻省理工(MIT)的Seth GilbertNancy Lynch理论上证明了Brewer猜想是正确的,就此Brewer定理(Theorem)诞生了。

Brewer(CAP)定理

那么到底Brewer的定理是什么,为何它足以和1976年Manchester的punk演出媲美?

Brewer 在2000年的演讲是基于他在UC Berkley的理论工作以及主持Inktomi(期间)的观察,是通过数年前Brewer和其他人,在如何构建高伸缩性系统(highly scalable system)时所做出的各种折衷方案的讨论(例如:SOSP(Symposium on Operating System Principles)的1997年的Cluster-Based Scalable Network Service和1999年的Harvest, yield, and scalable tolerant system)就像其他的许多思想,因此这个演讲的内容并不是全新的,它是许多聪明人的共同成果(我确信Brewer会很快说明这一点)。

Brewer认为在分布式的环境下设计和部署系统时,有3个核心的系统需求(systemic requirements),以一种特殊的关系存在。(他主要是谈论Web类的应用,但如今非常多的公司业务是多站点/多国家的,因此该理论同样适用于你的数据中心/LAN/WAN的设计)

这3个核心的需求是:ConsistencyAvailabilityPartition Tolerance,赋予了该理论另外一个名字 - CAP

要想将该理论和现实的联系起来,让我们举一个简单的例子:你想购买一套托尔斯泰的《战争与和平》,以便在明天开始的长假中有可读的东西。然而你最喜欢的网上书店只有一本库存了。你进行搜索,确认书可以在你出发前送到,然后将书加入你的购物车。接着你想起来还有一些其他的东西要买,所以继续浏览网站(你是否在网站只买一件东西?当然要充分利用包裹的费用了)。但当你查看某个防晒霜的客户反馈时,国内某个地方的某个人,进入网站,将那本书加入到自己的购物车,然后直接付款(他们急需解决桌子摇晃的问题,其中一条桌脚比其他的短的多)。

Consistency
一个服务是一致的完整操作或完全不操作(A service that is consistent operates fully or not at all,精确起见列出原文,也有人将其简称为数据一致性)。Gilbert 和Lynch在他们的证明中使用“atomic”而不是consistent,技术上来讲更准确,因为严格来说,当用在数据库事务的属性中时,consistent是指ACID中的C,其含义是如果数据违反了某些预设的约束(preset constraints)就不能被持久化(persisted)。但如果你将其认为是分布式系统中的一个预设约束:不允许同一数据有不同的值,那么我认为这个抽象概念的漏洞就被堵住了(而且,如果Brewer使用atomic这个词,就会被称为AAP定理,那每次我们读它的时候都会被送进医院)(注:我估计是有口吃加白痴的嫌疑)。在前面购书的例子中,你将书加入购物车或无法加入。支付成功或不成功。你无法部分加入或部分支付一本书。库存中只有一本书,当天只有一个人能得到它。如果2个客户都可以完成订单流程(如完成支付),那么仓库中的和系统中的不一致性就会导致问题。在这个例子中也许并不是个大问题:某个人在假期中会很无聊或摆弄防晒霜,但如果将其扩大到数千个不一致性,并且涉及到金钱(例如:金融交易中关于买卖的东西和交易记录的内容不一致)就会是个大问题。也许我们可以利用数据库来解决一致性问题。在(购书的)订单流程中的某个点减少《战争与和平》的库存记录。当其他的客户到达这个点的时候,书架空了,订单流程将会通知客户,而不会进行到支付环节。这样第一个操作顺利完成,第二个操作则不会完成。数据库非常适合这种情况,因为数据库关注ACID属性,并且通过隔离性(Isolation)来保证一致性,这样当第一个客户会使得库存记录减1,同时购物车的记录加1,任何中间状态同第二个客户都是隔离的,当然第二个客户必须等待几百毫秒以便数据存储达到一致状态。
Availability
可用性只是意味着服务是可用的(可以完成如上的操作或不完成)。当你购书时期望得到反馈,而不是浏览器报告网站无法连接的信息。Gilbert 和Lynch在其CAP定理的证明中很好地指出了,可用性通常在你最需要的时刻背弃你。网站通常在业务最繁忙的时刻挂掉,因为网站压力最大。一个他人无法访问的服务对任何人都没有价值。
Partition Tolerance
如果你的应用和数据库运行在一个机器上(忽略规模的问题并假定你的代码都没问题),你的服务器是作为一种原子处理单元(atomic processor):要么工作要么不工作(例如:如果down机就不可用,但也不会造成数据不一致问题)

一旦开始将数据和逻辑分布在不同的节点上,就有形成partition的风险。假定网线被切断,partition就形成了,节点A无法和节点B通讯。由于Web提供的这种分布式能力,临时的partition是一个常见的情况,如之前说所的,在全球化的有多个数据中心的公司中这并不罕见。

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,因为如果无法连接它,那它就和不存在一样。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值