http://catkang.github.io/2016/05/27/dynamo.html

Dynamo是Amazon开发的分布式存储系统,本文是阅读Dynamo论文后的总结:Dynamo: Amazon’s Highly Available Key-value Store。将从背景、定位、简介、问题及解决方案几个方面介绍Dynamo的整体设计思路。

背景

Dynamo是在Amazon所处的应用环境中因运而生的,其需要面对的问题和场景在互联网的业务中也是类似的:

  • 大多数场景并不需要复杂的查询功能;
  • 由于使用商用机作为服务器,导致机器或网络失败成为相对常见并需要妥善处理的场景;
  • 为了提供良好的用户体验,服务需要极高的可用性和较好的性能;
  • 随着业务量逐步增大,服务的处理能力也需要平滑提升。

定位

为了理解Dynamo的整体设计,了解其定位是很有必要的,因为从其定位中我们可以清楚的了解到系统关注的问题和可以放弃或妥协的点。针对上所述的背景,Dynamo提出了自己的基本定位:

  • 仅提供简单的kv查询
  • 高可用性
  • 易扩展性

正是由于上述对自己的定位,Dynamo在设计中可以舍弃掉许多负担,如关系型数据库复杂的查询模型、对ACID的支持,对强一致性的追求,以及复杂的存储结构。同时,Dynamo认为其面对的是相对安全的内部网络环境,所以并没有处理安全或权限问题。

简介

  • Dynamo客户端使用put,get接口读写指定key所对应的数据;
  • 将整个数据空间划分为不同分片后存储在不同节点上;
  • 其通过分片复制和一系列故障发生时的应对方案来保证整个服务的高可用;
  • 为了可用性Dynamo损失了一些一致性,可能发生的数据冲突有可能需要应用程序处理;
  • Dynamo去中心化的维护整个集群的成员及故障信息,并采用gossip同步。

问题及解决方案

1,数据分片

为了更好更灵活的操作管理存储的数据,对数据空间进行分片并将分片分配到不同存储机器是一个显而易见的不错的做法。Dynamo采用类似一致性哈希的方式进行分片的划分和分配。关于数据分片的算法,Dynamo经历了几个阶段的选择和进化。

  • 传统的一致性hash:将机器节点随机对应在hash ring上,数据key所对应的hash值所在位置顺时针遇到的第一个节点负责自己所在的range。

    • 优点:新节点加入,或旧节点退出时,只影响紧相邻的下一个节点
    • 缺点:负载不均匀且不同的机器性能的不同没有考虑到
  • 增加virtrual nodes的一致性hash:这时每个机器节点对应hash ring上的多个虚拟节点,可以根据机器性能方便的调节所负责的虚拟节点数
    • 优点:充分考虑机器性能的不同且可以做到负载均衡
    • 缺点:分片转移时,实现上需要对整个range进行遍历; 加入或删除节点时Merkle tree需要重新计算

  • 数据空间等分Q份,T个机器节点时,每个机器分得S个分片,其中Q=T*S

    • 优点:分片固定大小,可对应单个文件,因此容易加入或删除节点,且容易备份。

2,分片备份

为了系统高可用,Dynamo的每个分片都有N个副本,存储在hash ring上顺时针方向的N个节点上。这N个节点称为该数据的preference list。其中的每一个节点都可以对接受针对该数据的操作请求。 

3,数据版本及冲突处理

由于preference list中的每个节点都可以对同一个数据进行处理,且为了高可用,用户写请求返回前并没有将数据同步到所有分片。当有大量并行访问或故障发生时,集群中的不同机器看到的同一个数据状态可能不同,这时就发生了冲突。Dynamo引入vector clock来在一定程度上缓解冲突的发生,并最终由应用端对冲突进行合并。

