转自:http://blog.jqian.net/post/dynamo.html

Dynamo是Amazon开发的一款高可用的分布式KV系统,已经在Amazon商店的后端存储有很成熟的应用。它的特点:总是可写(500+ per sec, 99.9% <300ms),并且可以根据需求优化配置(调整RWN模型)。

根据CAP原则 (Consistency, Availability, Partition tolerance),Dynamo是一个AP系统,只保证最终一致性。

Dynamo的三个主要概念:

  • Key-Value:Key用来唯一标识一个数据对象,Value标识数据对象具体内容,只能通过Key对该对象进行读写操作。
  • 节点(node):指一台物理主机。主要有 协调请求(request coordination)、成员及故障检测(membership and failure detection) 和 本地持久化(local persistence engine) 三大功能组件,底层的数据持久化存储一般使用Berkeley DB TDS。
  • 实例(instance):每个实例由一组节点组成,从应用层看,实例提供IO功能。实例上的节点可以位于不同IDC以保证容灾。

数据分区(Partition)

分布式系统中 数据分区 是个重要话题,Dynamo使用了Consistent Hash的变种,增加了虚节点的概念。这样一个实际的物理节点会分布到环上的成百上千个虚节点上。这样的好处在于:

  • 如果一个节点不可用(故障或者维护),该节点的负载可以均匀的分散到其他可用节点上;
  • 如果一个节点重新可用,或者新加入一个节点,新增节点可以接受到和原来节点大致相同的请求量;
  • 虚节点的数目可以根据物理机器的容量调整,以保证不容量的机型达到相应的负载。

数据复制(Replication)

为了高可用性,Dynamo同样使用副本,默认副本数为3。Dynamo里复制副本很简单,当Key通过Consistent Hash散列到节点A上后,节点A的协调器(coordinator)会把该份数据自动复制到顺时针方向紧邻它的N-1个节点上,其中N是副本数。

数据版本(Data Versioning)

由于存在多副本,在没有达到最终一致性之前,对每个副本的写操作Dynamo是接受的,它的做法是标记一个版本号,这会导致系统中同一时间出现同一数据对象的多个版本。当然,这种做法比较适合Amazon自己的购物车应用,以便保证每次用户对购物车的更改都是可以保留下来。

在多数情况下,新版本会包含老版本,且系统自己就能协调(syntactic reconciliation)决定最终版本。但用过版本管理系统的人都知道,版本冲突是不可避免的,Dynamo也会遇到这种情况,此时需要交由应用层来协调,将多个分支的数据强行合并(collapse)一个版本。这种版本协调的结果,对于购物车应用来说,添加的商品不会丢失,但是删除的商品有可能出现,对于购物车场景来说是可以接受的。

Dynamo使用向量时钟(Vector Clock)来做版本控制,以合并冲突。

读写操作

Dynamo是一个高可用性系统,任何节点可以在任何时刻(failure-free)接受应用层的读写操作。但由于有多副本,读写操作就涉及数据一致性问题。为了解决该问题,Dynamo使用了类似法定仲裁Quorum)的一致性协议。

Quroum协议有两个个配置项:

  • R 一次成功读操作中最少参与的节点数目
  • W 一次成功写操作中最少参与的节点数目

Quorum是说要保证:W+R > N,相当于 写成功需要的副本数 + 读成功需要的副本数 > 副本总数,则能保证最终一致性。官方建议(N, R, W) = (3, 2, 2)以兼顾AP。

故障处理(Hinted handoff)

在一个节点出现临时性故障时,数据会自动进入列表中的下一个节点进行写操作,并标记为handoff数据,在收到通知需要原节点恢复时重新把数据推回去。这能使系统的写入成功大大提升。

处理永久故障(Replica synchronization)

为了更快的检测副本之间是否不一致,Dynamo使用MerkleTree。MerkleTree是一个hash值构成的树,每个叶子节点是Key的hash值,然后中间节点是所有儿子节点的hash值,这样每个子节点的变动都会反应到上层父节点。使用MerkleTree为数据建立索引,只要任意数据有变动,都将快速反馈出来,可以提速数据变动时的查找。这一技术在torrent p2p传输中早有普及。

成员和故障检测

Gossip是一种去中心化的通讯协议,通常被用在分布式的非强一致性系统中,用来同步各节点状态。具体做法是,在一个有界网络中,每个节点会 周期性的 随机的 发起Gossip会话,经过多轮通信后,最终所有节点状态会达成一致。它可以用来发现成员,也可以用来故障检测。

Gossip有多种具体实现,Daynamo中使用的是Anti-entropy实现。

据说早期Dynamo的做法类似corosync,是在每台节点上维护一个全部节点状态的全局视图。

参考:

  • Amazon's Dynamo

转载于:https://www.cnblogs.com/bonelee/p/6255202.html

