Amazon Dynamo学习总结

目录

一、Amazon Dynamo的问世

二、Amazon Dynamo主要技术概要

三、数据划分算法

四、数据复制

五、版本控制

六、故障处理

七、成员和故障检测


一、Amazon Dynamo的问世

Amazon Dynamo是由亚马逊在2007年开发的一种高度可扩展和分布式的键值存储系统,旨在解决公司面临的大规模、任务关键型服务的需求。其起源于亚马逊早期在运营电子商务业务时遇到的挑战,传统的关系型数据库无法满足其大规模、高可用性和分布式存储的需求。因此,亚马逊的工程团队开始寻找一种新的存储解决方案。Amazon Dynamo采用了分布式架构和键值存储模型,实现了高度的可扩展性、灵活性和可定制性,成为许多大型互联网公司处理大规模数据存储和访问的首选解决方案之一。

二、Amazon Dynamo主要技术概要

Amazon Dynamo是亚马逊公司基于分布式环境下的数据存储需求所开发的一套高度可靠、高性能的分布式存储系统。其设计和实现基于一系列关键技术,这些技术使得Dynamo能够在面对大规模的数据存储和处理时保持高可用性、一致性和可扩展性。其中包括数据划分、数据复制、数据读写操作、版本控制、故障处理以及成员和故障检测等关键技术,具体可见以下表格:

技术描述作用
数据划分利用一致性哈希算法将数据划分成多个分区,实现数据的分布式存储和处理,提高可扩展性和性能。分布数据以实现增量可扩展性。
数据复制将每个分区中的数据复制到多个节点上,提高容错性和可用性。使用NWR机制确定复制数量和一致性要求。提高系统的容错性和可用性,确保数据的一致性。
数据读写操作使用get和put操作实现数据的读取和写入,保证数据的一致性和可靠性。在写入时使用NWR机制确定写入的副本数,在读取时使用R参数指定读取的副本数。确保数据的一致性和可靠性。
版本控制使用向量时钟解决多副本之间的冲突,记录每个数据项的更新历史,帮助判断不同副本之间的数据版本关系。解决多副本冲突,确保数据的一致性。
故障处理采用暗示移交处理暂时性节点故障,将数据暂存于其他节点,故障恢复后将数据传递给正确节点。对于永久性故障,使用反熵机制确保副本一致性。处理节点故障,确保数据的一致性和可用性。
成员和故障检测使用Gossip协议进行成员和故障检测,定期通信维护成员列表,监测节点状态变化,保持系统稳定性和可用性。检测节点状态变化,保持系统稳定性和可用性。

三、数据划分算法

在一致性哈希算法的基础上,Dynamo引入了虚拟节点的概念作为其分区方案的变体。在传统的一致性哈希算法中,每个节点只负责环中一个点的区域,这可能导致负载分布不均匀以及忽略了节点性能的异质性。因此,Dynamo将每个节点分配到环中的多个点,即虚拟节点。

具体来说,当一个新节点加入系统时,它会被分配多个虚拟节点,每个虚拟节点在环上占据不同的位置。这些虚拟节点的数量可以根据节点的容量和性能来调整。当节点不可用时,其负载将被均匀地分布到其他可用节点上,从而保持系统的稳定性和可用性。而当节点再次可用或新节点加入系统时,负载将会平均地分布到所有可用节点上,确保了系统的负载均衡。

虚拟节点的引入使得Dynamo能够更好地适应节点动态变化、负载均衡和异质性的情况,从而提高了系统的稳定性和可扩展性。通过调整节点负责的虚拟节点数量,可以更灵活地适应不同的物理基础架构和节点容量,进一步优化系统的性能和资源利用率。

如上图所示为一致性哈希采取的环形存储,箭头表示key计算出的值得分布。A,B,C是三个不同的节点,策略1是随机计算T个值并存储,策略2是随机计算并等分存储,而策略3则是有规律的计算并存储。Dynamo通过测试发现策略3相对来说有着最佳的负载均衡率,而策略2最差。具体测试结果如下图所示:

四、数据复制

