Amazon Dynamo 是一个经典的分布式Key-Value 存储系统,具备去中心化,高可用性,高扩展性的特点,但是为了达到这个目标在很多场景中牺牲了一致性。Dynamo在Amazon中得到了成功的应用,能够跨数据中心部署于上万个结点上提供服务,它的设计思想也被后续的许多分布式系统借鉴。如近来火热的Cassandra,实际上就是基本照搬了Dynamo的P2P架构,同时融合了BigTable的数据模型及存储算法。
Dynamo组合使用了多种P2P技术,下面就从最基本的DHT(Distributed Hash Table)说起。
DHT,一致性哈希
Dynamo的存储模型就是一个简单的Key-Value映射表,如何把这个表分散到大量结点上呢,简单的做法可以是hash(key)%node_number,但是这样结点数目变动的时候就需要改变所有结点上的数据分布,这对上百万个结点,可能需要频繁添加删除结点,经常出现结点失效的系统来说,是无法承受的。因此,需要一种算法,使得在系统中结点变化只是,尽量减少数据迁移的开销,Dynamo采用的就是著名的一致性哈希算法,如图
给定一个hash值空间,[0~2^32),假设分布在一个圆环上,对每个结点算出一个固定hash值,将结点置于环上,将Key K算出h