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协议进行成员和故障检测具有以下优点:
-
去中心化:没有单一的中心节点负责管理成员和故障检测,而是每个节点都参与其中,从而提高了系统的稳定性和可用性。
-
实时性:节点之间定期通信,信息可以快速传播,从而及时检测到节点状态的变化。
-
容错性:即使部分节点无法正常工作,也不会影响整个系统的运行,因为其他节点仍然可以通过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博客
相关文章:
Amazon Dynamo学习总结
目录 一、Amazon Dynamo的问世 二、Amazon Dynamo主要技术概要 三、数据划分算法 四、数据复制 五、版本控制 六、故障处理 七、成员和故障检测 一、Amazon Dynamo的问世 Amazon Dynamo是由亚马逊在2007年开发的一种高度可扩展和分布式的键值存储系统,旨在解…...
appium抓包总结
appium抓包总结 背景:有些app通过抓包工具charles等抓不到接口数据,应为这一类抓包工具只能抓到应用层的数据包,而某些app的接口是走的传输层协议,所以此时只能通过AppIUM工具来进行抓包。 1、Appium 是什么? Appium…...
arcgis各种版本下载
arcgic 下载!!! ArcGIS是一款地理信息系统软件,由美国Esri公司开发。它提供了一系列完整的GIS功能,包括地图制作、空间数据管理、空间分析、空间信息整合、发布与共享等。ArcGIS是一个可扩展的GIS平台,提供…...
第五篇:MySQL常见数据类型
MySQL中的数据类型有很多,主要分为三类:数值类型、字符串类型、日期时间类型 三个表格都在此网盘中,需要者可移步自取,如果觉得有帮助希望点个赞~ MySQL常见数据类型表 数值类型 (注:decimal类型举例,如1…...
Oracle用BETWEEN AND查某年的数据可能会丢失条数
随便找一张有日期(字段类型为DATE)的表即可测试。 假设存在这样一张表HOLIDAY,里面存储的是某些国家(表字段为COUNTRY_CODE)某些年的法定假日日期(表字段为HOLIDAY_DATE)。 我想查中国在2023年和2024年的法定假日日期。 BETWEEN AND 首先想…...
Nuscenes数据集点云数据如何转换到图像上
零、概要 注意:该文章是手写ai自动驾驶,Nuscenes数据集的笔记。 首先,学习需要使用到 nuScenes 数据集。python 工具需要使用到 nuscenes-devkit、pyquaternion from nuscenes.nuscenes import NuScenes from pyquaternion import Quatern…...
【C语言期末】商品管理系统
本文资源:https://download.csdn.net/download/weixin_47040861/88820155 1.题目要求 商品管理系统 商品信息包括:包括编号、类别、名称、价格、折扣比例、生产时间 、存货数量等要求:1、信息首先保存在文件中,然后打开文件进行…...
单片机学习笔记---串口通信(2)
目录 串口内部结构 串口相关寄存器 串口控制寄存器SCON SM0和SM1 SM2 REN TB8和RB8 TI和RI 电源控制寄存器PCON SMOD 串口工作方式 方式0 方式0输出: 方式0输入 方式1 方式1输出。 方式1输入 方式2和方式3 方式2和方式3输出: 方式2和…...
【Java】乐观锁有哪些常见实现方式?
Java中的乐观锁主要有两种常见的实现方式: CAS(Compare and Swap):这是实现乐观锁的核心算法。CAS操作包含三个参数:内存地址V、旧的预期值A和要修改的新值B。执行CAS操作时,会先比较内存地址V中的值是否等…...
Javaweb之SpringBootWeb案例之登录校验功能的详细解析
2. 登录校验 2.1 问题分析 我们已经完成了基础登录功能的开发与测试,在我们登录成功后就可以进入到后台管理系统中进行数据的操作。 但是当我们在浏览器中新的页面上输入地址:http://localhost:9528/#/system/dept,发现没有登录仍然可以进…...
CSS之盒模型
盒模型概念 浏览器盒模型(Box Model)是CSS中的基本概念,它描述了元素在布局过程中如何占据空间。盒模型由内容(content)、内边距(padding)、边框(border)、和外边距&…...
博客系统-SpringBoot版本
相比于之前使用Servlet来完成的博客系统,SpringBoot版本的博客系统功能更完善,使用到的技术更接近企业级,快来看看吧~ 目录 1.项目介绍 2.数据库准备 3.实体化类 4.返回格式 5.登录和注册功能 6.登出(注销)功能…...
详细分析Redis中数值乱码的根本原因以及解决方式
目录 前言1. 问题所示2. 原理分析3. 拓展 前言 对于这方面的相关知识推荐阅读: Redis框架从入门到学精(全)Java关于RedisTemplate的使用分析 附代码java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全) …...
网络专栏目录
大家好我是苏麟 , 这是网络专栏目录 . 图解网络 资料来源 : 小林coding 小林官方网站 : 小林coding (xiaolincoding.com) 图解网络目录 基础篇 基础篇 TCP/IP网络模型有几层? : TCP/IP网络模型 键入网址到页面显示,期间发生了什么? : 键入网址到页面显示,期间发生了什么 现阶…...
【Python网络编程之Ping命令的实现】
🚀 作者 :“码上有前” 🚀 文章简介 :Python开发技术 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 Python网络编程之Ping命令的实现 代码见资源,效果图如下一、实验要求二、协议原理2…...
OpenHarmony轻量级驱动开发
OpenHarmony轻量级驱动开发 思维导图: https://download.csdn.net/download/lanlingxueyu/88817155 GPlO(General-purpose input/output)即通用型输入输出 描述 GPlO(General-purpose input/output)即通用型输入输出。通俗地说,GPlO口就是一些引脚可以通过它们输出高低…...
C语言如何输⼊字符数组?
一、问题 在程序中,scanf()函数可以输⼊任意类型的数据,gets()函数只能输⼊字符串等,但是如何更好地输⼊字符数组呢? 二、解答 我们知道如何使⽤格式输⼊函数 scanf(),那么可以使⽤%c 格式符逐个输⼊字符。这样输⼊有…...
人脸追踪案例及机器学习认识
1.人脸追踪机器人初制 用程序控制舵机运动的方法与机械臂项目完全相同。 由于摄像头的安装方式为上下倒转安装,我们在编写程序读取图像时需使用 flip 函数将 图像上下翻转。 现在,只需要使用哈尔特征检测得到人脸在图像中的位置,再指示舵机运…...
鸿蒙开发理论之页面和自定义组件生命周期
1、自定义组件和页面的关系 页面:即应用的UI页面。可以由一个或者多个自定义组件组成,Entry装饰的自定义组件为页面的入口组件,即页面的根节点,一个页面有且仅能有一个Entry。只有被Entry装饰的组件才可以调用页面的生命周期。自…...
docker-compose部署gitlab和jenkins
通过docker-compose部署gitlab和jenkins,方便后续工作 注意: gitlab占用资源较多,最好系统内存在8G以上,CPU4核心以上,否则gitlab有可能报错无法启动。docker版本用最新版本,低版本的docker可能会导致doc…...
OpenClaw技能开发入门:为Qwen3-VL:30B编写图片翻译插件
OpenClaw技能开发入门:为Qwen3-VL:30B编写图片翻译插件 1. 为什么需要自定义技能开发 去年冬天,我接手了一个跨国团队的文档协作项目,每天需要处理大量包含多语言图片的飞书消息。当我在深夜第三次手动将日文截图粘贴到翻译软件时ÿ…...
Comsol流固耦合分析中的达西定律模块与固体力学模块的应用
Comsol流固耦合注浆及冒浆分析 采用其中达西定律模块及固体力学模块,通过建立质量源项、体荷载等实现上述考虑渗流场与结构场流固耦合理论方程的嵌入。在COMSOL里玩流固耦合就像给工程问题装了个动态CT扫描仪。最近在搞注浆冒浆模拟时发现,把达西渗流和固…...
2025夏季技术实习「抢位战」:3步解锁2500+优质机会(附避坑指南)[特殊字符]
2025夏季技术实习「抢位战」:3步解锁2500优质机会(附避坑指南)🔥 【免费下载链接】Summer2026-Internships 2025年夏季技术实习机会集合! 项目地址: https://gitcode.com/GitHub_Trending/su/Summer2026-Internships…...
Scala入门必修课:val与var的深度对比与选择指南
Scala入门必修课:val与var的深度对比与选择指南1. 引言:变量定义的灵魂拷问2. 基础概念:val与var的定义2.1 直观区别2.2 类型推导3. 深入理解:从编译到执行3.1 编译后的字节码差异3.2 内存与性能考量4. 实际应用:选择指…...
这份榜单够用!高效论文写作全流程AI论文软件推荐(2026 最新)
2026年AI论文软件持续升级,论文写作全流程可拆解为文献调研→选题/开题→大纲/初稿→文献综述→降重/去AI味→润色/格式→查重/投稿七大环节,以下工具按环节精准匹配,兼顾中文适配、降重能力、去AI痕迹、学术合规四大核心需求,覆盖…...
Claude Code智能测试生成:5步构建企业级自动化测试体系
Claude Code智能测试生成:5步构建企业级自动化测试体系 【免费下载链接】claude-code Claude Code is an agentic coding tool that lives in your terminal, understands your codebase, and helps you code faster by executing routine tasks, explaining comple…...
为什么流水线ADC能用Dither,而SAR ADC效果差?深入解析两种架构下的Dither技术差异与改进方案
流水线ADC与SAR ADC中Dither技术的差异化设计与工程实践 在高速高精度数据采集系统中,量化噪声的非线性特性始终是困扰设计者的核心难题。当我们用频谱分析仪观察一个理想正弦波经过ADC转换后的输出时,那些突兀的谐波分量往往源自量化过程的非线性失真。…...
Llama-3.2V-11B-cot在智能教育中的应用:数学题配图逻辑漏洞识别实战
Llama-3.2V-11B-cot在智能教育中的应用:数学题配图逻辑漏洞识别实战 1. 引言:当AI遇见数学教育 数学教材和习题集中的配图错误是一个长期困扰教育行业的难题。据统计,约15%的数学教材配图存在不同程度的逻辑漏洞或表达偏差,这些…...
10分钟上手!Java开发者也能轻松调用AI,Spring AI Alibaba手把手教你构建智能体!
介绍:还在羡慕Python开发者能轻松调用AI?Spring AI Alibaba让Java也能10分钟构建一个能“思考”和“行动”的智能体,这次手把手教! 系统:Windows jdk版本:17 maven:3.8 模型API Key:…...
告别迷茫!Java程序员入门AI的完整学习地图
文章目录前言一、先破三个心魔:Java搞AI到底靠不靠谱?心魔一:AI都是Python的天下,Java只能看戏?心魔二:必须得回炉重造学数学?心魔三:要从Hello World开始学Python?二、J…...
