上篇文章聊了下 Hbase ,这篇聊一下 Hbase 的“孪生兄弟”Dynamo风格的数据库,比如 Riak 、Cassandra。在大数据领域混的人大概都知道谷歌发表的 BigTable 的论文,但是对亚马逊的 Dynamo 论文就不太清楚了。当然这也有可能是因为其开源实现 Cassandra 不怎么出名有关。
在历史上,Dynamo: Amazon’s Highly Available Key-value Store是与BigTable那篇论文并驾齐驱的论文,提出了一种非常有创意的架构模式,并且在 2017 年上海举办的 SOSP 会议上获得了SIGOPS名人堂奖,意味着这篇文章对业界造就了非常深远的影响。
回到论文本身,Dynamo 是非常特立独行的论文。在大数据领域里,基本上知名的分布式系统,都选择了中心化模式。所谓中心化模式,就是有一个中心节点负责协调整个集群的活动,或者是有一个主节点负责读入写入,其余节点是读节点。为了可用性,往往在主节点也会做一个备用节点。但是本质是,还是需要一个中心节点。这种模式的好处就是容易实现,极大地降低了系统复杂度,但是缺点就是可用性不是很高,中心化节点一旦宕机了,就会导致整个系统不可用。
因此,Dynamo 在论文里就提到去中心化是 Dynamo 设计的一条重要原则:
Decentralization: An extension of symmetry, the design should favor decentralized peer-to-peer techniques over centralized control. In the past, centralized control has resulted in outages and the goal is to avoid it as much as possible. This leads to a simpler, more scalable, and more available system.
选择了去中心化的话,系统的可用性会得到极大地提升,但是也限制了数据的一致性。一般来说,Dynamo 是一个最终一致性的系统。具体的讨论在这里不展开了,感兴趣的可以看《设计数据密集型应用》一书。
这里聊聊我的感觉,谷歌刚开源 Hadoop 那一套东西时,这是用于内部系统的,而且内部系统的基础设施也会更容易得到维护,主节点不容易出现宕机等各种情况。但是呢,亚马逊做的是云,所谓云的,使用去中心化的模式会极大地提高整个系统的可用性,而不是担心某个节点宕机导致整个云不可用。这样的思想,自然而然就影响了整个的系统设计模式。
另外除了去中心化的模式外,Dynamo 作为一个键值对存储系统,还选择了哈希一致性。BigTable 的 Key 是按照顺序存储的数据,但是Dynamo 是基于哈希做的。技术细节不在此讨论,仅仅谈谈我的感受。 Dynamo 选择了哈希一致性,做了很多很有趣的改进,比如做虚拟节点等等以实现数据增长的自动扩容等问题。缺点也比较明显,比如求某一个范围内的数据时,使用哈希就比较麻烦。
这两个独特的设计在互联网圈是比较独特的,使用这样的去中心化和一致性哈希的数据库还是比较少的,因为优缺点特别明显。换句话说,读这篇文章之前,读者朋友们知道 Riak 、Cassandra 的比例应该不高,在中国的互联网圈应用的也比较少。
毕竟笔者也没真正用过这些数据库,这篇文章仅仅只是针对这篇Dynamo: Amazon’s Highly Available Key-value Store论文的一个简单的讨论。