在Dynamo中,为了实现高可用性和持久性,数据被复制到多个主机上。每个数据项都会在N个主机上进行复制,其中N是根据系统配置的参数确定的。每个数据项都被分配给一个协调器节点,该节点负责管理其范围内的数据复制。除了在本地存储数据之外,协调器还会将数据复制到环上N-1个顺时针后续节点上。这样,每个节点负责管理它和它的第N个前身之间的环的区域。

负责存储特定密钥的节点列表称为首选节点列表。为了应对节点故障,首选列表包含了N个以上的节点。需要注意的是,由于使用了虚拟节点,特定密钥的前N个后续位置可能由少于N个不同的物理节点拥有。为了解决这个问题,首选列表会跳过环中的位置,以确保列表中包含的节点是不同的物理节点。五、数据读写操作

  • 对于PUT操作,协调员首先生成新的数据版本和向量时钟分量,然后将新数据保存到本地。接着,协调员将写入请求发送给首选列表中的所有节点,并在收到足够数量的确认后向用户返回成功。
  • 对于GET操作,协调员向首选列表中的所有节点请求数据版本,等待足够数量的回复后,通过向量时钟处理有因果关系的数据版本,并将存在冲突的数据版本返回给用户。

在这个过程中,协调员起着关键的作用,通常是首选列表中的前N个节点中的第一个。如果请求是通过负载平衡器收到的,请求可能会被路由到环上的任何随机节点。在这种情况下,如果接收到请求的节点不是首选列表中的前N个节点之一,它将不会协调处理请求,而是将请求转发到首选列表中的第一个节点。

在Amazon Dynamo中,为了确保副本的一致性,采用了一种类似仲裁系统的一致性协议。这个协议涉及两个配置参数R和W,它们分别代表执行一次读取操作和写入操作所需的最少投票者数量。具体来说:

  • R(Read Quorum):R参数表示执行一次读取操作所需的最少投票者数量。当客户端发起读取操作时,需要至少从R个副本中读取数据。只有当至少从R个副本中读取到数据时,读取操作才被视为成功。

  • W(Write Quorum):W参数表示执行一次写入操作所需的最少投票者数量。当客户端发起写入操作时,需要向至少W个副本写入数据。只有当至少有W个副本成功写入数据后,写入操作才被视为成功。

在设置R和W时,必须满足R + W > N的条件,其中N是系统中总副本的数量。这个条件确保了一致性协议的正确执行。通过设置R和W参数,可以灵活地平衡一致性和可用性之间的关系。增加R和W的值可以提高一致性,但可能会增加操作的延迟,因为需要等待更多的节点响应。相反,减少R和W的值可以降低延迟,但可能会降低一致性。因此,在实际应用中,需要根据系统的需求和性能目标来选择适当的R和W值。

五、版本控制

在Dynamo中,向量时钟被用来捕捉同一对象的不同版本之间的因果关系。向量时钟实际上是一个(node, counter)对列表,与每个对象的每个版本相关联。通过检查向量时钟,我们可以确定一个对象的两个版本是平行分支还是有因果顺序。如果第一个时钟对象上的计数器在第二个时钟对象上小于或等于其他所有节点的计数器,那么第一个版本是第二个版本的祖先,可以被忽略。否则,这两个变化被认为是冲突的,并需要进行语义上的协调。

在Dynamo中,当客户端更新一个对象时,它必须指定要更新的版本(这是通过传递从早期读操作中获得的上下文对象来指定的,其中包含向量时钟信息)。当处理读请求时,如果Dynamo访问到多个无法语法协调的分支,它将返回分支叶子上的所有对象,以及它们对应的上下文版本信息。使用此上下文的更新操作将被认为是对前述不同版本更新操作的语义上的协调,其分支已收缩到一个新版本上。

