Swift里的CAP理论和NWR策略应用
http://blog.sina.com.cn/s/blog_57f61b490101a8ca.html
最近有人讨论到swift副本数是否能够调整,3副本成本过高,如果改成2副本怎么样?多聊了几句以后发现不少人可能都是望文生义,简单的认为副本数只是多一个少一个Copy的问题,并不了解背后的理论依据。所以想写个简单的介绍,普及分布式系统设计的一些基础知识点。这个是按傻瓜版写的,已经知道的同学请自动无视。
不同于传统的集中式存储,对于分布式存储系统来说,因为自身的复杂性,副本数并非简单拍脑门而来,需要找到理论支撑,它的依据实际上是来自于CAP理论和基于其上的NWR策略。
CAP 理论是由UC Berkerly的Eric Brewer(没错,他也叫Eric,哈哈)在2000年提出的,当时是一个猜想,2年后被MIT的两个家伙证明为理论,很快被互联网大企业们(Ebay,Twitter,Amazon等)接受和拥护,到如今已经13年,成为了分布式系统设计的经典理论之一。
CAP的主要思想是“C,A, P三者不可得兼,舍一而取二者也”。这就像找对象,如果你想找到一个真实存在的女朋友,你必须先明白没有人是完美的,分布式系统也这样。
C = 一致性 (Consistency) :保证得到的都是完成状态的数据,否则直接失败。
原文是A service that is consistent operates fully or not at all,要么完整得到一个原子性操作,要么闹太套(哈哈,开个玩笑)。这个要求像个专一的妹纸,一次只和一个人谈,没什么牵扯不清的中间状态。意味着系统给出去的数据必须保证是原子操作的合格品,否则直接不给,坚决不能给半成品。你不会拿到一张被另外一个请求画了一半的图,或者是更新了上半段的说明书。
A = 可用性 (Availability) :在容忍的响应时间内,每个操作总是能够返回,不会出现所谓in_flight IO,总是能及时响应。这意味着一个好脾气的妹纸,永远一分钟内反应。就是不想理你,她也会马上回答“我不想理你”而不是玩冷战,问她在吗?半天没声音。系统总能在指定时间段(例如15秒)内给你反馈,要么给你数据,要么告诉你失败鸟,不会告诉你正在处理中,然后把你撂一边自己下班了。
P = 分区容忍性 (Partition Tolerance) :能够保证系统是分区的。
原文是这样No set of failures less than total network failure is allowed to cause the system to respond incorrectly,比较难理解,简单的解释一下这是个反证,除非整个分布式系统所在的网络都挂掉,只要还有分区就能给出正确响应。这意味着一个会到处出没的妹纸,她可能在家,可能在office,可能在外面happy,但只要任何一个地方能上网,她就能给你反馈。(有人说那多个地方同时出现算什么,那只能说明你很花心,同时和好几个妹纸交往,她们互相之间还不反感,能够配合互为备份)这第三种特质比较罕见也比较难搞,这大概也就是跨分区(设备)的系统吸引人的地方吧。
CAP定理告诉我们,同时具有这三种特质的妹纸和分布式系统都是不存在的,你必须在其中做取舍。
Amazon于是写了个论文,描述了一下如果取舍的具体策略,具体到副本数怎么设定,这就是NWR。
N = 副本数
W = 一次成功的写操作必须完成的写副本数
R = 一次成功的读操作需要读的副本数(是的,随便读一个副本是不行的,你必须读到一定数量的副本,再相互比较取最新的数据)
策略来说就有具体的公式可供运算,有两个:
W > N/2
W + R > N
我们结合Swift的设定,N=3,W=2,R=2(or 1),来看看这两个公式是什么意义。
分布式系统通常用来处理大并发请求的应用,很多请求大家同时来,有一堆在读,也有一堆想写。
假设有一个数据拥有三副本,每个副本已经同步好,原来的值都是A
我们看看如果不需要满足公式让W小于3/2,也就是W=1的情况下会出现什么问题,W=1,意味着每个写的请求只要写完一个副本即可成功返回。
假设两个进程同时来更新这份数据,进程W1要把值改写成C,进程W2要把值改写成B,那就有可能出现下图的情形,两个进程各拿到一个副本改写,都认为自己的写操作是成功的,结果却留给系统三个不同的副本,这样就出现数据副本不一致的问题。
所以公式W> N/2, 实际上变成了一个写的锁,意味着只有写了过半数副本的才算写成功,拿不到的就返回失败,解决了竞争的问题。如下图,W1的会话成功,W2的会话就返回失败。
W> N/2,同时意味着不需要把所有的副本都写完,未完成的留给系统自己后台慢慢同步,那这个时候问题就来了,一个新的会话过来读数据的时候,分配到的副本有可能是没来得及更新的。这时候R1读回去的就是过时的数据B,而非最新的数据C
第2个公式变形下就是R> N-W,R=2就避免正好倒霉读到没更新的那一个。这样读回去C和B两个数据,再比较后取最新的C。所以W+R> N 能够保证每个读的请求至少读到一份最新的数据,
所以你也许已经琢磨出来,这两个公式更加强调一致性,在可用性上是有所保留的。
当然NWR还可能取其他值,不同的取值代表了不同的倾向。如果设定N=3, W=3, R=1,那么强调的是一致性,写数据的时候一定要把所有副本都刷新,杜绝中间状态,这样一致性得到很好保证;如果N=3, W=1, R=1,那强调的是可用性,这种情况下一致性是被牺牲掉了,所以上面两个保证一致性的公式在这种情况下就不再适用。之所以可用性提高是因为读和写都放低了要求,只要完成一个副本即可,这样完成时间降低,响应速度是更快的。
N=3, W=2, R=2是一种折中的策略。其实Amazon的Dynamo就是采用的这个参数,据说Swift是照搬S3的。
所以回到Swift的副本设定来看,swift的NWR值是可调的,有两种配置,一种是标准的N3W2R2,但是实际上你也可以使用N3W2R1,这个更实用点。在这种配置下,虽然一个数据拥有三副本,但是容错上读写是不一样的。网络断线,硬盘故障等意外造成一个副本失效时, 系统仍然可读可写,但两个副本失效时,受影响的这部分数据系统就变成只读,无法再写了。
CAP理论和NWR策略在大规模系统下是比较合理的,除了被用来设计分布式存储之外,也用来设计分布式数据库,比如很热的NOSQL。另外,这个理论问世已经不短的时间,也经常看到有人发文要挑战他,也有一些吐槽等等,那个是另外的话题,这里就不再继续了。
Swift里的CAP理论和NWR策略应用的更多相关文章
- CAP理论
自打引入CAP理论的十几年里,设计师和研究者已经以它为理论基础探索了各式各样新颖的分布式系统,甚至到了滥用的程度.NoSQL运动也将CAP理论当作对抗传统关系型数据库的依据. CAP理论主张任何基于网 ...
- (转)CAP理论十二年回顾:"规则"变了
编者按:由InfoQ主办的全球架构师峰会将于2012年8月10日-12日在深圳举行,为了更好地诠释架构的意义.方法和实践,InfoQ中文站近期会集中发布一批与架构相关的文章,本篇即为其中之一.Info ...
- 《大型网站系统与Java中间件实践》读书笔记——CAP理论
分布式事务希望在多机环境下可以像单机系统那样做到强一致,这需要付出比较大的代价.而在有些场景下,接收状态并不用时刻保持一致,只要最终一致就行. CAP理论是Eric Brewer在2000年7月份的P ...
- 转载:分布式系统的CAP理论
原文转载Hollis原创文章:http://www.hollischuang.com/archives/666 2000年7月,加州大学伯克利分校的Eric Brewer教授在ACM PODC会议上提 ...
- 【转】分布式理论-CAP理论
一 CAP理论简述 CAP (Consistency, Availability, Partition Tolerance,) 理论是NoSQL数据库管理系统构建的基础. 强一致性:等同于所 ...
- 分布式系统之CAP理论
任老师第一节主要讲了分布式系统实现时候面临的八个问题,布置的作业就是这个,查询CAP理论. 笔者初次接触分布式,所以本文主要是一个汇总. 一.CAP起源 CAP原本是一个猜想,2000年PODC大会的 ...
- CAP理论与MongoDB一致性、可用性的一些思考
大约在五六年前,第一次接触到了当时已经是hot topic的NoSql.不过那个时候学的用的都是mysql,Nosql对于我而言还是新事物,并没有真正使用,只是不明觉厉.但是印象深刻的是这么一张图片( ...
- 分布式系统的CAP理论
一.CAP理论概述 一个分布式系统最多只能同时满足一致性(Consistency).可用性(Availability)和分区容错性(Partition tolerance)这三项中的两项. 二.CAP ...
- ZooKeeper和CAP理论及一致性原则
一.CAP理论概述CAP理论告诉我们,一个分布式系统不可能同时满足以下三种 一致性(C:Consistency)可用性(A:Available)分区容错性(P:Partition Tolerance) ...
随机推荐
- 微信小程序 按钮点击跳转页面
wx.navigateTo({ url: '/pages/index/talkPage', })跳转到talkPage界面. 首先: html界面要在app.json里面注册: 不注册的话会报 ...
- length()
在MATLAB中: size:获取数组的行数和列数 length:数组长度(即行数或列数中的较大值) numel:元素总数. s=size(A),当只有一个输出参数时,返回一个行向量,该行向量的第一个 ...
- IplImage 与mat之间的转换及释放内存
IplImage *x = cvLoadImage(savefilename, ); Mat img(x,true); cvReleaseImage(&x); 完
- 如何查看Window10系统隐藏文件夹
1 . 打开我的电脑(此电脑)等等诸如此类的称呼 2 . 点击左上角的查看选项 3 . 选中“隐藏的选项” 4 . 完成
- Redis的持久化策略
Redis 持久化: 提供了多种不同级别的持久化方式:一种是RDB,另一种是AOF. RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot). AO ...
- null 与 undefinded
null表示"没有对象",即该处不应该有值.典型用法是: (1) 作为函数的参数,表示该函数的参数不是对象. (2) 作为对象原型链的终点. Object.getPrototype ...
- C# [ModelName]标记 模型,类名称重复。
前几天遇到一个不算bug的bug 记录分享一下 出错情况 webapi 程序会自带一个模板 如图 点某一个接口进去后 出错原因 model实体中出现了名称一样的(并不会影响程 ...
- 今天遇到的一个奇葩的NoClassFound的问题
nohup的日志中报错 java.lang.NoClassDefFoundError: org/apache/catalina/core/ApplicationContext$DispatchData ...
- 一键分享到各个SNS插件
使用百度分享:http://share.baidu.com/code/advance#toid 例: HTML: <div class="bdsharebuttonbox" ...
- oracle C# 访问
使用oracle的odp.net 进行oracle数据库的访问对于进行oracle数据库的开发来说是比较方便的,使用的方式与ADO.net 是一致的. 一下为使用的测试 1. 安装必要的oracle ...