vector clock := list{ (node, counter), ...}
node := 机器id
counter := 该数据在node上的处理序序号
  • vector clock通过列出在数据在每个节点上的处理序列来发现不同vector clock之间的因果关系,其中每个(node, counter)可以看做是一个分量。
  • 当某个vector clock的所有分量都小于另一个时,该vector clock便是另一个的因,可以被覆盖。Dynamo节点通过这种因果关系尽可能的处理冲突。
  • 没有因果关系的所有vector clock需要全部返回客户端,在应用端处理
  • 。 

4,读写过程

  • 客户端通过负载均衡代理或者自己维护数据到机器的映射关系,将请求最终交给preference list中的一个Dynamo节点处理,该节点称为coodinator
  • Dynamo采用类似Quorum的方式保证数据正确,即W+R>N。
  • Put流程:
    • coodinator生成新的数据版本,及vector clock分量
    • 本地保存新数据
    • 向preference list中的所有节点发送写入请求
    • 收到W-1个确认后向用户返回成功
  • Get流程
    • coodinator向preference list中所有节点请求数据版本
    • 等到R-1个答复
    • coodinator通过vector clock处理有因果关系的数据版本
    • 将不相关的所有数据版本返回用户

5,发生暂时错误时保证可用

Dynamo中用hinted handoff的方式保证在出现暂时的节点或网络故障时,集群依然可以正常提供服务。

  • 流程:

    • 节点失败时,会将其负责分片发送给一致性哈希环上下一个本来没有该分片的节点
    • 收到该分片的节点会将分片放到单独的空间,并成为该分片的处理节点,同时不断的通过hint检测原节点
    • 发现原节点可用时,将数据传回原节点并删除本地分片
  • 优点:
    • 避免了短暂的机器或网络故障造成的不可用

6,降低分片同步数据传输量

通过上面所述,可以看出当故障发生或者有新节点加入、离开集群时,都涉及分片的拷贝和传输。希望能够快速检查分片中内容是否相同,并通过仅发送不同的部分来减少数据传输量。Dynamo采用Merkle Tree来解决这个问题。

  • Merkle tree:

    • 每个叶子节点对应一个数据项,并记录其hash值
    • 每个非叶子节点记录其所有子节点的hash值
  • 使用:
    • Dynamo为自己维护的每一个分片维护一个Merkle Tree
    • 需要比较分片是否相同时,自根向下的比较两个Merkle Tree的对应节点,可以快速发现并定位差异所在

7,成员信息及故障检测

  • 考虑到节点失败无法恢复的情况并不常见,Dynamo加入或离开集群都需要手动通过命令完成;
  • 当有用户请求时,coordinator会发现不可达的节点,并用其他节点代替之,之后开始周期性探测其恢复;
  • Dynamo集群中的每台机器都会维护当前集群的成员及节点不可达等信息,这些信息通过gossip协议广播到整个集群;
  • 客户端可以通过任意一个节点获得并维护这种成员信息,从而精确的找到自己要访问的数据所在。

总结

论文中介绍了Dynamo面对的问题及其解决方案,而对于其中众多的细节还需要在工程实现中权衡和优化。包括Dynamo中冲突的处理方式,对大多数业务场景来说可能都是无法接受的。

http://blog.csdn.net/anderscloud/article/details/7179107

