文档章节

Amazon Dynamo的NWR模型

杨尚川
 杨尚川
发布于 2015/03/30 21:29
字数 1328
阅读 130
收藏 0

Amazon Dynamo的NWR模型,把CAP的选择权交给了用户,让用户自己选择CAP中的哪两个。

 

N代表N个副本(replication),W代表写入数据时至少要写入W份副本才认为成功,R表示读取数据时至少要读取R份副本。对于R和W的选择,要求W+R > N。 

 

优化写性能(AP)

当我们需要优化写性能(写多读少)的时候,可以配置W = 1 (写完一个副本就成功,其他的副本就异步去慢慢复制都可以),如果N=3,那么根据公式W+R>N,则R = 3(读取数据的时候需要读3个副本以判断数据是否有冲突)。 这种情况只要写任何节点成功就认为成功,但是读的时候必须从所有的节点都读出数据。

 

优化读性能(CP)

当我们需要优化读性能(读多写少)的时候,可以配置 W=N(写完所有的副本才成功,只能同步复制),根据公式W+R>N,则 R=1(只需读一个副本即可)。这种情况任何一个节点读成功就认为成功,但是写的时候必须写所有三个节点成功才认为成功。

 

平衡读写性能(AC)

当我们数据不多,单台能搞定,且不需要容错和扩展性的时候,可以配置N=1(只有一份数据),根据公式W+R>N,则W=1,R=1。这种情况就简化为单机问题了。

 

 

多个线程会同时更新一份数据,在这种情况下怎么保证一致性?

 

Amazon Dynamo使用多版本并发控制,即乐观锁。如果用户A读出来的数据的版本是v1,当用户A计算完成后要更新数据时,却发现数据的版本号已经被更新成了v2,那么服务器就会拒绝更新导致更新失败,这时候就需要用户A自己处理冲突,方法为:重新读取v2数据,然后重新计算,重新更新。这里跟在svn提交代码发生冲突的情况是一样的,svn提交代码遇到冲突,需要先更新代码,解决冲突之后才能再次提交。

 

如何发现不同节点上面的副本不一致?

 

还有更糟糕的时候(W=1),用户A更新一个副本,在A的更新还没有异步复制到其他副本之前,如果用户B也更新了其他副本,那么数据就处于不一致的状态了,同样需要用户自己处理。

  

Amazon  Dynamo使用Vector Clock向量时钟)。每个节点各自记录自己的版本信息,包括:1)更新数据的节点名称,2)版本号

 

如下所示,有A、B和C三个节点,W=1,R=N=3:

 

  1. 节点A写了两次)一个写请求,第一次被节点A处理了。节点A会增加一个版本信息(A,1)。我们把这个时候的数据记做D1(A,1)。 然后另外一个对同样key的请求还是被节点A处理了于是有D2(A,2)。这个时候,D2是可以覆盖D1的,不会有冲突产生。

  2. 节点A的数据成功异步复制到节点B和节点C,节点A、节点B、节点C处于一致)现在我们假设D2异步复制到了所有其他节点(节点B节点C),节点B节点C收到的数据不是来自用户,而是由节点A异步复制(为了让所有副本保持一致)来的,所以节点B节点C不产生新的版本信息,因此现在节点B节点C所持有的数据还是D2(A,2)。于是节点A节点B节点C上的数据及其版本号都是一样的。

  3. 节点B写了一次)如果有一个新的写请求到了节点B上,于是节点B生成数据D3(A,2; B,1),意思是:数据D全局版本号为3,节点A更新了2次,节点B更新了1次。

  4. 节点C写了一次:节点B的改变还没异步复制到节点C之前节点C就写完了)如果D3还没有异步复制节点C的时候,节点C又处理了一个新的写请求,于是,节点C上的数据是D4(A,2; C,1)。

  5. 好,最精彩的事情来了:如果这个时候来了一个读请求,因为W=1,R=N=3,所以R会从所有三个节点(A、B、C)上读,此时,他会读到三个版本:

  • A结点:D2(A,2)

  • B结点:D3(A,2; B,1);

  • C结点:D4(A,2; C,1)

  6.这个时候可以判断出,D2已经是旧版本(已经包含在D3/D4中),可以舍弃。

  7.但是D3和D4是明显的版本冲突,只能交给用户自己去做版本冲突管理。就像前面说的svn源代码版本管理一样。

 

 




