HYDRAstor:可扩展的二级存储

为什么80%的码农都做不了架构师?>>>   hot3.png

原文:HYDRAstor: a Scalable Secondary Storage.

HYDRAstor(官网)是NEC推出的二级存储系统,先后有多篇关于HYDRAstor的论文发表在FAST(包括后来9livesdata发表的论文)。HYDRAstor是一个完整的存储解决方案,因此涉及的方面很多,包括文件系统、DHT、dedup、erasure code等。这类论文往往是多种技术的汇聚点,可以帮助扩展自己的领域。看这篇文章只能了解有这样的东西,太多技术细节没有说明。

HYDRAstor的目标是商用产品,支持可扩展容量和性能,垃圾回收,负载均衡,高可靠性、可用性等特性。本文关注的是其后端(back-end,或者称为Hydra),一个通过分布式哈希表构建的存储网络,对外界而言就像是一个整体系统。为了支持所有流式数据访问的应用,API是块级的,上层可以实现多种访问协议,包括通用的文件系统(HydraFS)。

0.编程模型

在Hydra中,数据都以变长的,内容寻址的,不可修改的块(block)的形式存在。每个块除了包括数据以外,还有一个指针数组(指向其它的数据块)。变长是为了提高去重率;指针数组可以方便垃圾回收(为什么?)。Hydra只提供最原始的块访问接口,因此为上层应用提供了灵活性。

如图1所示,Hydra将所有的块组织成有向无循环图(DAG)。图中最多的是普通块,每个块的地址由它的内容(包括指针数组)决定;图中每个顶点(SP1、SP2)都开启了一棵树,整棵树可以看作是一个数据流,这些顶点称为可搜索保留根节点(searchable retention root),每个可搜索根结点都由用户指定一个搜索关键字(search key),它的地址是由关键字决定的,而不是块内容;还有一种可搜索删除根节点(searchable deletion root),它是一种特殊的可搜索根节点,用户写入它是为了删除一棵树;图中还有一个特殊的顶点A,它只是个普通块,它存在的原因是树还未构造完成。

Hydra提供写/读普通块,写可搜索保留块,根据关键字搜索可搜索保留块,标记删除可搜索保留块等API。至于对数据流进行分块是交给上层(例如HydraFS)去做。当写入一个数据块时,用户还需指定一个弹性等级(resiliency class),用于确定如何编码。当用户需要删除某棵树时,就写入与其根节点相同关键字的删除根节点。

论文没有提及构建树的过程,因此我们也不知道如何维持块之间的逻辑关系。后面的内容都是如何有效地存储数据块了,可能这种逻辑关系是放在上层(HydraFS)维持的吧。这一小节的目的可能是告诉我们如何去使用后端API,和后面的内容其实没什么关系。

1.体系结构

HYDRAstor由前端和后端组成。后端是一个由存储结点(storage node)组成的网格,提供可扩展的存储容量;前端由一些访问结点(access node)组成,提供可扩展的性能。后端的软件组件包括存储服务器(storage server)、代理服务器(proxy server),都是Linux的用户态进程;以及协议驱动(protocal driver),实现为库。

存储服务器组织成一个覆盖网络,每个存储结点可以运行多个存储服务器,每个存储服务器负责一部分硬盘,这就实际上将一个物理结点虚拟化为多个虚拟结点,充分利用多核资源。代理服务器位于访问结点,向上提供块级接口;协议驱动实现上层访问协议(比如文件系统),都不是本文的重点。

1.1网络

Hydra使用分布式哈希表(DHT)组织后端网络,具体使用的是一个修改过的定长前缀网络(FPN)。在FPN中,每个结点负责一个哈希前缀,图2的顶部显示了一棵哈希前缀树,它包括四个叶子结点,将整个前缀空间分为四个子空间。数据块就根据其哈希的前缀被映射到某个结点。

