论文链接:
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协议,利用心跳机制来进行错误探测。
节点暂时失效怎么办?