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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

nvm用标准sata ahci码_能者多劳!让NVMe固态硬盘做系统盘的同时,加速SATA数据盘...

不知不觉当中,固态硬盘已经取代机械硬盘成为主流。越来越多的玩家已经淘汰机械盘,使用NVMeSATA的固态硬盘高低搭配。既然是高低搭配,就一定会有性能差距,是否能从NVMe固态硬盘中划分出一小部分空间来给SATA固态硬盘加速&#xff0…

天了噜!定义static字段还有顺序要求?

前言前段时间,发现一个bug,代码结构类似下面的示例。你能说出这段代码的正确返回结果吗?class Program {private static int a1 a2;private static int a2 Init();private static int Init(){return 123;}static void Main(string[] args){…

汇编语言之转移指令和原理

1、引言 可以修改IP,或同时修改CS和IP的指令统称为转移指令。概括地讲,转移指令就是可以控制CPU执行内存 中某处代码的指令。 8086CPU的转移行为有以下几类: 1. 同时修改CS和IP时,称为段间转移&#…

【高德地图开发2】---配置工程

1.从网站下载开发包并解压。 3D地图包解压后得到:3D地图显示包“Android_Map_2.x.x.jar ”和文件夹“ armeabi ”(以 V2.2.0为例,含 - libamapv302.so 和 libmapv302ex.so 文件)。2D地图包解压后得到:2D地图显示包“An…

antd option宽度自适应_建议收藏:Axure手机自适应教程

hello,我又来啦,今天和大家分享用axure怎么做自适应,也就是说,我们做app端的作品时,怎么在不同的手机尺寸,显示最佳的样式。那么这期的话,我会以一个游戏的案例来展开,所以比较好玩。…

安装pip

2019独角兽企业重金招聘Python工程师标准>>> linux系统安装pip: 1.下载get-pip.py wget https://bootstrap.pypa.io/get-pip.py 2.安装pip python get-pip.py windows系统安装pip,这里使用easy_install: 1.首先在命令行切换到easy_install.exe所在的Scri…