Amazon云计算AWS之[1]基础存储架构Dynamo

news2025/1/15 19:52:06

文章目录

  • Dynamo概况
  • Dynamo架构的主要技术
    • 主要问题及解决方案
    • Dynamo的存储节点
    • 数据均衡分布的问题
      • 一致性哈希算法
      • 改进一致性哈希算法
    • 数据备份
    • 数据冲突问题
    • 成员资格及错误检测
    • 容错机制
      • 临时故障处理机制
      • 永久性故障处理机制

Dynamo概况

  • 面向服务的Amazon平台基本架构
  • 为了保证其稳定性,Amazon的系统采用完全的分布式、去中心化的架构
  • 作为底层存储架构的Dynamo也同样采用无中心的模式
  • Dynamo只支持简单的键/值(key/value)方式的数据存储,不支持复杂的查询
  • Dynamo中存储的是数据值的原始形式,即按位存储,并不解析数据的具体内容,使得Dynamo几乎可以存储所有类型的数据
    在这里插入图片描述

Dynamo架构的主要技术

主要问题及解决方案

  • Dynamo在设计时被定位为一个基于分布式存储架构的,高可靠、高可用且具有良好容错性的系统。
  • Dynamo设计时面临的主要问题及所采取的解决方案
问题采取的相关技术
数据均衡分布改进的一致性哈希算法
数据备份参数可调的弱quorum机制
数据冲突处理向量时钟 (Vector Clock)
成员资格及错误检测基于Gossip协议的成员资格和错误检测
临时故障处理Hintedhandoff(数据回传机制)
永久故障处理Merkle哈希树

Dynamo的存储节点

  • Dynamo中的存储节点呈无中心的环状分布。
    在这里插入图片描述
    在这里插入图片描述
  • 通常,coordinator 是 preference list 上的第一个节点

数据均衡分布的问题

在这里插入图片描述

  • Dynamo采用分布式的数据存储架构,均衡的数据分布可以保证负载平衡和系统良好的扩展性。 所以,如何在各个节点上数据的均衡性是影响Dynamo性能的关键问题。

  • Dynamo中使用改进后的一致性哈希算法,并在此基础上进行数据备份,以提高系统的可用性。

一致性哈希算法

在这里插入图片描述

  • 一致性哈希算法是目前主流的分布式哈希表(Distributed Hash Table,DHT)协议之一,于1997年由麻省理工学院提出。
  • 一致性哈希算法通过修正简单哈希算法,解决了网络中的热点问题,使得DHT(分布式哈希表)可以真正地应用于P2P环境中。
  • 对于系统中的每个设备节点,为其分配一个随机的标记,这些标记可以构成一个哈希环。
  • 在存储数据时,计算出数据中键的哈希值,将其存放到哈希环顺时针方向上第一个标记大于或等于键的哈希值的设备节点上。
  • 一致性哈希算法除了能够保证哈希运算结果充分分散到整个环上外,还能保证在添加或删除设备节点时只会影响到其在哈希环中的后继设备节点,而不会对其他设备节点产生影响。
    在这里插入图片描述
    在这里插入图片描述
  • 一致性哈希算法可以大大降低在添加或删除节点时引起的节点间的数据传输开销

改进一致性哈希算法

  • 一致性哈希算法在设备节点数量较少的情况下,有可能造成环上节点分布的不均匀;并且没有考虑哈希环上不同设备节点的性能差异。
  • Dynamo中引入虚拟节点的概念。
    在这里插入图片描述
  • Dynamo中引入了虚拟节点的概念。每个虚拟节点都隶属于某一个实际的物理节点,一个物理节点根据其性能的差异被分为一个或多个虚拟节点。 各个虚拟节点的能力基本相当,并随机分布在哈希环上。
  • 数据对象先按照其键的哈希值被分配到某个虚拟节点上,并存储在该虚拟节点所对应的物理节点中。

  • 为进一步提高数据分布的均衡性。Dynamo将整个哈希环划分成Q等份,每个等份称为一个数据分区(Partition)。
  • 在存储数据时,每个数据会被先分配到某个数据分区,再根据负责该数据分区的虚拟节点,最终确定其所存储的物理节点。
  • 假设系统中有 S S S个虚拟节点,且 Q > > S Q>>S Q>>S,则每个虚拟节点负责的数据分区数为 V = Q / S V=Q/S V=Q/S

