Dynamo数据库论文小结
来源:互联网 发布:软件开发入门书籍 编辑:程序博客网 时间:2024/06/06 14:02
论文链接:
http://www.allthingsdistributed.com/files/amazon-dynamo-sosp2007.pdf
Dynamo数据库提供了一个key-value的高可用性的数据库。它更是直接启发了Cassandra数据库的存储模式。总结来说,这个数据库的目的是为了高可用和可拓展,为了这两个目标,它采用了最终一致性的模型。这篇总结很简略地描述了Dynamo在设计时候考虑的重点和对应的技术选择。
首先,什么是Dynamo数据库?这个数据库的目的是什么?
这个是数据库是Amazon为了实现高可用和可拓展而开发的,是一个key-value数据库。加入我们要设计这个数据库,从哪里入手呢?
如何在集群中分发数据和如何备份数据?
在去中心化的集群里分发数据,采用一致性哈希算法。而备份数据,也是在一致性哈希算法的基础上采用多个节点存储。
接下来,如何副本之间的一致性?
Dynamo为了维护高可用(尤其是“写”可用)采取了最终一致性的模型。如何读?如何写? 这个要用到经典的三元组 (N, R, W),分别代表副本数目,读成功所需最少返回书,写成功需要最少执行数。而既然允许不一致的存在,必然要找到解决的办法,所以
如何解决副本之间不一致?
试想一下,遇到网络分区,不同分区的写操作如何保证?读数据时遇到不同的数据如何取舍?为了解决这些不一致,Dynamo采用了Vector Clock来处理不一致。
正常的情况都考虑完了,我们知道了怎么存储数据,怎么备份数据,怎么解决数据不一致,假设系统出现错误,该怎么办呢?
如何错误探测?
简单一点说,Dynamo使用gossip协议,利用心跳机制来进行错误探测。
节点暂时失效怎么办?
Hinted handoff来解决。比如A出现故障,先把A的数据“暂存”到其他节点X并且告诉X: “这些数据是A的”。X会在之后的过程中定期扫描这个区域,一旦发现A“复活”了,马上把数据换回去。
节点永久失效怎么办?
用anti-entropy协议来解决。
一下是关于论文的总结:
1 诞生的背景
亚马逊的业务要求有两个重点:
Reliability: outage是不可忍受的(用户体验)
Scalable:数据量巨大,增长迅速 (数据增长)
在这个基础之上,亚马逊需要开发一个新的数据库模型,用来增强可用性(尤其是“写”的可用用)和可拓展性。
在亚马逊的业务里,有许多主键访问(primary-key access)的数据,比如购物车,seesion management等等。Dynamo也正是针对这些数据,设计出了key-value的数据库存储模式(没有向传统数据库那样提供复杂的查询和事务)。
2 Dynamo的技术选择
很总结的说,Dynamo应用如下技术:
Data is partitioned and replicated usingconsistent hashing
Consistency is facilitated by object versioning
The consistency among replicas during updates is maintained by aquorum-like technique and a
Dynamo employs a gossip based distributed failure detection and membership protocol
简单来说, consistent hashing分配数据,数据版本号进行一致性管理,quorum-like用来进行数据更新,gossip协议用来错误探测和membership。
Dynamo设计的初衷就是为了那些不需要复杂查询的key-value型数据。因此Dynamo的设计没有考虑ACID中的“C”和“I”,所以并没有对transaction的支持。总的来说,在Dynamo的设计过程中,需要考虑许多问题,比如:
Partitioning
Load balancing
Membership
Failure detection
Failure recovery
Replica synchronization
Overload handling
State transfer
Concurrency and job scheduling
Request marshalling
Request routing
System monitoring
Alarming
Configuration management
而这篇论文中讨论的问题是:
i) Partitioning algorithm:使用virtual consistent hashing
ii) Replication:在consistent hashing之后的N-1个节点里保存副本
iii) Data versioning: 对一个object的不同副本使用vector clocks。如果 Va (casually <) Vb, 那么可以直接覆盖,如果不存在Casually关系,只能合并vector clocks,让sematic来处理。
iv) Get and Put:Dynamo使用的是与Cassandra相同的机制,一个client先找到一个coordinator,由这个coordinator来负责发送读写请求。
同时注意(W,R, N)三元组的搭配
Put:
1. Coordinator generates vector clock and new version
2. Send it to other nodes
Get:
1 Gather versions
2 处理版本不一致的情况,进行处理,并且回写
v) Handling Failures: Hinted Handoff
在处理暂时的错误时(比方说A暂时不可达或者网络问题),系统会把副本暂时拷贝到D的一个区域内,并且标明这是A的副本。这个区域里专门存放这个hinted replica。定期扫描这个区域,一旦A恢复马上把这个副本给A送回去。
vi) Handling permanent failures: Replica synchronization
还是存在一种情况是,hinted replica还没被送回去就挂了,因此系统使用了另一种协议:anti-entropy protocol来保持副本同步(利用Merkel Tree)。
vii) Membership and failure detection
利用gossip协议
viii) add/remove nodes
采用一致性hashing,比如向AB之间添加了接待X,之后的节点会在确认之后删除原本他们负责的部分。
ix) Implementation:
每个节点有三个主要的模块:request coordination, membership and failure detection, a local persistence engine.
Local Persistence engine 可以使用了MySQL等数据库,request coordination建立在一个事件驱动的编程上,具体是使用JAVA NIO实现的。
- Dynamo数据库论文小结
- Amazon Dynamo论文学习
- Amazon Dynamo论文中文版
- Amazon Dynamo论文解读 — Dynamo数据划分算法
- Amazon Dynamo论文解读 — Dynamo数据划分算法
- 论文小结
- Amazon Dynamo论文解读 - Merkle Tree的使用
- Amazon Dynamo论文解读 — 技术介绍(转载)
- Amazon Dynamo论文解读 - Merkle Tree的使用
- Amazon Dynamo论文解读 - Merkle Tree的使用
- Amazon Dynamo论文解读 - Merkle Tree的使用
- Amazon Dynamo论文解读 - Merkle Tree的使用
- 搜索论文小结
- Face Detector 论文小结
- 分布式数据库需要考虑的(BigTable VS Dynamo)
- Google论文小结之Chubby
- 书写论文相关问题小结
- [Notes] 集训队论文 阅读小结
- 新建maven工程并打出可执行jar包
- 关于一些PHP开源CMS
- SSH框架整合
- java通过内部类实现闭包
- Docker 監控之cadvior+influxdb+grafana
- Dynamo数据库论文小结
- 八大排序算法
- 链表中倒数第k个节点
- HDU 2222 Keywords Search(AC自动机模板)
- 重温python基础6:字典
- 傅里叶变换的通俗解释
- Scrapy: 爬虫返回403错误
- HDU 4747 Mex (线段树)
- 函数的返回值为指针类型的时候