由于Hydra用纠删码保证数据的弹性(resiliency),而纠删码需要将数据块分片然后放在不同结点,因此每个FPN结点应该要跨越多个物理结点。Hydra并不直接用物理结点(或者应该是存储服务器)作为FPN结点,而是如图2的底部,每个FPN结点都跨越多个物理结点,称之为超级结点(supernode)。每个超级结点跨越的物理结点个数,称为超级结点维度(supernode cardinality),维度是一个重要的参数,Hydra设为12。超级结点涉及的每个物理结点称为超级结点组件(supernode component),同一个超级结点的组件可以称为伙伴(peer)。

因此,Hydra按超级结点为单位分配数据,当一个数据块根据其哈希前缀被分配到超级块时,再由超级结点内部决定如何跨物理结点存储。

1.2读写处理

写一个块时,首先根据其哈希前缀决定由哪个超级结点负责,再根据哈希前缀选出该超级结点的某个组件负责该块,称为写处理伙伴(write-handling peer)。写处理伙伴会判断这个块是否重复,如果重复就直接返回地址;否则,这个块会被压缩、分片,并且按片分布到其它伙伴处。(可见,去重的好处是可以避免压缩、分片)

读一个块时,按照同样原则选出读处理伙伴(read-handling peer)。读处理伙伴会判断最少需要多少个分片才能重构数据块,这个信息放在块的元数据里。接着,读处理伙伴向一定数量的伙伴发送读请求,如果请求都得到满足数据就读完了。如果存在请求失败,读处理伙伴就会尝试去读剩下的所有分片。

1.3负载均衡

后端的负载均衡影响了系统的可用性,如果某个物理结点放置了过多的超级结点组件,那么这个结点的失效将会影响到很多超级结点。最理想的状态是,每个物理结点根据其能力放置一定数量的组件。

Hydra不停地在尝试平衡组件的分布,使得容错性,性能和存储利用率都达到最优。一个特定分布的质量是由一个多维函数评价的,称为系统熵(system entropy)。每个结点都在评估,如果将部分组件传输给邻居结点,系统是否会更加均衡。如果系统发现一个传输能改善分布,就会执行传输。传输是很耗时的。

2.数据组织

前面部分介绍了数据块如何分布,现在介绍的是每个块的分片具体以何种形式存储在物理结点。

2.1 synchrun和synchrun组件

Hydra使用纠删码提供数据冗余,每个分片被分布在某个超级结点的一个伙伴上。由于数据块及其分片都是变长的,不方便管理,所以多个数据块逻辑上组成定长的synchrun,synchrun是数据管理的基本单元,类似于RAID的条带。synchrun物理上被分为若干(超级结点维数)个synchrun组件。因此,超级结点的第i个伙伴,存储着synchrun的第i个组件,存储着数据块的第i个分片。

在任意时刻,写处理伙伴实际上只对一个synchrun写数据,因此所有的synchrun按顺序组成了一个链。一个synchrun组件是以SCC(synchrun component container)数据结构存储的。每个SCC可以包含一个或多个synchrun组件。SCC也组成了类似的链。

图3的第一行显示某个超级结点(该超级结点覆盖了整个哈希空间,即前缀为空)的synchrun,那些叠起来的矩形就是synchrun,每个矩形为synchrun组件,这里每个SCC只包含一个synchrun组件。每个synchrun组件内的小方框代表了一个数据块的分片。一个synchrun链可以表示成维度个SCC链。在图的剩余部分,只显示了一条SCC链。

当超级结点存储了过多数据,或者有新的结点加进系统时,超级结点会分裂为两个新结点。例如图3的第二行,该超级结点分裂为2个超级结点,前缀分别为0和1。每个synchrun也都分裂为二,其中的分片(或者说,synchrun组件)根据其前缀分配到各自结点。这样的就得到了两个新的synchrun链。

分裂后的SCC显然变短了,Hydra会将邻接的SCC合并,防止系统有过多的SCC。图3的第三行显示了合并。SCC的目标大小是一个常量(100MB)。图3的剩余部分显示了删除操作,删除后,SCC也要进行合并。

Hydra是一个动态系统,由于负载均衡导致的数据迁移,需要将一个SCC链传输到另一个物理结点;或者,超级结点发生分裂。这些都不是立刻就能完成的,而是用一个后台进程慢慢进行,因此在任意时刻,Hydra都可能有某个链分裂了一半,或者迁移了一半。所幸Hydra提供了数据冗余,在大多数情况下,都有足够多的完整的链可以提供数据服务(但是,结点分裂时不是应该其所有SCC链都在分裂吗?这该如何解决?)。

