您的位置:首页 > 其它

通过一个大型项目来学习分布式算法(6)

2016-03-11 17:07 309 查看
  图7:三个策略的分区和key的位置。甲,乙,丙描述三个独立的节点,形成keyk1在一致性哈希环上的首选列表(N=3)。阴影部分表示节点A,B和C形式的首选列表负责的keyrangee。黑色箭头标明各节点的Token的位置。策略3:每个节点Q/S个Token,大小相等的分区:类似策略2,这一策略空间划分成同样大小为Q的散列分区,以及分区布局(placement of partition)与划分方法(partitioning scheme)脱钩。此外,每个节点被分配Q/S个Token其中S是系统的节点数。当一个节点离开系统,为使这些属性被保留,它的Token随机分发到其他节点。同样,当一个节点加入系统,新节点将通过一种可以保留这种属性的方式从系统的其他节点“偷”Token。对这三个策略的效率评估使用S=30和N=3配置的系统。然而,以一个比较公平的方式这些不同的策略是很难的,因为不同的策略有不同的配置来调整他们的效率。例如,策略1取决于负荷的适当分配(即T),而策略3信赖于分区的个数(即Q)。一个公平的比较方式是在所有策略中使用相同数量的空间来维持他们的成员信息时,通过评估负荷分布的偏斜. 例如,策略1每个节点需要维护所有环内的Token位置,策略3每个节点需要维护分配到每个节点的分区信息。在我们的下一个实验,通过改变相关的参数(T 和 Q),对这些策略进行了评价。每个策略的负载均衡的效率是根据每个节点需要维持的成员信息的大小的不同来测量,负载平衡效率是指每个节点服务的平均请求数与最忙(hottest)的节点服务的最大请求数之比。结果示于图8。正如图中看到,策略3达到最佳的负载平衡效率,而策略2最差负载均衡的效率。一个短暂的时期,在将Dynamo实例从策略1到策略3的迁移过程中,策略2曾作为一个临时配置。相对于策略1,策略3达到更好的效率并且在每个节点需要维持的信息的大小规模降低了三个数量级。虽然存储不是一个主要问题,但节点间周期地Gossip成员信息,因此最好是尽可能保持这些信息紧凑。除了这个,策略3有利于且易于部署,理由如下:(i)更快的bootstrapping/恢复:由于分区范围是固定的,它们可以被保存在单独的文件,这意味着一个分区可以通过简单地转移文件并作为一个单位重新安置(避免随机访问需要定位具体项目)。这简化了引导和恢复过程。(ii)易于档案:对数据集定期归档是Amazon存储服务提出的强制性要求。Dynamo在策略3下归档整个数据集很简单,因为分区的文件可以被分别归档。相反,在策略1,Token是随机选取的,归档存储的数据需要分别检索各个节点的key,这通常是低效和缓慢的。策略3的缺点是,为维护分配所需的属性改变节点成员时需要协调,。 