为了说明使用向量时钟,考虑上图所示的例子:

  • 客户端写入一个新的对象。节点(比如说Sx),它处理对这个key的写:序列号递增,并用它来创建数据的向量时钟。该系统现在有对象D1和其相关的时钟[(Sx,1)]。
  • 客户端更新该对象。假定也由同样的节点处理这个要求。现在该系统有对象D2和其相关的时钟[(Sx,2)]。D2继承自D1,因此覆盖D1,但是其他节点中或许存在还没有看到D2版本的副本。
  • 让我们假设,同样的客户端更新这个对象但不同的服务器(比如Sy)处理了该请求。目前该系统具有数据D3及其相关的时钟[(Sx,2),(Sy,1)]。
  • 接下来假设不同的客户端读取D2,然后尝试更新它,并且另一个服务器节点(如Sz)进行写操作。该系统现在具有D4(D2的子孙),其版本时钟[(Sx,2),(Sz,1)]。
  • 一个对D1或D2有所了解的节点可以决定,在收到D4和它的时钟时,新的数据将覆盖D1和D2,可以被垃圾收集。一个对D3有所了解的节点,在接收D4时将会发现,它们之间不存在因果关系。换句话说,D3和D4都有更新操作,但都未在对方的变化中反映出来。这两个版本的数据都必须保持并提交给客户端(在读时)进行语义协调。
  • 现在假定一些客户端同时读取到D3和D4(上下文将会反映出这两个值是由read操作发现的)。读的上下文包含有D3和D4时钟的概要信息,即[(Sx,2),(Sy,1),(Sz,1)]的时钟总结。如果客户端执行协调,且由节点Sx来协调这个写操作,Sx将更新其时钟的序列号。D5的新数据将有以下时钟:[(Sx,3),(Sy,1),(Sz,1)]。

六、故障处理

故障处理在Dynamo中是一个关键的组成部分,用于处理临时性和永久性的节点故障。

对于临时性节点故障,Dynamo采用了暗示移交的机制。当一个节点出现暂时性故障时,例如由于网络中断或节点故障,Dynamo会将数据暂时存储在其他节点上,而不是立即将其丢弃。这些节点被称为“暗示”节点,它们临时承担了故障节点的数据负载。一旦故障节点恢复正常,暗示节点会将暂存的数据传递回故障节点,以确保数据的完整性和一致性。

对于永久性节点故障,Dynamo使用反熵机制来确保副本之间的一致性。这种机制涉及到周期性地比较和同步不同副本之间的数据。通过使用反熵机制,Dynamo可以快速检测到数据不一致的情况,并采取相应的措施来修复数据,从而确保系统的稳定性和可用性。

七、成员和故障检测

成员和故障检测在Dynamo中是通过Gossip协议实现的。Gossip协议是一种去中心化的通信协议,用于在分布式系统中进行成员和故障检测。Dynamo中的每个节点都定期与其他节点进行通信,交换有关成员状态和故障信息的信息。通过这种定期的通信,节点可以维护一个成员列表,并监测节点状态的变化。

具体而言,每个节点会周期性地向一组其他节点发送消息,告知它们自己的状态和可用性情况,并接收其他节点发送的类似信息。这些消息在整个系统中通过网络传播,并且被节点逐步接收和处理。通过这种方式,每个节点可以获取关于整个系统状态的信息,并且及时检测到其他节点的加入、离开或故障。

使用Gossip协议进行成员和故障检测具有以下优点:

  1. 去中心化:没有单一的中心节点负责管理成员和故障检测,而是每个节点都参与其中,从而提高了系统的稳定性和可用性。

  2. 实时性:节点之间定期通信,信息可以快速传播,从而及时检测到节点状态的变化。

  3. 容错性:即使部分节点无法正常工作,也不会影响整个系统的运行,因为其他节点仍然可以通过Gossip协议进行通信和检测。

通过使用Gossip协议,Dynamo可以确保成员列表的及时更新和节点状态的实时监测,从而保持系统的稳定性和可用性。

推荐阅读:

重读 Amazon Dynamo 论文有感 - 知乎

https://www.cnblogs.com/xybaby/p/13944662.html

Amazon Dynamo论文解读 — Dynamo数据划分算法 - CodeAntenna

《Dynamo》论文笔记 | 水木今山的博客

Dynamo:亚马逊的高可用键值存储_dynamo文件系统,使用哪个技术实现了版本控制-CSDN博客