Dynamo论文介绍的更多相关文章

  1. 物体的三维识别与6D位姿估计:PPF系列论文介绍(三)

    作者:仲夏夜之星 Date:2020-04-08 来源:物体的三维识别与6D位姿估计:PPF系列论文介绍(三) 文章“A Method for 6D Pose Estimation of Free-F ...

  2. CVPR2020论文介绍: 3D 目标检测高效算法

    CVPR2020论文介绍: 3D 目标检测高效算法 CVPR 2020: Structure Aware Single-Stage 3D Object Detection from Point Clo ...

  3. Raft协议--中文论文介绍

    本篇博客为著名的 RAFT 一致性算法论文的中文翻译,论文名为<In search of an Understandable Consensus Algorithm (Extended Vers ...

  4. PointCloud及其经典论文介绍

    这篇博客会介绍点云的基本知识,重点介绍最近两年发表的部分经典论文,有什么建议欢迎留言! 点云基本介绍 点云是某个坐标系下的点的数据集,包含了丰富的信息,可以是三维坐标X,Y,Z.颜色.强度值.时间等等 ...

  5. Amazon Dynamo论文学习

    Dynamo是一个key-value数据存储系统,去中心化.高可扩展.高可用,使用一致性哈希来分区和备份数据,使用数据版本化来实现一致性. 核心技术 CAP:一致性.可用性.扩展性 一致性哈希:切分数 ...

  6. 『TensorFlow』SSD源码学习_其一:论文及开源项目文档介绍

    一.论文介绍 读论文系列:Object Detection ECCV2016 SSD 一句话概括:SSD就是关于类别的多尺度RPN网络 基本思路: 基础网络后接多层feature map 多层feat ...

  7. 《wifi加密破解论文》翻译介绍-wifi不再安全

    前言 wifi的加密协议WPA2已经被破解,影响范围包括所有支持wifi的设备,包括Android,Linux,Apple,Windows,OpenBSD,联发科技,Linksys等.其中对Andro ...

  8. 胖子哥的大数据之路(6)- NoSQL生态圈全景介绍

    引言: NoSQL高级培训课程的基础理论篇的部分课件,是从一本英文原著中做的摘选,中文部分参考自互联网.给大家分享. 正文:  The NoSQL Ecosystem 目录 The NoSQL Eco ...

  9. NoSQL数据库介绍(4)

    4 键/值存储      讨论了经常使用的概念.技术和模式后.第一类NoSQL数据存储会在本章进行研究. 键/值存储通常有一个简单的数据模型:一个map/dictionary,同意客户按键来存放和请求 ...

随机推荐

  1. delphi -----获取计算IP

    function GetHostName:String; var ComputerName: ..MAX_COMPUTERNAME_LENGTH+] of char; Size: Cardinal; ...

  2. Android 短信箱操作

    package blackice.android.product; import java.sql.Date; import java.text.SimpleDateFormat; import ja ...

  3. 【转】Startssl SSL 证书申请图解

    一.什么是 SSL 证书,什么是 HTTPS 网站? SSL证书是数字证书的一种,类似于驾驶证.护照和营业执照的电子副本.SSL证书通过在客户端浏览器和Web服务器之间建立一条SSL安全通道(Secu ...

  4. 实践中需要了解的cpu特性

    目录 分段机制 特权级检查 GDT和LDT 堆栈切换 分页机制 中断 分段机制 实模式中cs是一个实实在在的段首地址,ip为cs所指向段的偏移,所以cs<<4+ip是当前cpu执行的指令. ...

  5. Django的模型层(2)- 多表操作(上)

    一.创建模型 例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对一(on ...

  6. Spring-Hello World实例

    Spring Hello World实例 创建Java项目 添加Jar包 创建源文件 现在在Spring项目下创建实际的源文件.首先,要创建一个名为com.tuorialsponit的包,然后在该co ...

  7. linux一路填坑...

    1.安装ubuntu 从ubuntu9.0开始,一路更新,越来越垃圾,更可恶的是工作上经常指定特定的版本,于是乎,我电脑里装了n个版本的ubuntu. Win7 + Ubuntu 15.10 1)装完 ...

  8. maven 不打包hbm 问题

    <build> <resources> <resource> <directory>src/main/java</directory> &l ...

  9. selet2使用大全

    selet2是一款input+selet结合的组件,是最好的搜索下拉框,没有之一.原因是别的没有,只有它这么一家,你没得选择.正如有人说它‘Select2不是特别好用,但又找不到比它更好的下拉框插件. ...

  10. 一个linux命令(6/13):traceroute命令

    通过traceroute 我们可以知道信息从你的计算机到互联网另一端的主机是走的什么路径.当然每次数据包由某一同样的出发点(source)到达某一同样的目的地(destination)走的路径可能会不 ...