Table of Contents

  1. 左耳听风ARTS第11周
    1. Algorithm
    2. Review
      1. 背景
      2. 设计中的考量
      3. 系统架构
    3. Tips
    4. Share

左耳听风ARTS第11周

Algorithm

Leetcode 134: https://leetcode.com/problems/gas-station/

https://medium.com/@dreamume/leetcode-134-gas-station-e9cfa4a1fdfd

Review

Dynamo: Amazon’s Highly Available Key-value Store(上)

https://www.allthingsdistributed.com/files/amazon-dynamo-sosp2007.pdf

Dynamo是Amazon推出的高可用key-value存储系统。

背景

该系统需要满足如下需求:

  1. Query Model

    数据读写操作有一个唯一标识的Key。状态以二进制方式存储,并以Key为唯一标识。操作不会夸多个数据项,因此不需要表结构记录关系。对象比较小,通常不超过1MB。

  2. ACID属性

    为保障高可用性,系统提供弱一致性。

  3. 效率

    对延迟性有较高要求并且SLA达到99.9%

  4. 其他

    Dynamo用于Amazon内部系统,无安全性相关需求

设计中的考量

由于强一致性和高可用性不能兼得,这里优先考虑高可用性。

一个重要的设计考虑是当冲突发生时,何时处理冲突。Dynamo设计目标是优先保证写操作。

另一个考量是谁来执行并处理冲突解决。数据存储模块来执行的话可选策略很优先,只能是采用最后写的优胜。应用程序来处理的话,因为它了解数据表结构,有能力合并冲突,更灵活。

其他需要考虑的有:

  1. 可扩展性
  2. 对称性
  3. 去中心化
  4. 异构。添加新节点不影响其他服务。

系统架构

Dynamo提供get和put方法操作对象,同时附带一个context包含有版本信息。

Dynamo使用特定的分区算法来保证扩展性。Dynamo动态的把数据分区到一系列的节点上,通过一致性hash分布式加载数据。

一致性hash按范围形成一个环形,每个节点被随机分配一个值代表一个环形中的位置。每个数据项有一个key,key被hash之后的值作为确定被放在环形的位置,然后放置在按顺时针方向查找比它大的第一个节点位置。

一致性hash方案的优点是分离或到达一个节点只影响其近邻的节点,对其他节点无影响。

一致性hash方案有两个问题,1是随机位置导致数据和数据分布的不统一,2是导致节点间性能不同。

因此Dynamo采用了一种变种方案,引入了虚拟节点的概念。虚拟节点看似跟普通节点相似,但每个节点可以代表多个虚拟节点。即当系统中新增一个节点时,它可以在环形中占有多个位置。

该变种方案有如下优点:

  1. 当一个节点异常时,该节点负载被分散到其他有效节点
  2. 当节点恢复或新节点新增时,该节点从其他节点中分担负载
  3. 可以根据节点的性能决定分配虚拟节点个数

Tips

  • 考虑问题的通用性,要多使用范型。

Share

《算法》第4版 图算法部分用C++实现了一遍,原书代码用的Java。

https://github.com/dreamume/algs4