分布式存储系统学习笔记(三)—分布式键值系统(1)—Amazon Dynamo_amazon s3 dynamo 哈希-CSDN博客

阅读笔记(十六)高可用KV数据存储Dynamo实现细节《Dynamo: Amazon’s Highly Available Key-value Store》_亚马逊 kv数据库-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/381101.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Python的HTTP隧道安全性分析:魔法背后的锁与钥匙

当我们谈论基于Python的HTTP隧道时,不禁让人想起那些神秘的魔法门。但是,在魔法背后,我们也需要确保安全性,就像需要确保魔法不会落入邪恶之手一样。那么,基于Python的HTTP隧道在安全性方面表现如何呢?让我…

JPEG图像格式加速神经网络训练--使用DCT训练CNN

JPEG图像格式加速神经网络训练 JPEG图像格式加速神经网络训练工作原理DCT系数与JPEG直接利用DCT系数阶段 1: 数据准备步骤 1: 读取JPEG文件结构步骤 2: 提取量化表和Huffman表步骤 3: 解析图像数据步骤 4: 反量化步骤 5: 获取DCT系数 阶段 2: 输入处理预处理 1: 正规化&#xf…

轻薄型工业平板亿道EM-T195,续航持久高达10小时

时尚而坚固的 10.1英寸EM-T195触摸屏平板电脑融合了高耐力和无与伦比的适应性,可抵御极端天气条件和多重冲击,借助强大的联发科8核处理器,它可以从容面对任何工作挑战。 其读取能力(2D 成像器)结合其坚固性&#xff0…

波奇学Linux: 文件描述符

文件和操作系统的关系 操作系统控制进程,文件的打开是在进程中进行。意味着用来控制进程的PCB必然有文件的信息,操作系统通过控制PCB的信息来控制文件的读写。 Q1:如何证明文件打开是在进程中进行? 编写c文件调用fopen来操作文件…

数据结构——单向链表和双向链表的实现(C语言版)

目录 前言 1. 链表 1.1 链表的概念及结构 1.2 链表的分类 2. 单链表接口实现 2.1 数据结构设计与接口函数声明 2.2 创建结点,打印,查找 2.3 尾插,头插,尾删,头删 2.4 插入或删除 2.4.1在指定位置后 2.4.2在…

OpenCV-34 顶帽操作和黑帽操作

一、顶帽操作(TOPHAT) 顶帽 原图 - 开运算 开运算的效果是去除图像外的噪点,因此原图 - 开运算就得到了去掉的噪点。 通过API --- morphologyEx(img, MORPH_TOPHAT, kernel) 示例代码如下&…

C++基础知识点预览

一.绪论: 1.1 C简史: 与C的关系: 被设计为C语言的继任者,C语言是一种过程型语言,程序员使用它定义执行特定操作的函数,而C是一种面向对象的语言,实现了继承、抽象、多态和封装等概念。C支持类&…

Spring Boot 笔记 004 自动配置和自定义starter

003讲到了导入jar包中的方法,但其实是个半成品,别人写的jar包中的方法我要在自己的代码中去调用,非常的不方便。原则上写给别人用的jar包,人家要能直接用,而不用写注入的方法。 在springboot中会自动扫描imports文件中…

【FFmpeg】ffplay 命令行参数 ⑤ ( 设置音频滤镜 -af 参数 | 设置统计信息 -stats 参数 | 设置同步时钟类型 -sync 参数 )

文章目录 一、ffplay 命令行参数 - 音频滤镜1、设置音频滤镜 -af 参数2、常用的 音频滤镜 参数3、音频滤镜链 示例 二、ffplay 命令行参数 - 统计信息1、设置统计信息 -stats 参数2、关闭统计信息 -nostats 参数 三、ffplay 命令行参数 - 同步时钟类型1、设置同步时钟类型 -syn…

从Socket中解析Http协议实现通信

