这篇文章是07年的SOSP上的,虽然在技术上没有什么特别的创新,但是这篇文章却是利用各种分布式系统的技术组合在一起来满足特定的业务需求的典范。

Amazon主要业务是电子商务,所以对系统的可靠性(Reliability)和可扩展性(Scalability)要求非常高。要达到这两点要求,Amazon采用了去中心化(Decentralized),低耦合(Loosely Coupled)和面向服务(Service Oriented)的架构,并且组合了成百上千的服务。在这样一个情况下,对一个高可靠性的存储系统的需求就非常高。比如即使在磁盘挂掉,数据中心出现问题的情况下,用户依然能将商品添加到购物车。Dynamo就是一个为这样的一些应用场景提供保障的高可用性的key-value存储系统。

我们知道在分布式系统中有一个CAP原理,就是说在一个分布式系统中,一致性(Consistency),可用性(Availability)和分区容错性(Partition Tolerance)这三个特点是不可能达到的,只能满足其中两个(P&&(C||A))。Dynamo就是牺牲一致性来获得高可用性的。冲突在“读”的过程中解决,而不是在“写”的过程中,即系统“总是可写”的。

Dynamo系统前提:

  1. 查询模型:key-value,put(k)&get(k);
  2. ACID属性:只保证弱一致性,同时不提供任何隔离级别的保证;
  3. 高效性:对于延迟提供99.9%的分布SLA(Service Level Agreement); 主要是确保应用能在一定的时间内完成功能,比如在每秒500个请求的情况下,对于99.9%的请求的响应时间能保证在300ms之内;
  4. 其它:没有安全和权限问题;

Dynamo设计原则:

  1. 增量可扩展性:根据需求很容易来扩展来提高系统处理能力;
  2. 对称性:即每个节点发挥的作用一样,没有特殊节点的存在;
  3. 去中心化:对称性的扩展;
  4. 异构性:底层支持有差异的服务器;

Dynamo采用的技术:

  1. 一致性哈希算法(Consitent Hash):解决了数据分区的问题,提高了系统的可扩展性;
  2. 向量时钟(Vector Clock):解决了写的高可用性,将冲突放在“读”的过程中解决;
  3. Sloppy Quorum和Hinted Handoff:解决临时节点失效问题;
  4. Anti-Entropy(Merkle Tree):从永久的故障中恢复;
  5. Gossip-based协议:成员关系管理(Membership)和错误发现(Failure Detection);

这些技术都是之前分布式系统中存在的技术,Dynamo只是将这些技术组合起来来达到这样一个业务场景的业务需求。这篇文章对思考这些分布式的概念和应用场景还是有一定的帮助的。