女主宣言

Dynamo 是一个去中心化的k-v存储系统,它的定位是high availability,无论是任何时候提供能够读写的服务。07年至今,4000+ citation,被无数的人所关注,时间已经证明,dynamo是分布式存储系统中的一篇经典论文。本文将带你解读dynamo。

PS:丰富的一线技术、多元化的表现形式,尽在“HULK一线技术杂谈”,点关注哦!

Dynamo

Dynamo 是一个去中心化的k-v存储系统,它的定位是high availability,无论是任何时候提供能够读写的服务。对于一致性,dynamo提供最终一致性,本文中也提到,在极少数情况下会出现一数据多版本的情况,dynamo会返回给上层处理。尽管dynamo不完美,但是对于去中心化系统的优化值得好好研读。正如文中所说

07年至今,4000+ citation,被无数的人所关注,时间已经证明,dynamo是分布式存储系统中的一篇经典论文。

定位

  1. 简单的k-v接口,没有提供多数据结构的接口,最适用的场景是小objects(usually less then 1 MB)场景。

  2. 适用于弱一致性要求的业务,不支持事物。

  3. 可以满足99.9%的强时延请求。

  4. 没有做安全方面的需求。

整体来说本文主要考虑如何解决如何实现高可用的k-v存储,即使网络分割(network partitions)或者服务器down掉,依然能够提供存储服务。为了实现always available,论文解决了如下问题:

1

Partitioning

为了实现便于扩展的特性,dynamo 选择了一致性哈希,但是由于一致性哈希负载不平衡的问题,这里引入了虚拟节点(virtual node)。

一致性哈希中将哈希空间均匀哈希成多个token,这些token头尾相连组成一个环。然后将节点随机到哈希到环上的不同位置。

可以看出当前的节点分布并不均匀,例如A节点负责(B, A] 的哈希范围,B节点负责(C, B]的哈希范围。由于token是均匀分布,(C,B]的范围显然要高于(B,A]的范围,最终大概率为B的负载高于A的负载。

引入虚拟节点之后,每一个物理节点被映射到环上的不同虚拟节点上。

如图A为物理节点,D为物理节点映射出来的虚拟节点。同理,B为物理节点, E为虚拟节点。可以看出每个节点负责的范围相差不大,负载不均衡的情况被有效缓解了。

文中对于dynamo的分片策略进行了进一步的讨论:

此处介绍最优的策略strategy 3。数据空间Q等分,S为系统中拥有的节点数,Q/S为每个节点拥有的分片数目。如果有新节点加入,其将会从其他节点接管分片,如果有节点离开将会把自己的分片交给其他节点负责。

个人理解最初加入了虚拟节点的哈希环上的分片是基本上均匀分布的,节点被哈希到环上的随机位置,但是strategy3中,每个节点负责的分片个数是固定的,但是分片的分布是任意的。这样的做法使得分片的分布更加灵活,对于节点添加删除,可以将整个分片交给任意的节点负责,同时可以保证保证负载的均衡。

2

High Availability for writes

Replica

dynamo对于每一次写命令提供了多副本的策略,每一个key会对应到其coordinator node(负责这个key的节点,通常是物理节点)。然后按照环上的顺序依次找到其顺时针连续的N个节点作为数据副本节点。

图中采用三副本策略N=3,如果B点为coordinator node,C,D就为副本节点。

Replica consistency

对于读写操作,dynamo提供了get() 和set() 操作。为了保证副本的一致性,dynamo提供了一个类似于quorum system的协议。

R: 在一次读中必须参与的最小节点个数

W: 在一次写中必须参与的最小节点个数

N: 副本数

read/write process

读写流程中会先在preference list中找到应该处理该key的coordinator,这个list中的node 会尽量包含物理节点而不是虚拟节点。之后,对于读写流程需要除本节点外读R-1个节点的内容或者等待W-1个节点的写返回。

虽然在2.2中dynamo提出了一种写多副本的策略来保护数据的一致性,然而在一些极端情况下,冲突(版本分歧)还是会出现。本节提供了一种处理分歧的方式。

文中为更好的说明这一现象定义了vector clock

考虑如下场景,clientA写入D1,接下来写入D2 覆盖了D1,然后Sx挂了,clientA写入D3到Sy中。这时候在D3写W-1个副本的时候clientB写入D4到Sz中,这样就发生了分歧。如果有clientC同时读到了D3和D4(w次读),读到的应该是D3和D4的集合,(Sx, 2) (Sy, 1) (Sz, 1) 。如果是client端处理这种分歧的话,client将会把这个数据再写入Sx中完成分歧处理。最终的数据是D5当中的样子。

3

Temporary Failures

对于节点短暂的不可用,dynamo采用了Hinted Handoff的策略,其流程是先将client的request转移到其他的节点B(not coordinator node A),然后等到coordinator node A可用的时候,将之前暂时存在B 点的数据转移到节点A上。A节点接下来继续提供服务。

4

Replica Synchronization

对于永久性离开的节点,dynamo提供了副本同步的机制,可以同步副本之间的数据。为了更快的检查副本之间需要同步的数据,dynamo引入了merkle tree。Merkle tree用来标记每一个node上面对于一段范围的数据是否一样。进而确定需要同步的的数据。但是由于引入了Merkle tree对于节点的加入和删除将会引入大量的Merkle tree重新计算。

5

Failure Detection