在网络协议中,Socket是连接应用层和运输层的中间层,主要作用为了通信。Http协议是应用层上的封装协议。我们可以通过Http协议的规范解析Socket中数据,完成Http通信。 首先,我们先回顾一下Http协议的规范。主要复习一下&#xff0c…

YOLOv8改进 | 检测头篇 | 独创RFAHead检测头超分辨率重构检测头(适用Pose、分割、目标检测)

一、本文介绍 本文给大家带来的改进机制是RFAHead,该检测头为我独家全网首发,本文主要利用将空间注意力机制与卷积操作相结合的卷积RFAConv来优化检测头,其核心在于优化卷积核的工作方式,特别是在处理感受野内的空间特征时。RFAConv主要的优点就是增加模型的特征提取能力,…

【web前端开发】HTML及CSS简单页面布局练习

案例一 网页课程 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-wi…

Linux中ps/kill/execl的使用

ps命令&#xff1a; ps -aus或者ps -ajx或者 ps -ef可以查看有哪些进程。加上 | grep "xxx" 可以查看名为”xxx"的进程。 ps -aus | grep "xxx" kill命令&#xff1a; kill -9 pid 杀死某个进程 kill -l 查看系统有哪些信号 execl函数&#…

在Ubuntu上部署Stable Video Diffusion动画制作

Stable Diffusion团队推出的开源模型Stable Video Diffusion&#xff0c;支持生成约3秒的视频&#xff0c;分辨率为5761024。通过测试视频展示了其令人瞩目的性能&#xff0c;SVD模型是一个生成图像到视频的扩散模型&#xff0c;通过对静止图像的条件化生成短视频。其特点主要包…

Vue源码系列讲解——虚拟DOM篇【三】(更新子节点)

1. 前言 在上一篇文章中&#xff0c;我们了解了Vue中的patch过程&#xff0c;即DOM-Diff算法。并且知道了在patch过程中基本会干三件事&#xff0c;分别是&#xff1a;创建节点&#xff0c;删除节点和更新节点。创建节点和删除节点都比较简单&#xff0c;而更新节点因为要处理…

使用cocos2d-console初始化一个项目

先下载好cocos2d-x的源码包 地址 https://www.cocos.com/cocos2dx-download 这里使用的版本是 自己的电脑要先装好python27 用python安装cocos2d-console 看到项目中有个setup.py的一个文件 python setup.py 用上面的命令执行一下。 如果执行正常的话回出现上面的图 然后…

教师如何找答案? #知识分享#职场发展

当今社会&#xff0c;随着信息技术的迅猛发展&#xff0c;大学生们在学习过程中面临着各种各样的困难和挑战。而在这些挑战中&#xff0c;面对繁重的作业和复杂的题目&#xff0c;大学生搜题软件应运而生 1.快解题 这是一个网站 是一款服务于职业考证的考试搜题软件,拥有几千…

CVE-2018-19518 漏洞复现

CVE-2018-19518 漏洞介绍 IMAP协议&#xff08;因特网消息访问协议&#xff09;它的主要作用是邮件客户端可以通过这种协议从邮件服务器上获取邮件的信息&#xff0c;下载邮件等。它运行在TCP/IP协议之上&#xff0c;使用的端口是143。在php中调用的是imap_open函数。 PHP 的…

特征工程:数据平衡

目录 一、前言 二、正文 Ⅰ.基于过采样算法 Ⅱ.基于欠采样算法 Ⅲ..基于过采样和欠采样的综合算法 三、结语 一、前言 大多数情况下&#xff0c;使用的数据集是不完美的&#xff0c;会出现各种各样的问题&#xff0c;尤其针对分类问题的时候&#xff0c;会出现类别不平衡的…

可达鸭二月月赛——基础赛第六场(周五)题解,这次四个题的题解都在这一篇文章内,满满干货,含有位运算的详细用法介绍。

姓名 王胤皓 T1 题解 T1 题面 T1 思路 样例输入就是骗人的&#xff0c;其实直接输出就可以了&#xff0c;输出 Hello 2024&#xff0c;注意&#xff0c;中间有一个空格&#xff01; T1 代码 #include<bits/stdc.h> using namespace std; #define ll long long int …