© 著作权归作者所有

杨尚川

杨尚川

粉丝 1103
博文 220
码字总数 1624053
作品 12
东城
架构师
私信 提问
CAP、ACID、BASE理论及NWR实践策略详解

1、分布式领域CAP理论,Consistency(一致性), 保证得到的都是完成状态的数据,否则直接失败。 Availability(可用性), 在容忍的响应时间内,每个操作总是能够返回,不会出现所谓in_flight IO,...

tantexian
2016/04/07
409
0
深入解析:分布式系统的事务处理经典问题及模型

分布式系统需要在数据完整、一致性和性能间做平衡。本文系统介绍了处理分布式数据一致性的技术模型,如:Master-Slave,Master-Master,2PC/3PC,经典的将军问题,Paxos,以及Dynamo的NRW和V...

tantexian
2016/05/10
65
0
分布式系统的事务处理经典问题及模型

数据服务的高可用是所有企业都想拥有的,但是要想让数据有高可用性,就需要冗余数据写多份。写多份的问题会带来一致性的问题,而一致性的问题又会带来性能问题,这就会陷入一个无解的死循环!...

English0523
2014/01/30
0
0
[mongodb文档]分布式一致性

[mongodb文档]分布式一致性(一)[1] 一致性模型对于一个分布式数据库来说是至关重要的。这里我们将专门一个专题的形式来讲解一些主题:例如:针对一些具体的应用场景应该使用什么样的模型。...

nileader
2014/06/05
0
0
《Dynamo:Amazon`s Highly Available Key-value Sto...

这段时间学习了著名的Dynamo的论文,有些收获总结下来放在这里和大家分析下:)。由于英文水平实在太菜,存在很多理解不到位甚至是理解错了的地方,欢迎高手指正。 Dynamo简介 Dynamo是亚马逊...

gangzz
2013/08/07
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

Redis集群搭建

服务器资源 ip 账号 配置 操作系统 xxx.70 root/xxx 磁盘50G(/)+150G(/home)、内存16G、CPU 16core CentOS Linux release 7.2.1511 (Core) xxx.74 root/xxx 磁盘50G(/)+150G(/home)、......

jxlgzwh
7分钟前
2
0
avro

一、 ```我们已经接触过很多序列化框架(或者集成系统),比如protobuf、hessian、thrift等,它们各有优缺点以及各自的实用场景,Avro也是一个序列化框架,它的设计思想、编程模式都和thi...

hexiaoming123
9分钟前
1
0
QML TextInput的字体超出控件范围

本文链接:https://blog.csdn.net/chyuanrufeng/article/details/54691998 问题描述 :QML TextInput输入内容超过TextInput的大小 当输入过多的字符串时,会出现内容超过TextInput的大小,字...

shzwork
10分钟前
1
0
《Java 8 in Action》Chapter 10:用Optional取代null

1965年,英国一位名为Tony Hoare的计算机科学家在设计ALGOL W语言时提出了null引用的想法。ALGOL W是第一批在堆上分配记录的类型语言之一。Hoare选择null引用这种方式,“只是因为这种方法实...

HelloDeveloper
11分钟前
1
0
进击的 Java ,云原生时代的蜕变

作者| 易立 阿里云资深技术专家<br /> <br />导读:云原生时代的来临,与Java 开发者到底有什么联系?有人说,云原生压根不是为了 Java 存在的。然而,本文的作者却认为云原生时代,Java 依然...

阿里巴巴云原生
13分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部