dynamo采用了gossip的策略。每个节点都会维护一个完整的环上成员信息(membership information), 该信息的更新就是通过gossip策略将环上的成员信息变化传递到周围节点上。

结束

总而言之,dynamo对于数据分布,容错处理,数据恢复,元信息传递等问题进行了整体的讨论。虽然代码没有开源(很可惜),但是对于稳定运行多年的系统,时间就是检验技术的最好的标准。或许dynamo并不完美,但是dynamo是一个很好的教科书般的无中心节点分布式存储的实践。有时间的小伙伴可以看看原文。希望本文不要误人子弟。

HULK一线技术杂谈

由360云平台团队打造的技术分享公众号,内容涉及云计算、数据库、大数据、监控、泛前端、自动化测试等众多技术领域,通过夯实的技术积累和丰富的一线实战经验,为你带来最有料的技术分享

Dynamo论文导读相关推荐

  1. 关于计算机视觉的那些论文 | CCF推荐论文导读

    目 录 1 Quality Evaluation for Image Retargeting With Instance Semantics 2 PFAN++: Bi-Directional Imag ...

  2. mysql8.0其他机器访问_论文导读|基于机器学习的高速缓存预取

    作者:北京大学杨磊 这篇文章通过机器学习方法预测未来访问来解决LSM-tree存储引擎下的缓存失效问题,目前该论文已经被数据库顶会VLDB2020接收. 问题背景 传统的缓存替换机制,比如LRU.LF ...

  3. 3维线程格 gpu_论文导读 | GPU加速子图同构算法

    GPU加速子图同构算法 作者: 曾立 邹磊 M. Tamer Özsu 胡琳 张藩 论文链接:https://arxiv.org/abs/1906.03420 本次论文讲解的是曾立.邹磊.M. Tam ...

  4. Interactive natural language question answering over knowledge graphs论文导读

    论文导读 目录 Abstract introduction 1 抛砖引的玉(砖见于图谱构建综述吧) 2 现有方法介绍 3 问题驱动 4 挑战与贡献 Interaction approach overv ...

  5. 论文导读:Deep Attentive Learning for Stock Movement Prediction From Social Media Text and Company Correl

    1. Introduction 股票走势受到多方面影响,没有了解相关信息的投资决策会面临金融风险以及金钱损失,而仔细考虑过的投资可以使收益增大.传统的方法依赖于时间序列,以及对股票的分析,比如利用历史 ...

  6. 论文导读 | 基于多臂赌博机(MAB)建模的SimRank计算

    北京大学 刘钰 原文<SimTab: Accuracy-Guaranteed SimRank Queries through TighterConfidence Bounds and Multi ...

  7. Detecting tiny objects in aerial images: A normalized Wasserstein distance and a new benchmark(论文导读)

    A normalized Wasserstein distance and a new benchmark(论文导读) 论文链接 文章目录 A normalized Wasserstein dista ...

  8. Amazon Dynamo论文解读 - Merkle Tree的使用

    Merkle Tree是Dynamo论文中用到的一个算法,读这篇论文前,我并不知道这个算法,所以找了相关资料了解了解,以便我对论文有更进一步的了解.   什么是Merkle Tree    Merkl ...

  9. 【论文导读】2019阿里CTR预估模型---DIEN(深度兴趣演化网络)

    前言 今天分享一篇阿里2019发表在AAAI上的CTR预估的论文<Deep Interest Evolution Network for Click-Through Rate Predictio ...

最新文章

  1. JS基础入门篇(一)
  2. Java实现文件压缩与解压[zip格式,gzip格式]
  3. 有些话不知道怎么说才好
  4. VLC-OFDM系统中一种改进的可变噪声比特功率分配算法
  5. wxWidgets:wxFileName类用法
  6. Riot美术师经验分享:好设计是改出来的
  7. Administrator用户被禁用
  8. 雷林鹏分享:XML 编码
  9. codeforces:65
  10. Let's go home(HDU-1824)
  11. C#常用42个操作类
  12. 2018-1-2Linux基础知识(19)vi编辑器及bash算数
  13. ISSCC 2017论文导读 Session 14 Deep Learning Processors,DNPU: An 8.1TOPS/W Reconfigurable CNN-RNN
  14. 短信验证码的新对手:本机号码校验
  15. 随想录一期 day2 [977.有序数组的平方|209. 长度最小的子数组|59.螺旋矩阵II(剥洋葱)]
  16. CTF比赛工具自收集
  17. CSS砖头盖大楼(一)
  18. python输入一个三位整数、输出三位数之和_编写程序,从键盘输入一个3位的正整数,输出它的百位数,十位数和个位数,并且计算它的和...
  19. IDEA 统计Statistic插件下载地址
  20. google pixel 手机使用magisk获取root权限

热门文章

  1. explicitWidth与width,和用setActualSize()方法有什么区别?
  2. Struts2之数据标签(一)
  3. SpringCloud微服务注册调用入门-断路器
  4. 初识贪心——调度问题
  5. Java默认值规则——各种数据类型的初试值是什么?
  6. macbook air可以运行c语言吗,新 MacBook Air 现场上手:它让 MacBook 变得有点尴尬了...
  7. linux挂载华为存储fc,linux 挂载存储设备
  8. php 5.2.6升级,Centos5.5 简单方法升级php到php5.2.6
  9. mysql hdfs_MySQL数据库与HDFS的实时数据同步
  10. 登录与注册 艺术与业务 的结合