Dynamo分布式系统——「RWN」协议解决多备份数据如何读写来保证数据一致性,而「向量时钟」来保证当读取到多个备份数据的时候,如何判断哪些数据是最新的这种情况...相关推荐

  1. Dynamo涉及的算法和协议——p2p架构,一致性hash容错+gossip协议获取集群状态+向量时钟同步数据...

    转自:http://www.letiantian.me/2014-06-16-dynamo-algorithm-protocol/ Dynamo是Amazon的一个分布式的键值系统,P2P架构,没有主 ...

  2. 我们该如何应对「竞业协议」?

    直播主题 我们该如何应对「竞业协议」? 主讲嘉宾 陆阳 毕业于北京大学法学院,曾先后任职于华为技术有限公司.北京中伦文德律师事务所.毕马威企业咨询有限公司南京分公司,现任职于北京德恒(苏州)律师事务所 ...

  3. Idea突然遇到「Cannot access com...class」无法解决

    Idea突然遇到「Cannot access com-class」无法解决 原因 在利用Idea开发过程中,rename class实体类,并更改了class实体类package包的位置. 「req」 ...

  4. AI人才「用工荒」如何解决?看看这几家顶级公司的应对策略

    https://www.toutiao.com/a6652650197727838734/ 2019-01-31 21:20:27 作者 | Tom Taulli 来源 | Forbes 编译 | 太 ...

  5. 串口调试助手源代码 qt编写 带协议解析 帧判断 通信数据保存等功能

    串口调试助手源代码 qt编写 带协议解析 帧判断 通信数据保存等功能 使用说明介绍 1.功能介绍: 采用Qt编写的串口调试助手工具,功能齐全,除了具备十六进制收发及文件保存等基本功能外,还具有以下功能 ...

  6. ps错误提示50「脚本错误-50功能不可用」的解决方法

    (ps2022)支持m1 V23.2.2:https://www.mac69.com/mac/14433.html?id=MzM1NzQ%3D ps处理图片时弹出「脚本错误-50出现一般Photosh ...

  7. 分布式系统中的一致性协议

    本文详细介绍目前分布式系统中常见的一些一致性协议:两阶段提交协议,三阶段提交协议,向量时钟,RWN协议,paxos协议,Raft协议.下面就一个个详细讲解下. 一. 两阶段提交协议(2PC) 两阶段提 ...

  8. NoSQL生态系统——一致性RWN协议,向量时钟,gossip协议监测故障

    13.5 一致性 在NoSQL中,通常有两个层次的一致性:第一种是强一致性,既集群中的所有机器状态同步保持一致.第二种是最终一致性,既可以允许短暂的数据不一致,但数据最终会保持一致.我们先来讲一下,在 ...

  9. http协议解决粘包拆包半包 的编码解码过程、 以及netty 使用http协议的原理

    本文主要介绍netty对http协议解析原理,着重讲解keep-alive,gzip,truncked等机制,详细描述了netty如何实现对http解析的高性能. 1 http协议 1.1 描述 标示 ...

最新文章

  1. 深入浅出的讲解傅里叶变换(完整)
  2. 2.3.8 吸烟者问题
  3. 在狮驼岭,孙悟空救了猪八戒,猪八戒为何不帮孙悟空?
  4. 从键盘输入一个正整数(不多于5位),计算该正整数与789之和(记为sum)
  5. ReviewForJob——二叉堆优先队列的实现(三种堆节点类型——int + struct HeapNode + struct HeapNode*)
  6. 后台返回数据打印是[object object]的,报错:SyntaxError: JSON.parse: expected property name or ‘}‘ at line 1 column
  7. nodejs express
  8. 调整谷歌reCAPTCHA大小 How to resize the Google noCAPTCHA reCAPTCHA
  9. spring和jdbctemplate
  10. java 大文件上传_JAVA大文件上传分片上传方法(附带demo)
  11. VB小程序:生成十个不重复的随机数
  12. Win10 dell驱动触摸板安装
  13. python处理word文档中的某页_Python快速设置Word文件中指定段落为目录标题
  14. 微信小程序开发(2) - 微信小程序实现拍照和录像拍摄功能方法
  15. 【Kubernetes】k8s的安全管理详细说明【k8s框架说明、token验证和kubeconfig验证详细说明】
  16. 户外风景拍摄自然风光摄影网站搭建模板
  17. 常见音频文件格式的特点。
  18. macbook卡在进度条开不了机_苹果电脑开机一直停留在加载进度条当中是怎么回事...
  19. 王者荣耀关注显示服务器忙,王者荣耀不满足参加该活动的条件 访问繁忙解决方法...
  20. STD: Sparse-to-Dense 3D Object Detector for Point Cloud 阅读笔记

热门文章

  1. gdb coredump
  2. linux qt检测u盘热插拔,【QT】动态监测U盘插拔
  3. 用netty实现zcool_《Netty官方指南》把Netty当做一个通用的库
  4. java月份列表_java – 如何获取两个日期之间的月份和年份列表
  5. 计算机二级msoffice操作题如何评分,2017年计算机二级MSOffice操作题及答案解析
  6. 计算机与十进制 教案,二进制与十进制间的转换教案
  7. oracle正则表达式截断,在oracle中使用正则表达式截取字符串
  8. 3D溜溜网站用的是php吗_浩辰3D软件中全面的阵列特征你会用吗?快来看看吧
  9. 【PL/SQL的优点】
  10. linux 调试引导程序,c-调试syslinux看到的引导文件系统环境?