图8:比较30个维持相同数量的元数据节的点,N=3的系统不同策略的负载分布效率。系统的规模和副本的数量的值是按照我们部署的大多数服务的典型配置。6.3不同版本:何时以及有多少? 如前所述,Dynamo被设计成为获得可用性而牺牲了一致性。为了解不同的一致性失败导致的确切影响,多方面的详细的数据是必需的:中断时长,失效类型,组件可靠性,负载量等。详细地呈现所有这些数字超出本文的范围。不过,本节讨论了一个很好的简要的度量尺度:在现场生产环境中的应用所出现的不同版本的数量。不同版本的数据项出现在两种情况下。首先是当系统正面临着如节点失效故障的情况下, 数据中心的故障和网络分裂。二是当系统的并发处理大量写单个数据项,并且最终多个节点同时协调更新操作。无论从易用性和效率的角度来看,都应首先确保在任何特定时间内不同版本的数量尽可能少。如果版本不能单独通过矢量时钟在语法上加以协调,他们必须被传递到业务逻辑层进行语义协调。语义协调给服务应用引入了额外的负担,因此应尽量减少它的需要。在我们的下一个实验中,返回到购物车服务的版本数量是基于24小时为周期来剖析的。在此期间,99.94%的请求恰好看到了1个版本。0.00057%的请求看到2个版本,0.00047%的请求看到3个版本和0.00009%的请求看到4个版本。这表明,不同版本创建的很少。经验表明,不同版本的数量的增加不是由于失败而是由于并发写操作的数量增加造成的。数量递增的并发写操作通常是由忙碌的机器人(busy robot-自动化的客户端程序)导致而很少是人为触发。由于敏感性,这个问题还没有详细讨论。6.4客户端驱动或服务器驱动协调 如第5条所述,Dynamo有一个请求协调组件,它使用一个状态机来处理进来的请求。客户端的请求均匀分配到环上的节点是由负载平衡器完成的。Dynamo的任何节点都可以充当一个读请求协调员。另一方面,写请求将由key的首选列表中的节点来协调。此限制是由于这一事实--这些首选节点具有附加的责任:即创建一个新的版本标识,使之与写请求更新的版本建立因果关系(译:呜呜,这个很难!Causally subsumes)。请注意,如果Dynamo的版本方案是建基于物理时间戳(译:一个在本文中没解释的概念:[Timestamp Semantics and Representation]Many database management systems and operating systems provide support for time values. This support is present at both the logical and physical levels. The logical level is the user's view of the time values and the query level operations permitted on those values, while the physical level concerns the bit layout of the time values and the bit level operations on those values. The physical level serves as a platform for the logical level but is inaccessible to the average user.)的话,任何节点都可以协调一个写请求。另一种请求协调的方法是将状态机移到客户端节点。在这个方案中,客户端应用程序使用一个库在本地执行请求协调。客户端定期随机选取一个节点,并下载其当前的Dynamo成员状态视图。利用这些信息,客户端可以从首选列表中为给定的key选定相应的节点集。读请求可以在客户端节点进行协调,从而避免了额外一跳的网络开销(network hop),比如,如果请求是由负载平衡器分配到一个随机的Dynamo节点,这种情况会招致这样的额外一跳。如果Dynamo使用基于时间戳的版本机制,写要么被转发到在key的首选列表中的节点,也可以在本地协调。一个客户端驱动的协调方式的重要优势是不再需要一个负载平衡器来均匀分布客户的负载。公平的负载分布隐含地由近乎平均的分配key到存储节点的方式来保证的。显然,这个方案的有效性是信赖于客户端的成员信息的新鲜度的。目前客户每10秒随机地轮循一Dynamo节点来更新成员信息。一个基于抽取(pull)而不是推送(push)的方被采用,因为前一种方法在客户端数量比较大的情况下扩展性好些,并且服务端只需要维护一小部分关于客户端的状态信息。然而,在最坏的情况下,客户端可能持有长达10秒的陈旧的成员信息。如果客户端检测其成员列表是陈旧的(例如,当一些成员是无法访问)情况下,它会立即刷新其成员信息。表2显示了24小时内观察到的,对比于使用服务端协调方法,使用客户端驱动的协调方法,在99.9百分位延时和平均延时的改善。如表所示,客户端驱动的协调方法,99.9百分位减少至少30毫秒的延时,以及降低了3到4毫秒的平均延时。延时的改善是因为客户端驱动的方法消除了负载平衡器额外的开销以及网络一跳,这在请求被分配到一个随机节点时将导致的开销。如表所示,平均延时往往要明显比99.9百分位延时低。这是因为Dynamo的存储引擎缓存和写缓冲器具有良好的命中率。此外,由于负载平衡器和网络引入额外的对响应时间的可变性,在响应时间方面,99.9th百分位这这种情况下(即使用负载平衡器)获得好处比平均情况下要高。表二:客户驱动和服务器驱动的协调方法的性能。 6.5衡后台和前台任务每个节点除了正常的前台put/get操作,还将执行不同的后台任务,如数据的副本的同步和数据移交(handoff)(由于暗示(hinting)或添加/删除节点导致)。在早期的生产设置中,这些后台任务触发了资源争用问题,影响了正常的put和get操作的性能。因此,有必要确保后台任务只有在不会显著影响正常的关键操作时运行。为了达到这个目的,所有后台任务都整合了管理控制机制。每个后台任务都使用此控制器,以预留所有后台任务共享的时间片资源(如数据库)。采用一个基于对前台任务进行监控的反馈机制来控制用于后台任务的时间片数。管理控制器在进行前台put/get操作时不断监测资源访问的行为,监测数据包括对磁盘操作延时,由于锁争用导致的失败的数据库访问和交易超时,以及请求队列等待时间。此信息是用于检查在特定的后沿时间窗口延时(或失败)的百分位是否接近所期望的阀值。例如,背景控制器检查,看看数据库的99百分位的读延时(在最后60秒内)与预设的阈值(比如50毫秒)的接近程度。该控制器采用这种比较来评估前台业务的资源可用性。随后,它决定多少时间片可以提供给后台任务,从而利用反馈环来限制背景活动的侵扰。请注意,一个与后台任务管理类似的问题已经在[4]有所研究。6.6讨论 本节总结了在实现和维护Dynamo过程中获得的一些经验。很多Amazon的内部服务在过去二年中已经使用了Dynamo,它给应用提供了很高级别的可用性。特别是,应用程序的99.9995%的请求都收到成功的响应(无超时),到目前为止,无数据丢失事件发生。此外,Dynamo的主要优点是,它提供了使用三个参数的(N,R,W),根据自己的需要来调整它们的实例。不同于流行的商业数据存储,Dynamo将数据一致性与协调的逻辑问题暴露给开发者。开始,人们可能会认为应用程序逻辑会变得更加复杂。然而,从历史上看,Amazon平台都为高可用性而构建,且许多应用内置了处理不同的失效模式和可能出现的不一致性。因此,移植这些应用程序到使用Dynamo是一个相对简单的任务。对于那些希望使用Dynamo的应用,需要开发的初始阶段做一些分析,以选择正确的冲突的协调机制以适当地满足业务情况。最后,Dynamo采用全成员(full membership)模式,其中每个节点都知道其对等节点承载的数据。要做到这一点,每个节点都需要积极地与系统中的其他节点Gossip完整的路由表。这种模式在一个包含数百个节点的系统中运作良好,然而,扩展这样的设计以运行成千上万节点并不容易,因为维持路由表的开销将随着系统的大小的增加而增加。克服这种限制可能需要通过对 Dynamo引入分层扩展。此外,请注意这个问题正在积极由O(1)DHT的系统解决(例如,[14])。7结论本文介绍了Dynamo,一个高度可用和可扩展的数据存储系统,被Amazon.com电子商务平台用来存储许多核心服务的状态。Dynamo已经提供了所需的可用性和性能水平,并已成功处理服务器故障,数据中心故障和网络分裂。Dynamo是增量扩展,并允许服务的拥有者根据请求负载按比例增加或减少。Dynamo让服务的所有者通过调整参数N,R和W来达到他们渴求的性能,耐用性和一致性的SLA。在过去的一年生产系统使用Dynamo表明,分散技术可以结合起来提供一个单一的高可用性系统。其成功应用在最具挑战性的应用环境之一中表明,最终一致性的存储系统可以是一个高度可用的应用程序的构建块。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  分布式事务 算法