Dynomite: NetFlix 对 dynamo 的开源通用实现

  • 李士窑

2014 年 11 月 11 日

话题:语言 & 开发架构

DynomiteNetFlix对亚马逊分布式存储引擎 Dynamo 的一个开源通用实现,它不仅支持基于内存的 K/V 数据库,还支持持久化的 Mysql、BerkeleyDb、LevelDb 等数据库,并具有简单、高效、支持跨数据中心的数据复制等优点。Dynomite 的最终目标是提供数据库存储引擎不能提供的简单、高效、跨数据中心的数据复制功能。目前,Dynomite 已经实现了对RedisMemcached的支持。

Dynomite 的拓扑结构如下图:

从图中可以看出每个 Dynomite 集群包括多个数据中心(dc),每个数据中心都有一组机架,每个机架包括多个节点,每个机架都包括完整的数据集,该数据集被划分在同一机架的多个节点上。因此,多个机架架构能够提供更高的可用性的数据服务。机架上的每个节点都有个一个唯一的标示,该标示用来识别节点属于哪个数据集。每个 Dynomite 节点都有一个 Dynomite process 组件用来协同数据服务器提供服务,该组件具有代理、路由、协调等作用。

Dynomite 支持多数据中心的复制,当发送写操作时,客户端能够连接到 Dynomite 集群的任意一个节点。如果 Dynomite 节点恰好接收的数据是属于本节点的数据时,该数据首先会被写到本地数据库服务中,并且异步的复制到所有数据中心的集群中的其他机架中。如果节点接收到不属于本节点的数据,Dynomite 将会以一个协调者的角色发送写的操作到相同机架上应该存储数据的节点上,并复制写操作到其他机架和数据中心的相应节点上。下图所示的是 Dynamo 客户端正将数据往一个集群上写,该数据属于节点 a2、b2、c2、d2。该请求发送给了 a1 节点,a1 节点就充当协调员的角色,并将请求转发给节点 a2、b2、c2、d2。

Dynomite 还具有一个常规、一致性的哈希环,但是复制是不对称的。Dyno 客户端的本地写使用了基于令牌的负载均衡,Dyno 客户端在相同区域知道 Dynomite 的集群拓扑结构,因此,Dynomite 能够使用一致性哈希直接将数据写到一个具体的节点中。

一致性是 Dynomite 的一个重要特性,但是在目前版本中,Dynomite 开发团队把高可用性放在了首位,把 Dynomite 的一致性放到了下一个版本中。如果开发者的使用场景是存储高频率的时间序列数据的话,Dynomite 完全能够满足需求。为了降低数据复制的延迟, Dynomite 开发团队将进行代码路径优化和增强复制策略来降低数据复制的延迟。Dynomite 开发团队还进行了线性试验, 结果充分证明了 Dynomite 完全能够满足高效、跨数据中心的数据复制的性能要求。Dynomite 遵循Apache License V2.0开源协议发布,其代码托管在GitHub上,更多关于 Dynomite 的信息请查看 NetFlix 技术博客对Dynomite 的介绍

Dynomite 是Dynamo的一个用于 K/V 数据库的实现,Dynamo 是亚马逊的一个分布式 K/V 存储系统,它具备去中心化、高可用性、高扩展性的特点。非常著名的 NoSql 数据库 Cassandra 就是按照 Dynamo 的 P2P 架构,同时融合了 BigTable 的数据模型及存储算法实现的。另外,还有一个数据库也叫做Dynomite,它由于受到 Dynamo 设计思想的启发,并采用 ErLang 语言开发的分布式 K/V 数据库,请读者不要将二者混淆.


感谢崔康对本文的审校。

给 InfoQ 中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ)或者腾讯微博(@InfoQ)关注我们,并与我们的编辑和其他读者朋友交流。

语言 & 开发架构