3.数据服务

Hydra提供诸如数据重建、去重、删除等数据服务。重建是靠纠删码。Hydra实现的是变长的、在线的、基于哈希比对的、全局数据去重,如果一个块被认定重复,就可以省去编码的时间,所以有潜力提升性能。

删除是其中非常难的部分,因为有数据去重。Hydra引入了一个只读阶段,标记所有引用次数为0的块,引用数不是立即更新的,而是在每次只读阶段时更新自上次只读阶段以来的所有引用数。其中需要注意的问题是各个分片引用次数的一致性。在2013年的FAST上,9livesdata专门讨论了删除问题。

转载于:https://my.oschina.net/fomy/blog/167519

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

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

相关文章

测试环境搭建及维护

搭建良好的测试环境是执行测试用例的前提,也是完成测试任务顺利完成的保证。测试环境大体可分为硬件环境和软件环境,硬件环境包括测试必须的PC机,服务器,设备,网线,分配器等硬件设备;软件环境包…

汇编语言之寄存器(CPU工作原理)

1、介绍 一个典型的CPU,由运算器、控制器、寄存器等器件组成,对于游戏修改者来说,重点学习寄存器,其它不必管。 不同的CPU,寄存器的个数、结构是不相同的,8086CPU有14个寄存器,每个寄存器有一个…

如何通过 C# 动态备份 Sql 数据库?

咨询区 kaiz.net我想写段代码来备份我的 Sql Server 2008 数据库&#xff0c;请问大家有什么好的方法吗&#xff1f;回答区 Stacked你可以用代码去执行 BACKUP DATABASE ... TO DISK 命令&#xff0c;比如下面这样&#xff0c;先配置下config。<?xml version"1.0&quo…

学好英语网首页制作_没有美术基础的新手小白,如何学好淘宝美工?

没有美术基础的新手小白&#xff0c;如何学好淘宝美工&#xff1f;俗话说&#xff1a;万事开头难&#xff0c;没有任何基础、没有美术基础学淘宝美工&#xff0c;要怎么学习好呢&#xff1f;显然&#xff0c;作为一名没有美术基础的新手小白&#xff0c;一般开始学习的时候都是…

14岁上中科大,18岁攻读麻省博士,28岁成为哈佛最年轻副教授,“华人女天才”的开挂人生...

全世界只有3.14 % 的人关注了爆炸吧知识哈佛年纪最小的副教授是中国人1997年美国颁发的罗伯特里得奖获得者蔡天西&#xff0c;22岁获国际生物统计学协会颁发的极大成就"半参数随机"奖&#xff0c;28岁成为哈佛最年轻的女性副教授&#xff0c;香港、美国、著名学术刊物…

lnmp_auto:自动化安装lnmp环境脚本

朋友找我在一台机器上帮忙安装下discuz。想着搭建过好几次的lnmp了&#xff0c;但是还没有使用过“一键安装”的自动化脚本&#xff0c;去网上有搜索出来&#xff0c;但是运行的时候发现用root运行别人的脚本还是真危险的事情&#xff0c;于是明白这不是个轮子&#xff0c;而是…

汇编语言之寄存器(内存访问)

1、内存中字的存储 2、ds和【address】 CPU要读写一个内存单元的时候&#xff0c;必须先给出这个内存单元的地址&#xff0c;在8086CPU中&#xff0c;内存地址由段地址和偏移地址组成&#xff0c; 其中&#xff0c;段地址存放在段寄存器DS中&#xff0c;DS称作数据段寄存器。…

JS实现图片预加载

网站开发时经常需要在某个页面需要实现对大量图片的浏览&#xff0c;如果考虑流量的话&#xff0c;大可以像pconline一样每个页面只显示一张图片&#xff0c;让用户每看一张图片就需要重新下载一下整个页面。不过&#xff0c;在web2.0时代&#xff0c;更多人愿意用javascript来…