在这里插入图片描述

  • 数据分区的好处
  1. 减小数据分布不均衡的可能性
  2. 添加或删除设备节点时引起较小的数据传输

数据备份

  • 为提高数据的可用性,Dynamo中在存储每个数据对象时,保存其多个副本作为冗余备份。假设每个数据对象保存在系统中的副本数为N(通常为3),考虑到存在节点失效的情况,preference list中节点的个数大于N,并且为实际的物理节点。
  • 在Dynamo中,每个数据的副本备份存储在哈希环顺时针方向上该数据所在虚拟节点的后继节点中。 某个数据对象的键为k,其数据存储在虚拟节点A中,则其数据副本将按顺时针方向存储在虚拟节点B、C上。

在这里插入图片描述

  • 数据备份在存储数据的同时进行,会使每次写操作的延时变长。Dynamo中对写操作进行了优化,保证一个副本必须写入硬盘,其他副本只要写入节点的内存即返回写成功。
  • 每个虚拟节点上实际存储了分配给它以及分配它的前N-1个前驱虚拟节点的数据。

数据冲突问题

在这里插入图片描述

  • Dynamo选择通过牺牲一致性来保证系统的可靠性和可用性,没有采用强一致性模型而采用最终一致性模型。
  • 由于Dynamo中可能出现同一个数据被多个节点同时更新的情况,且无法保证数据副本的更新顺序,这有可能会导致数据冲突。
  • Dynamo中采用向量时钟技术(Vector Clock)解决数据冲突问题。
  • Dynamo中的向量时钟通过 [ n o d e , c o u n t e r ] [node, counter] [node,counter]来表示,node表示操作节点;counter是其对应的计数器,初始值为 0 0 0节点每进行一次更新操作则计数器加 1 1 1

常用的解决冲突的方案有两种:

  1. 通过客户端由用户来解决;
  2. 系统自动选择时间戳最近的版本
  • 由于集群内的各个节点并不能严格保证时钟同步,所以不能完全保证最终版本的准确性。
  • 向量时钟的数量是有限制的,当超过限制时将会根据时间戳删除最早的向量时钟
    在这里插入图片描述
  1. 客户端请求写入一个新对象。节点 S x S_x Sx处理对 k e y key key的写:序列号递增,并创建数据的向量时钟,在该节点上生成对象D1和向量时钟 [ ( S x , 1 ) ] [(S_x, 1)] [(Sx,1)]

  2. 客户端更新该对象。假设由同样的节点即 S x S_x Sx处理这个请求,由于该节点有 D 1 D_1 D1和向量时钟 [ ( S x , 1 ) ] [(S_x, 1)] [(Sx,1)],则更新该对象后在该节点上生成对象 D 2 D_2 D2和向量时钟 [ ( S x , 2 ) ] [(S_x, 2)] [(Sx,2)] D 2 D_2 D2继承自 D 1 D_1 D1,即 D 2 D_2 D2覆写 D 1 D_1 D1,计数器增 1 1 1,但其它节点此时可能是 D 1 D_1 D1,也可能是 D 2 D_2 D2(取决于网络和节点状态)

  3. 假设同一客户端更新该对象但被不同的服务器处理。节点 S y S_y Sy处理这个请求,则更新该对象后在该节点上生成对象 D 3 D_3 D3和向量时钟 [ ( S x , 2 ) , ( S y , 1 ) ] [(S_x, 2), (S_y, 1)] [(Sx,2),(Sy,1)]

  4. 假设另一客户端读取到 D 2 D_2 D2并尝试更新它但被另一个不同的服务器处理。节点 S z S_z Sz处理了这个请求,则更新该对象后在该节点上生成对象 D 4 D_4 D4和向量时钟 [ ( S x , 2 ) , ( S z , 1 ) ] [(S_x, 2), (S_z, 1)] [(Sx,2),(Sz,1)]

  5. 节点数据版本回收。现在有4个版本的数据存在并在各个节点之间传递了,当节点收到 D 3 D_3 D3 D 4 D_4 D4时,会根据向量时钟将#D_1#和#D_2#回收掉,因为其是 D 3 D_3 D3 D 4 D_4 D4的祖先。但是收到 D 3 D_3 D3 D 4 D_4 D4的节点,根据向量时钟发现它们之间是并行关系,则保留二者,并在客户端get时将二者都提交给客户端由其来协调并合并版本。

    • 假设客户端读取数据,则会获取到 D 3 D_3 D3 D 4 D_4 D4,根据两者的向量时钟,会合并为 D 5 D_5 D5和向量时钟 [ ( S x , 2 ) , ( S y , 1 ) , ( S z , 1 ) ] [(S_x, 2), (S_y, 1), (S_z, 1)] [(Sx,2),(Sy,1),(Sz,1)],节点 S x S_x Sx协调写操作,并更新对象和向量时钟。

