返回顶部
首页 > 资讯 > 前端开发 > html >如何理解Dynamo的实现技术和去中心化
  • 301
分享到

如何理解Dynamo的实现技术和去中心化

2024-04-02 19:04:59 301人浏览 独家记忆
摘要

今天就跟大家聊聊有关如何理解Dynamo的实现技术和去中心化,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。这里想聊一聊它的去中心化(decentra

今天就跟大家聊聊有关如何理解Dynamo的实现技术和去中心化,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

这里想聊一聊它的去中心化(decentralization)。

中心节点

通常,我们见到的分布式存储结构都是具备中心(总控)节点的,比如Google File System(GFS),包括了中心的Master和数据节点Chunck Server;再比如hdfs,包括了中心的Name node和数据节点Data Node。下面就以这两者为例来说明设置中心节点遇到的问题和解决。

中心节点通常包含了存储单元的分布信息,存储内容的元信息,“一致性”是分布式系统的核心内容,而在处理一致性问题上,引入中心节点可以带来莫大的好处,但是,也容易引发问题:

  • 单点故障:这个问题的解决主要靠热备,比如GFS就靠Shadow Master。而HDFS情况比较复杂,在hadoop 2.0以前靠的是Secondary NameNode,它不是真正的HA(High Availability),它只是阶段性的合并edits和fsimage,以缩短集群启动的时间,因此在Name Node出问题的时候,它既不能保证立即提供服务,也不能保证数据的完整性;现在HDFS为保证Name Node的HA,做法就很多了,包括了(1)shared image或者是(2)data replication的方法,这篇文章有系统的介绍。

如何理解Dynamo的实现技术和去中心化

(上图来自《HDFS HA: 高可靠性分布式存储系统解决方案的历史演进》)

  • 扩展性,我们可以按照这样的思路来解决这个问题:

    • 中心节点包括了两个基本职责,一个是文件系统的维护,它需要知道每个数据节点上的哪块空间存放了哪些数据;还有一个是对于数据请求的调度。这两个是可以拆开来的。

    • 把单Master变成Multi-master,Master之间可以用不同的方式实现数据同步,这个方法的好处在于Master的水平扩展变得容易,问题还是在于一致性,如果不同的Master要操纵同一个数据节点上同一片数据,需要有专门的方式来处理冲突。

    • 对于元文件信息量较大时会比较麻烦,比如HDFS上都是小文件,文件数量众多,存储效率低(这是HDFS不适宜的一个使用例子,在这篇文章里面我提到过),Name Node的内存消耗大。要么就不要这么用,GFS就比较适用于存放大文件;要么就从存储架构上解决,软件系统一个通用的办法是引入新的一个层,比如在Name Node和Data Node之间引入一个区域自治的层,这一层每一个节点分别自治管理一部分Data Node,而都从属于Name Node。

有趣的是,整个互联网就可以看做是一个巨大的分布式系统,经过了实践检验,我们可以认为它的的确确是去中心化的,但它也并不是每个维度都“去中心”,比如域名服务器,***域名服务器就是一个中心节点。因此如果仅仅是为了分布式,而粗暴地把中心节点去掉不是明智的,当然,Dynamo做了尝试,下面我列出了一些去掉中心节点后带来的问题,和它的解决办法。

Dynamo的去中心化

在上面提到了的Dynamo 2007年的论文中,就直白地强调了去中心化是Dynamo设计的一条重要原则:

Decentralization: An extension of symmetry, the design should favor decentralized peer-to-peer techniques over centralized control. In the past, centralized control has resulted in outages and the goal is to avoid it as much as possible. This leads to a simpler, more Scalable, and more available system.

Dynamo的设计者已经意识到了中心化系统带来的问题,包括服务中断,因此要尽可能避免。其它还包括的设计原则有:

  • Incremental scalability,增量扩展,减少对系统的影响;

  • Symmetry,对称性,节点之间都是对等的;

  • Heterogeneity,多相性(不知道怎么翻译更好),系统的扩展性可以按不同的比例落实到不同类型和能力的硬件上面去。

下图来自该论文,列出了遇到的问题和解决问题采用的技术,这是Dynamo设计的核心,而其中的大部分问题都是和去中心化相关的:

如何理解Dynamo的实现技术和去中心化

下面逐条叙述:

Partioning

采用一致性Hash(Consistent Hashing)来解决节点增加和水平扩展的问题,带来的好处和设计原则中的增量扩展是一致的。它本身已经不是一个新话题了,介绍它的材料互联网上有很多,在此不赘述。Dynamo的实现上有两点特别需要指出:

  • 每一台物理设备都根据不同的能力折合成不同数量的虚拟节点数目;

  • 每份数据都被映射到整个hash环上面的多个节点,从而形成replication,保证可用性。

High availablity for writes

采用向量时钟(Vector Clock)来处理一致性问题,向量时钟实际上是一个(node,counter)对的列表,如下图:

如何理解Dynamo的实现技术和去中心化

D1写入,发生在节点Sx,形成向量时钟[Sx,1],Sx又发生一次写,于是counter增加1,变成了[Sx,2],之后基于它发生了D3和D4两次写入,于是出现了两个版本,([Sx,2],[Sy,1])和([Sx,2],[Sz,1]),在D5的时候协调,协调成Sy先于Sz发生,counter再加1。这里的协调有两种方式:

  • last write wins,依赖于节点时钟,但是时钟之间无法做到绝对一致

  • 客户端来决定

Handling temporary failures

Sloppy Quorum:草率的法定人数(这个不知道如何翻译),这里有一个有名的NWR机制,其中:

  • N表示复制的数据备份数量,

  • W表示同步确认成功的写操作的副本数(剩下N-W的写操作是异步进行的),

  • R表示同步确认成功的读操作的副本数(每次读通过比较前面提到的向量时钟/版本号来确定有效的副本)。

当W+R>N的时候,可以保证强一致性,对于这个定理,分类举例说明如下:

  • 如果W<R,例如W=1,R=2,N=2,那么两份数据拷贝中,有一份同步写(有效数据),一份异步写(可能暂时无效),而有两份同步读,所以肯定能读到一份有效的数据;

  • 如果W=R,例如W=1,R=1,N=1,这是最简单的“单库模式”,没有异步写;

  • 如果W>R,例如W=2,R=1,N=2,两份写入都是同步写,因此读任意一份数据都是有效的。

通过协调N、W、R之间的值,就可以在一致性和可用性之间做tradeoff(CAP理论中P是无法牺牲的,而C和A是可以取舍的),因为W或R是同步的,因此基本上W或R的值越大,Availability就越差。

Hinted Handoff:暗示的转交,如果写操作过程中节点A暂时不可用,可以自动将
该节点上的副本转交到别的节点去,这是为了保证副本总数不减少。而这个转交的数据会设置一个暗示的标记,等到节点A恢复了,会被重新转交回A。

Recovering from permanent failures

使用Merkle Tree的反熵(anti-entropy)。Merkle是这样一种数据结构,非叶子节点提供了多层Hash的功能:

如何理解Dynamo的实现技术和去中心化

反熵协议是用来帮助副本之间的同步的,使用Merkle的主要优点是每个分支可以独立地检查,而不需要下载整个树或整个数据集。

Membership and failure detection

基于Gossip的成员协议(membership protocol)和故障检测。Gossip协议本身就是为了去中心化而设计的,虽然无法保证在某个时刻所有节点状态一致,但可以保证在某个最终的时刻一致。成员协议用于在hash环上增加或减去节点。

关于Dynamo的吐槽

对于Dynamo的去中心化,实在是功过兼备,毕竟引入了上面介绍的一堆复杂的机制,尤其对于数据的一致性问题,更是争议不小。使用一个Master节点,丢失了中心化,但是一致性的问题就容易解决得多,系统也会更简单;退一步说,如果要去中心化,但是使用Paxos这样的协议,来选举一个“Master”出来,那也能比较简洁地保证一致性。但是Dynamo***的实现,让用户来解决冲突的做法(有时候用户也没法确定该用哪个版本),确实有些别扭;而采用绝对时间来解决冲突的方法,则是在机制上有天生的缺陷(时间无法做到绝对同步)。

网上曾经有一篇很火的吐槽《Dynamo: A flawed architecture &ndash; Part 1》,抱怨了一些Dynamo的问题,新浪的Tim Yang写了一篇文章简单翻译了一下,我就不再赘述,大致上抱怨的问题包括:

  1. 一致性方面,Dynamo没有办法保证避免脏读;

  2. Quorum机制中只是R+W>N在遇到节点不可用的时候,并不能保证强一致性;

  3. Hinted Handoff机制在跨IDC的情况下,会因为异地传输开销而性能低下;

  4. 灾难恢复方面,某一个IDC挂掉的时候,没人可以计算到底丢了多少数据;

  5. 论文里面一些自相矛盾的地方,一个是对节点对等的描述,一个是对最终一致的描述;

  6. Dynamo给用户造成了误导,以为一直是在CAP的C和A中必须做一个取舍,其实单节点中心就可以同时做到CA;

  7. Dynamo宣称去中心化,但是并没有完全做到,比如交换机故障造成网络分片的时候,服务就不可用了。

这篇文章的标题写着part 1,只可惜part 2没有出现。这篇文章引起了不少争议,作者后来自己写了一篇《Dynamo &ndash; Part I: a followup and re-rebuttals》来回应,文章结尾总结了一下他对Dynamo的观点:

  • 尽量去避免脏读;

  • 不受控的脏读任何时候都不可接受,即便在灾难发生的时候&mdash;&mdash;就算数据丢失也比它要好得多,大多数情况下,管理员会关闭部分或者全部的服务,而不是去用丢失或者损坏的数据来响应用户

  • 一个数据中心内的网络分片要避免,在一个数据中心内考虑P(partition tolerance)是不合理的;

  • 中心化并不意味着低Availability,高可用的服务是可能的,虽然说scalability可能会成为问题;

  • 开发设计的对称性并不能很好适应硬件和网络的非对称性;

  • 数据中心一致性、高可用性和扩展性是可以同时达到的,只要在一个数据中心里面(也就是说P被放弃的时候),BigTable+GFS,HBase+HDFS,甚至oracle RAC都是很好的例子;

  • Dynamo的读写即便在一个数据中心内也会引起脏读;

  • 谁也不知道脏读避免的时间边界在哪里;

  • 跨数据中心的情况下,没法跟踪有多少数据待更新,而灾难恢复的时候,也没法知道有多少数据丢失。

看完上述内容,你们对如何理解Dynamo的实现技术和去中心化有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网html频道,感谢大家的支持。

--结束END--

本文标题: 如何理解Dynamo的实现技术和去中心化

本文链接: https://lsjlt.com/news/86234.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何理解Dynamo的实现技术和去中心化
    今天就跟大家聊聊有关如何理解Dynamo的实现技术和去中心化,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。这里想聊一聊它的去中心化(decentra...
    99+
    2024-04-02
  • 如何快速理解MySQL核心技术?
    如何快速理解MySQL核心技术?MySQL是一种常用的关系型数据库管理系统,广泛应用于各种应用程序和网站开发中。理解MySQL的核心技术对于数据库开发和管理非常关键。本文将介绍一些快速理解MySQL核心技术的方法和建议。首先,了解MySQL...
    99+
    2023-10-22
    MySQL 数据库 核心技术
  • vue如何实现多图表resize事件去中心化
    这篇文章主要介绍vue如何实现多图表resize事件去中心化,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!多图表resize事件去中心化1.1 一般情况有时候我们会遇到这样的场景,一...
    99+
    2024-04-02
  • 区块链操作系统背后的技术原理:揭开去中心化之谜
    区块链概述 区块链是一种分布式账本技术,最初用于支持比特币加密货币。它本质上是一个不可篡改的数字分类账,记录所有交易,并由多个节点维护和验证。这种分布式结构消除了对中心管理机构的依赖,实现了去中心化。 区块链操作系统的关键技术 分布式账...
    99+
    2024-03-04
    区块链 操作系统 分布式账本 共识算法 去中心化 智能合约
  • Python内存管理器如何实现池化技术
    目录前言内存层次结构内存管理逻辑内存布局及对应的数据结构内存分配内存释放总结前言 Python 中一切皆对象,这些对象的内存都是在运行时动态地在堆中进行分配的,就连 Python 虚...
    99+
    2024-04-02
  • 如何理解IPv6过渡技术中的NAT-PT技术
    这篇文章将为大家详细讲解有关如何理解IPv6过渡技术中的NAT-PT技术,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。       IPv6的应用是一...
    99+
    2023-06-03
  • 如何理解IPv6过渡技术中的双栈技术
    这期内容当中小编将会给大家带来有关如何理解IPv6过渡技术中的双栈技术,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。       IPv6经过20多年的发展研究实验...
    99+
    2023-06-03
  • 如何理解IPv6过渡技术中的隧道技术
    如何理解IPv6过渡技术中的隧道技术,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。       基于互联网的快速发展,IPv4地址即将使...
    99+
    2023-06-03
  • 如何理解CDN的核心技术之一:负载均衡
    本篇内容主要讲解“如何理解CDN的核心技术之一:负载均衡”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解CDN的核心技术之一:负载均衡”吧!CDN是近年来从美国首先兴起并迅速发展起来的一种...
    99+
    2023-06-10
  • PHP和Django中的重定向技术:如何实现?
    重定向技术在Web开发中是非常常见的。PHP和Django都有自己的重定向技术,本文将探讨如何在PHP和Django中实现重定向。 一、PHP中的重定向 在PHP中,可以使用header()函数来实现重定向。header()函数用于发送原始...
    99+
    2023-11-12
    django 教程 重定向
  • Go Spring开发技术中,如何实现对象的序列化和反序列化?
    在Go Spring开发中,对象的序列化和反序列化是非常常见的操作。序列化是将对象转换为字节流的过程,而反序列化则是将字节流转换回对象。在本文中,我们将探讨Go Spring开发技术中如何实现对象的序列化和反序列化。 一、JSON序列化和...
    99+
    2023-07-26
    spring 开发技术 对象
  • 从技术角度剖析区块链操作系统:去中心化如何塑造未来
    区块链技术概述 区块链是一种分布式、不可篡改的账本,用于记录交易和管理数据。它由一系列区块组成,每个区块包含时间戳、交易数据和前一个区块的哈希值。这种链状结构确保了数据完整性和安全性,因为任何对某个区块的更改都会导致后续所有区块失效。 ...
    99+
    2024-03-04
    区块链操作系统 去中心化 分布式账本 智能合约 计算机体系结构
  • 如何在ASP和Spring中实现路径参数化开发技术?
    路径参数化开发技术是一种常用的Web开发技术,它可以让我们在开发Web应用时更加灵活地处理URL请求,提高Web应用的可维护性和可扩展性。在本文中,我们将介绍如何在ASP和Spring中实现路径参数化开发技术,并演示代码以帮助读者更好地理...
    99+
    2023-09-08
    spring path 开发技术
  • PHP中Memcached缓存技术的实现和原理
    Memcached是一种高速缓存系统,被广泛应用于Web服务器和其他需要缓存数据的场合。在PHP开发中,Memcached常用于提升应用程序的性能和优化数据库访问。本文将介绍Memcached缓存技术的实现和原理。一、Memcached的基...
    99+
    2023-05-16
    PHP memcached 缓存技术
  • PHP 中 Elasticsearch 实现数据去重与去噪的技术思路
    引言:在日常的数据处理中,经常会遇到数据重复与噪声过多的问题,这严重影响了数据的质量与准确性。而Elasticsearch作为一款强大的搜索引擎与数据处理工具,可以为我们提供解决方案。本文将介绍如何利用PHP与Elasticsearch实现...
    99+
    2023-10-21
    Elasticsearch数据去重技术 Elasticsearch数据去噪技术 PHP中Elasticsearch实现
  • 如何理解MySQL的分页和排序技术?
    如何理解MySQL的分页和排序技术?概述:MySQL是一个广泛使用的关系型数据库管理系统,它提供了丰富的功能和技术,其中包括了分页和排序技术。分页技术可以用来显示大量数据的部分内容,而排序技术则可以对数据按照特定规则进行排序。在实际应用中,...
    99+
    2023-10-22
    分页 MySQL 排序
  • 重定向技术:如何在Go和JavaScript中实现?
    在Web开发中,重定向技术是一个非常常见的概念。它可以用来将用户从一个URL地址重定向到另一个URL地址。在这篇文章中,我们将介绍如何在Go和JavaScript中实现重定向技术。 Go中的重定向 在Go中,我们可以使用"net/http...
    99+
    2023-10-21
    javascript 重定向 ide
  • JAVA如何实现动态代理技术
    这篇文章主要为大家展示了“JAVA如何实现动态代理技术”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JAVA如何实现动态代理技术”这篇文章吧。一、引出动态代理生活中代理应该是很常见的,比如你可以...
    99+
    2023-05-30
    java
  • 函数中的内存管理和优化技术
    函数中内存管理涉及栈和堆,栈自动分配和释放局部变量和函数参数,而堆由程序员手动分配和释放,优化技术包括避免不必要的分配和释放、使用内存池、引用计数和智能指针。 函数中的内存管理和优化技...
    99+
    2024-04-12
    内存管理 优化技术 c++
  • python如何进行自动化测试selenium核心技术处理弹框
    python如何进行自动化测试selenium核心技术处理弹框,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。页面上的弹框一般有三种:(1)alert:用来提示(2)confir...
    99+
    2023-06-25
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作