用sort()方法随机打乱数组

2019独角兽企业重金招聘Python工程师标准>>> 我们先看一下随机数组排序的示例&#xff0c;再来研究其中的原理。 随机数组排序示例 var numbers [5, 458 , 120 , -215 , 228 , 400 , 122205, -85411]; numbers numbers.sort(function(…

Linux下部署Kubernetes+Kubesphere(一)Kubernetes基础

1.服务器规划为配置Kubesphere高可用集群&#xff0c;需要三台或三台以上机器作为Master节点&#xff0c;每台机器既可以作为Master也可以作为Worker节点。其中Master节点数量建议为单数。该示例中采用三台服务器&#xff0c;即作为Master节点也作为Worker节点&#xff0c;配置…

触发器及其应用实验报告总结_调机技巧总结: 先快后慢射胶法及其应用

戳我进入社区&#xff1a;注塑和模具人的网上家园先快后慢&#xff0c;也即先用一级快速射胶&#xff0c;射到某个设定的位置时&#xff0c;再起二级慢速射胶。这个二级起级点一般是设在射胶充型的后期&#xff0c;也即接近充型结束的位置。使用一级快速射胶&#xff0c;可以保…

汇编语言之寻址方式

&#xfeff;&#xfeff;1、内存单元和[bx]的描述 要完整地描述一个内存单元&#xff0c;需要两种信息&#xff1a;1.内存单元的地址&#xff1b;2.内存单元的长度&#xff08;即是字节单元还是字单元&#xff09;。 如&#xff1a;mov ax, [2a78] 表示将一个内存单元中的数…

命名空间的使用

namespace hunan\changsha class Person{ static $namewu_han; } namespace hunan\changsha 声明命名空间&#xff0c;它的作用包括方法&#xff0c;类名&#xff0c;常量&#xff0c;这三者都统称为元素 当在程序里使用元素的时候&#xff0c;默认在当前的命名空间里找该元素…

使用 dotnet-monitor 在 Kubernetes 中收集 .NET metrics

使用 dotnet-monitor 在 Kubernetes 中收集 .NET metricsIntrodotnet-monitor 是微软推出的一个帮助我们诊断和监控 .NET 应用程序的工具&#xff0c;在 Kubernetes 中我们可以让 dotnet-monitor 作为 sidecar 运行&#xff0c;无侵入地监控 .NET 应用&#xff0c;今天我们就来…

DOM 事件深入浅出(二)

在DOM事件深入浅出&#xff08;一&#xff09;中&#xff0c;我主要给大家讲解了不同DOM级别下的事件处理程序&#xff0c;同时介绍了事件冒泡和捕获的触发原理和方法。本文将继续介绍DOM事件中的知识点&#xff0c;主要侧重于DOM事件中Event对象的属性和方法。 那么什么是DOM事…

arcgis 分区 属性值_ArcGIS制图之Maplex自动点抽稀

制图工作中&#xff0c;大量密集点显示是最常遇到的问题。其特点是分布可能不均匀、数据点比较密集&#xff0c;容易造成空间上的重叠&#xff0c;影响制图美观。那么&#xff0c;如果美观而详细的显示制图呢&#xff1f;主要原理Maplex中对标注有很好的显示控制&#xff0c;一…

学术造假导致导师自杀,后将这段学术丑闻经历出书贩卖,一年收入上百万......

全世界只有3.14 % 的人关注了爆炸吧知识本文转自募格学术2020年2月11日&#xff0c;小保方晴子又被撤回了一篇研究论文。Tissue Engineering Part A撤稿给出的原因是&#xff1a;通过哈佛医学院正式调查后&#xff0c;无法确实其实验结果的准确性&#xff0c;尽管作者本人坚持已…

汇编语言之数据处理的2个基本问题

&#xfeff;&#xfeff;1、bx、si、di和bp Bx、si和di这3个寄存器我们已经学过了&#xff0c;现在进行一下总结&#xff0c;并学一下bp。 1&#xff1a;在8086CPU中&#xff0c;只有这4个寄存器可以用在[…]中来进行内存单元的寻址。比如&#xff0c;下面的指令都是正确 的…