成员资格及错误检测

  • 由于Dynamo采用了无中心的架构,每个成员节点都需要保存其他节点的路由信息。为保证每个节点都能拥有最新的成员节点信息,Dynamo中采用了一种类似于Gossip(闲聊)协议的技术,每个节点间隔固定时间(1秒)从其他节点中任意选择一个与之通信。
  • 通信连接成功后,双方交换各自保存的系统中节点的负载、路由等信息。
    在这里插入图片描述
  • Dynamo中还通过Gossip来实现错误检测。任何节点向其他节点发起通信后,如果对方没有回应,则认为对方节点失效,并选择别的节点进行通信。发起通信的节点定期向失效节点发出消息,如果对方有回应,则可以重新建立通信。

  • 为避免新加入的节点之间不能及时发现其他节点的存在,Dynamo中设置一些种子节点(Seed Node)。种子节点和所有的节点都有联系。当新节点加入时,它扮演一个中介的角色,使新加入节点之间互相感知。
    在这里插入图片描述
  • 假如一新节点加入节点总数为 N N N的系统,并以最优的方式进行传播(即每次通信的两个节点都是第一次交换新节点信息),那么将新节点信息传遍整个系统需要的时间复杂度为 l o g n logn logn
  • 自底向上每一层代表一次随机通信。第一层节点1将信息交换给节点2;第二层节点1和2同时开始随机选择其他节点交换信息,比如节点1向节点3发送信息,节点2向节点4发送信息;以此类推,直到N个节点全部传遍。
  • 整个过程形成一个倒的二叉树,树高为 l o g n logn logn。显然,当N的值很大时,传播时间会变长,因此,Dynamo中的节点数不能太多。
  • 根据Amazon的实际经验,当节点数N在数千时,Dynamo的效率是非常高的;但当节点数 N N N增加到数万后,效率就会急剧下降。为此,Amazon采用了分层Dynamo结构来解决该问题 [ 1 , 40 ] [1,40] [140]
    在这里插入图片描述

容错机制

临时故障处理机制

  • 为处理机器假死等临时失效的节点,Dynamo中采用了一种带有监听的数据回传机制。
  • 当虚拟节点A失效后,会将数据临时存放在节点D的临时空间中,并在节点A重新可用后,由节点D将数据回传给节点A。
  • 节点D是preference list里的最后一个节点。
  • 每个节点对应的都有一个自己作为coordinator的preference list
    在这里插入图片描述

