Dynamo: Amazon’s Highly Available Key-value Store

Dynamo: Amazon’s Highly Available Key-value Store

大规模的可靠性是我们亚马逊面临的最大挑战之一,亚马逊是世界上最大的电子商务运营公司之一;即使是最轻微的故障也会造成严重的财务后果,并影响客户信任。亚马逊平台为全球许多网站提供服务,它是在位于世界各地许多数据中心的数万台服务器和网络组件的基础设施之上实现的。在这种规模下,大大小小的组件都会不断地发生故障,在这些故障面前管理持久状态的方式会提高软件系统的可靠性和可伸缩性。

本文介绍了Dynamo的设计和实现,这是一个高度可用的键值存储系统,Amazon的一些核心服务使用它来提供一种永远在线的体验。为了实现这种级别的可用性,Dynamo牺牲了某些故障场景下的一致性。它以一种为开发人员提供新接口的方式,广泛地使用了对象版本控制和应用程序辅助的冲突解决。

1. INTRODUCTION

为了支持持续增长,平台需要具有高度的可伸缩性。系统的可靠性和可伸缩性取决于其应用程序状态的管理方式。Amazon使用高度分散、松散耦合、面向服务的体系结构,该体系结构由数百个服务组成。在这种环境中,特别需要始终可用的存储技术。例如,即使磁盘故障、网络路由震荡或数据中心被龙卷风破坏,客户也应该能够查看并向购物车中添加商品。因此,负责管理购物车的服务需要始终能够读写其数据存储,并且其数据需要跨多个数据中心可用

在由数百万个组件组成的基础设施中处理故障是我们的标准操作模式;在任何给定的时间,总是有少量但数量可观的服务器和网络组件出现故障。因此,亚马逊的软件系统需要在不影响可用性或性能的情况下,将故障处理视为正常情况来构建。为了满足可靠性和可伸缩性需求,Amazon开发了许多存储技术,其中最著名的可能是Amazon Simple storage Service(也可在Amazon之外使用,称为Amazon S3)。本文介绍了另一个为Amazon平台构建的高可用和可扩展的分布式数据存储Dynamo的设计和实现Dynamo用于管理具有很高可靠性要求的服务状态,需要严格控制可用性、一致性、成本效益和性能之间的权衡。

Amazon的平台有一组非常多样化的应用程序,具有不同的存储需求。一组选定的应用程序需要一种足够灵活的存储技术,以允许应用程序设计人员基于这些权衡来适当配置他们的数据存储,权衡高可用性和高的性能。

在Amazon的平台上,有许多服务只需要使用主键访问数据存储。对于许多服务,例如那些提供畅销书列表、购物车、客户偏好、会话管理、销售排名和产品目录的服务,使用关系数据库的常见模式将导致效率低下,并限制规模和可用性。发电机提供了一个简单的主键接口,以满足这些应用程序的要求。

Dynamo综合使用了已知的技术来实现可伸缩性和可用性:使用一致的哈希[10]对数据进行分区和复制,通过对象版本化[12]实现一致性。在更新期间,副本之间的一致性是通过类似仲裁的技术和分散副本同步协议来维护的。Dynamo一种基于gossip 的分布式故障检测和成员协议。Dynamo是一个完全分散的系统,最少需要手动管理。存储节点可以从Dynamo中添加和删除,而不需要任何手动分区或重新分配

在过去的一年里,Dynamo已经成为亚马逊电子商务平台中许多核心服务的底层存储技术。它能够有效地扩展到极端峰值负载,在繁忙的假日购物季节没有任何停机时间。例如,维护购物车的服务(购物车服务)在一天内处理了数千万个请求,导致超过300万个结帐,而管理会话状态的服务处理了数十万个并发的活动会话

这项工作对研究界的主要贡献是评估如何结合不同的技术来提供一个单一的高可用性系统。它证明了最终一致的存储系统可以用于要求较高的应用程序。它还提供了对这些技术进行调优的见解,以满足具有非常严格的性能要求的生产系统的需求。

本文的结构如下。第2节介绍背景,第3节介绍相关工作。第4节介绍了系统的设计,第5节描述了系统的实现。第6节详细介绍了在生产中运行发电机所获得的经验和见解,第7节总结了本文。本文中有很多地方可能需要额外的信息,但为了保护亚马逊的商业利益,我们需要减少一些细节。因此,第6节中的数据中心内部和数据中心之间的延迟、第6.2节中的绝对请求率以及第6.3节中的停机时间和工作负载都是通过聚合度量而不是通过绝对细节来提供的

4. SYSTEM ARCHITECTURE

需要在生产环境下运行的存储系统的架构比较复杂。除了实际的数据持久化组件,系统还需要有可扩展和健壮的解决方案,用于负载平衡、成员关系和故障检测、故障恢复、副本同步、过载处理、状态传输、并发和作业调度、请求编组、请求路由、系统监控和报警。和配置管理。描述每个解决方案的细节是不可能的,因此本文主要关注Dynamo中使用的核心分布式系统技术:分区、复制、版本控制、成员关系、故障处理和扩展

4.1 System Interface

Dynamo存储对象与一个键通过一个简单的接口;它公开了两个操作:get()和put()。get(键)操作在存储系统中定位与键关联的对象副本,并返回版本冲突的单个对象或对象列表以及上下文。put(键、上下文、对象)操作根据关联的键确定对象的副本应该放在哪里,并将副本写入磁盘。上下文对有关对象的系统元数据进行编码,这些元数据对调用者是不透明的,并包含对象的版本等信息。上下文信息与对象一起存储,以便系统可以验证put请求中提供的上下文对象的有效性

Dynamo将调用者提供的键和对象视为一个不透明的字节数组。它对密钥应用MD5哈希,生成一个128位的标识符,该标识符用于确定负责提供密钥的存储节点。

4.2 Partitioning Algorithm

关键设计要求之一是,它必须增加规模。这需要一种机制来在系统中的节点集(即存储主机)上动态地划分数据。发电机的分区方案依赖于一致的哈希来跨多个存储主机分配负载。在一致哈希[10]中,哈希函数的输出范围被视为一个固定的圆形空间或环形(即最大的哈希值环绕到最小的哈希值)。在这个空间中,系统中的每个节点都被分配了一个随机值,表示它在环上的位置。通过对数据项的键进行散列,得到其在环上的位置,然后顺时针移动环,找到第一个位置大于数据项位置的节点,将每个数据项分配给节点。因此,每个节点都对它和它的上一个节点之间的环中的区域负责。一致哈希的主要优点是,节点的离开或到达只影响它的近邻,而其他节点不受影响

基本的一致哈希算法提出了一些挑战。首先,环上各节点位置的随机分配导致数据和负载分布不均匀;其次,基本算法不考虑节点性能的异质性。为了解决这些问题,Dynamo使用了一种一致哈希的变体(类似于在[10,20]中使用的):不是将一个节点映射到圆中的单个点,而是将每个节点分配到环中的多个点。为此,Dynamo使用了虚拟节点的概念。虚拟节点看起来像系统中的单个节点,但每个节点可以负责多个虚拟节点。实际上,当一个新节点被添加到系统中时,它会被分配到环中的多个位置(即令牌)。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值