永久性故障处理机制

  • 节点失效超过设定时间仍不能重用,认定为永久性故障。此时,Dynamo需要从其他数据副本进行数据同步
  • Dynamo采用Merkle哈希树技术来加快检测和减少数据传输量。
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【深度学习】Vision Transformer

一、Vision Transformer Vision Transformer (ViT)将Transformer应用在了CV领域。在学习它之前,需要了解ResNet、LayerNorm、Multi-Head Self-Attention。 ViT的结构图如下: 如图所示,ViT主要包括Embedding、Encoder、Head三大部分。Class …

小球反弹(蓝桥杯)

文章目录 小球反弹【问题描述】答案:1100325199.77解题思路模拟 小球反弹 【问题描述】 有一长方形,长为 343720 单位长度,宽为 233333 单位长度。在其内部左上角顶点有一小球(无视其体积),其初速度如图所…

Targeted influence maximization in competitive social networks

abstract 利用口碑效应的广告对于推销产品是相当有效的。在过去的十年中,人们对营销中的影响力最大化问题进行了深入的研究。影响力最大化问题旨在将社交网络中的一小群人识别为种子,最终他们将引发网络中最大的影响力传播或产品采用。在网络营销的实际场…

微信小程序日期增加时间完成订单失效倒计时(有效果图)

效果图 .wxml <view class"TimeSeond">{{second}}</view>.js Page({data: {tiem_one:,second:,//倒计时deadline:,},onLoad(){this.countdown();},countdown(){let timestamp Date.parse(new Date()) / 1000;//当前时间戳let time this.addtime(2024…

记一次中间件宕机以后持续请求导致应用OOM的排查思路(server.max-http-header-size属性配置不当的严重后果)

一、背景 最近有一次在系统并发比较高的时候&#xff0c;数据库突然发生了故障&#xff0c;导致大量请求失败&#xff0c;在数据库宕机不久&#xff0c;通过应用日志可以看到系统发生了OOM。 二、排查 初次看到这个现象的时候&#xff0c;我还是有点懵逼的&#xff0c;数据库…

k8s 部署 kube-prometheus监控

一、Prometheus监控部署 1、下载部署文件 # 使用此链接下载后解压即可 wget https://github.com/prometheus-operator/kube-prometheus/archive/refs/heads/release-0.13.zip2、根据k8s集群版本获取不同的kube-prometheus版本部署 https://github.com/prometheus-operator/k…

基于SSM的物流快递管理系统(含源码+sql+视频导入教程+文档+PPT)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的物流快递管理系统2拥有三个角色&#xff1a; 管理员&#xff1a;用户管理、管理员管理、新闻公告管理、留言管理、取件预约管理、收件管理、货物分类管理、发件信息管理等 用户…

C#在窗体中设计滚动字幕的方法:创建特殊窗体

目录 1.涉及到的知识点 (1)Timer组件 (2)Label控件的Left属性 (3)启动和关闭Timer计时器 2. 实例 &#xff08;1&#xff09;Resources.Designer.cs设计 &#xff08;2&#xff09; Form1.Designer.cs设计 &#xff08;3&#xff09;Form1.cs设计 &#xff08;4&#…

社交媒体数据恢复:与你科技

在数字时代&#xff0c;数据是我们生活中的重要组成部分。无论是个人照片、文档&#xff0c;还是企业的重要资料&#xff0c;数据在我们的生活中扮演着举足轻重的角色。然而&#xff0c;数据丢失的问题时常发生&#xff0c;给我们带来了很多麻烦。幸运的是&#xff0c;当下众多…

CentOS 7静默安装Oracle 11g(记一次最小化CentOS 7安装Oracle 11g的经历)

# [pdf在线免费转word文档](https://orcc.online/pdf) https://orcc.online/pdf 1.最小化安装CentOS 7后首先设置一下固定IP 可以先查询一下自己的网卡设备的名称&#xff0c;是ens33&#xff0c;所以网卡配置文件名称就是ifcfg-ens33&#xff08;前面的ifcfg-不用管&#xf…

Discuz! X3.4 升级至 Discuz! X3.5 详细教程

第一步&#xff1a;从其他以前的 Discuz! X 版本升级Discuz! X3.4 请先升级到Discuz! X3.4&#xff0c;升级教程网上比较普遍&#xff0c;在此不再论述。 第二步&#xff1a;Discuz! X3.4 升级至 Discuz! X3.5 &#xff08;Discuz 从 X3.5 以后&#xff0c;不在发布GBK版本&…

【Unity学习笔记】第十三 · tag与layer(运行时创建tag和layer)

参考&#xff1a; Unity手册 标签Unity手册 LayersIs it possible to create a tag programmatically?脚本自动添加tag和Layer 注&#xff1a;本文使用Unity版本是2022.3.23f1 转载引用请注明出处&#xff1a;&#x1f517;https://blog.csdn.net/weixin_44013533/article/de…

c++使用googletest进行单元测试

googletest进行单元测试 使用Google test进行测试一、单元测试二、使用gmock测试 使用Google test进行测试 使用场景&#xff1a; 在平时写代码中&#xff0c;我们需要测试某个函数是否正确时可以使用Google test使用&#xff0c;当然&#xff0c;我们也可以自己写函数进行验证…

给rwkv-pytorch 写个chat ui demo

rwkv-pytorch 项目地址 rwkv-pytorch from nicegui import uimessage_dict {1: [{"name":"Assistant","text":"你好"}]} current_name 1 import aiohttpasync def get_text_async(text"Hello, how are you?"):# 定义AP…

JAVA 项目<果园之窗>_1

这几天有空看能不能把水果店管理系统整出来&#xff0c;目标是整个网页版本的&#xff0c;以我的电脑做服务器&#xff0c;数据存在mysql中 以我目前的理解整个项目大致可分为前端部分、后端部分、数据库部分&#xff0c;也就这三个部分 目前打开并运行了一个别人的项目&#…

盒子模型之怪异盒模型

这个是标准盒模型 这个是怪异盒模型 box-sizing:content-box;默认是标准盒模型 box-sizing:border-box;是怪异盒模型&#xff0c;会挤压里面的内容&#xff0c;不管怎么设置边框始终都是当初设置的200px <!DOCTYPE html> <html lang"en"> <head>…

MongoDB学习【一】MongoDB简介和部署

MongoDB简介 MongoDB是一种开源的、面向文档的、分布式的NoSQL数据库系统&#xff0c;由C语言编写而成。它的设计目标是为了适应现代Web应用和大数据处理场景的需求&#xff0c;提供高可用性、横向扩展能力和灵活的数据模型。 主要特点&#xff1a; 文档模型&#xff1a; Mon…

前端vue自定义table 表格 表格组件 Excel组件

前端组件化开发与Excel组件设计 一、前端开发的复杂性与组件化的必要性 随着技术的发展&#xff0c;前端开发的复杂度越来越高&#xff0c;传统开发方式将一个系统做成了整块应用&#xff0c;经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改&…

开源大数据集群部署(二十一)Spark on yarn 部署

作者&#xff1a;櫰木 1 spark on yarn安装&#xff08;每个节点&#xff09; cd /root/bigdata/ tar -xzvf spark-3.3.1-bin-hadoop3.tgz -C /opt/ ln -s /opt/spark-3.3.1-bin-hadoop3 /opt/spark chown -R spark:spark /opt/spark-3.3.1-bin-hadoop32 配置环境变量及修改配…

大话设计模式-装饰器模式

大话设计模式书中&#xff0c;作者举了一个穿衣服的例子来为我们引入装饰器模式。 概念 定义 装饰模式在书中的定义是&#xff1a;动态地给一个对象添加一些额外的职责&#xff0c;就增加功能来说&#xff0c;装饰模式比生成子类更灵活。 这句话直接去理解可能会有点抽象&#…