一种基于一致性哈希算法的分布式数据冗余存储方法与流程

文档序号:18518522发布日期:2019-08-24 09:37阅读:327来源:国知局
本发明涉及分布式存储领域,具体涉及一种基于一致性哈希算法的分布式数据冗余存储方法。
背景技术
::当前已处于云计算广泛普及、应用繁荣发展的新阶段,数据规模呈爆炸性增长,海量数据安全高效存储成为云计算关键技术。传统存储技术,如nfs、san等,从可扩展性、容错性、可用性、部署成本等方面,已无法或很难满足海量数据(pb或eb级)的存储要求。技术实现要素:本申请公开了一种基于一致性哈希算法的分布式数据冗余存储方法,解决
背景技术
:中传统存储技术无法或很难满足海量数据存储要求的问题。根据第一方面,一种实施例中提供一种基于一致性哈希算法的分布式数据冗余存储方法,该方法包括:节点创建步骤:建立分布式存储系统中各存储节点的拓扑逻辑结构,并通过一致性哈希算法,确定各个哈希子空间所对应存储节点序列中各节点的位置;数据写入步骤:依据预存储数据冗余存储方式,确定数据份数和每一份存储数据;依据存储规则将所述每一份存储数据存储到不同的存储节点中。依据上述实施例的一种基于一致性哈希算法的分布式数据冗余存储方法,将存储数据存储到不同存储节点中,只计算一次哈希用于将对象标识映射哈希子空间,然后利用带监督的权重随机选择算法选择哈希子空间对应的存储节点列表,提高节点选择效率,进而满足海量数据存储的要求。附图说明图1为基于物理存储设备构建的集群组织架构示意图;图2为根据物理存储设备在集群组织架构中的位置添加节点的流程图;图3为哈希环划分及对象路由过程示意图;图4为节点选择总体流程图;图5为带监督的权重随机节点选择流程图。具体实施方式下面通过具体实施方式结合附图对本发明作进一步详细说明。其中不同实施方式中类似元件采用了相关联的类似的元件标号。在以下的实施方式中,很多细节描述是为了使得本申请能被更好的理解。然而,本领域技术人员可以毫不费力的认识到,其中部分特征在不同情况下是可以省略的,或者可以由其他元件、材料、方法所替代。在某些情况下,本申请相关的一些操作并没有在说明书中显示或者描述,这是为了避免本申请的核心部分被过多的描述所淹没,而对于本领域技术人员而言,详细描述这些相关操作并不是必要的,他们根据说明书中的描述以及本领域的一般技术知识即可完整了解相关操作。另外,说明书中所描述的特点、操作或者特征可以以任意适当的方式结合形成各种实施方式。同时,方法描述中的各步骤或者动作也可以按照本领域技术人员所能显而易见的方式进行顺序调换或调整。因此,说明书和附图中的各种顺序只是为了清楚描述某一个实施例,并不意味着是必须的顺序,除非另有说明其中某个顺序是必须遵循的。本文中为部件所编序号本身,例如“第一”、“第二”等,仅用于区分所描述的对象,不具有任何顺序或技术含义。而本申请所说“连接”、“联接”,如无特别说明,均包括直接和间接连接(联接)。针对
背景技术
:中提出的问题,现有技术中多采用对象存储系统(objectstoragesystem),对象存储系统作为一种具有高扩展性、高可靠性与高可用性、低成本的分布式存储系统,逐渐成为海量数据存储的良好选择。对象存储系统将数据实体作为具有唯一标识的单一对象(或将大数据实体切分为多个对象),通过节点选择算法将对象标识映射到集群中处于不同失效域的多个对象存储设备(objectstoragedevice,以下简称osd设备),对象以多副本或纠删码/再生码的方式冗余存储,从而实现高可靠性与高可用性。ceph作为一种对象存储系统(除此之外还支持文件级存储、块存储)设计了crush算法,实现对象的均衡分布。crush采用一致性哈希(一种分布式哈希算法,distributedhashingtable,dht)思想,首先将哈希空间(或称哈希环)划分为多个虚拟子空间(ceph中称为placementgroup,pg),通过哈希函数,将对象标识映射到哈希环上某一子空间pg中,然后通过crush算法,将pg映射到结构化集群中满足一定存储规则的osd列表中。crush算法具有高可扩展性、伪随机均衡分布等优点,但也有其不足之处:(1)在建立集群节点架构时,只有上级节点到下级节点(序列)的包含关系,当涉及调节叶节点,即osd设备的存储容量(权重)等参数时,从叶节点到根节点的整个遍历过程中,对于每一层级,都需要遍历整个集群找出子节点的父节点,时间复杂度为nlog(n),当集群规模较大时,效率较低;(2)节点选择过程中,对选择点下属子节点的选取无限制,直接采用哈希值伪随机选择节点,一次选择过程结束后,再判断被选设备节点是否有效,如果候选节点与已选节点发生碰撞或失效,则需要重新选择,存在重复选择次数多,选择过程收敛较慢的问题;(3)从起始选择点到最底层设备叶节点的多层选择过程中,多次计算哈希,如当节点类型为crush_bucket_straw时,每层的每个子节点都会计算哈希值,一定程度上降低了选择效率。基于上述内容,在本发明申请实施例中,提出一种基于一致性哈希算法的分布式数据冗余存储方法,采用带监督的权重随机选择算法,从集群中为预存储数据选择目标存储节点过程中,只计算一次哈希用于将对象标识映射哈希子空间,提高节点选择效率,进而满足海量数据存储的要求。实施例一:本申请公开的一种基于一致性哈希算法的分布式数据冗余存储方法,包括:步骤一、定义设备及节点属性,建立集群组织架构,以便于整个节点选择过程在结构化的集群组织图中实施,其执行流程具体包括:1).对设备及节点属性进行抽象,设备代表实际加入集群的存储设备。基于物理存储设备在集群组织架构中的位置定义节点。如图1所示,为基于物理存储设备构建的集群组织架构示意图,存储器(设备device为一种特殊节点,位于集群架构最低层,为数据最终存储位置,与普通节点区别开来)一般具有唯一标识,其在集群组织架构中位置信息包括所属主机(server)标识,机架(rack)标识,数据中心标识等。其存储器相关属性,如存储容量(权重)等。其中权重代表此设备的相对存储容量,比如假设权重1.0代表1t容量,容量为15t的设备其权重值为15.0。节点为集群组织架构的组成单元,以树形层级架构组织,其中根节点(root)为顶层节点,其为虚拟实体,代表整个集群,常为节点选择起始点。节点(除设备层之外的中间层节点)可包括但不限于主机,机架,数据中心等,其属性包括但不限于节点标识(nodeid)、节点类型(nodetype)、节点权重(weight)、子节点序列(childrennodes)、子节点权重序列(childrenweights)、父节点指针(parentnode,设备节点也有父节点指针)等,其中节点权重等于下属所有子节点权重之和,即表示节点存储容量等于下层所有子节点存储容量之和;最底层叶节点,即存储器,包括所有存储器属性,其为节点选择算法的最终选择对象。假设在一个小型集群中,有设备device、主机server、机架rack三个存储层级,增加虚拟节点root在最高层,代表整个集群,因此nodetype的取值为:{node_type_device,node_type_server,node_type_rack,node_type_root},其中每server可包含多于一个device,device的逻辑表现为挂载点或目录。为将实际存储节点区别开来,我们称存储层级最底层设备节点为设备(device),其他存储层级为节点(node)。2).将所有设备依次加入集群中,首先创建root节点,代表整个集群;对每个设备,从其所属位置的最高层级开始,如数据中心或rack等,判断节点(此待添加设备的祖先或父节点)是否存在,如不存在则创建此节点,设置其父节点(root的父节点为空),并设置其为下一个插入点,直到创建设备的直接父节点,并设置此父节点为将加入设备的插入点。3).创建设备节点,并添加到插入点,设置插入点为此设备的直接父节点。4).设置设备权重(或其它可能用于选择的属性)并修改其所有父节点(祖先节点)权重,满足父节点权重等于所有子节点权重之和,由前所述,本发明在节点属性中添加了直接父节点指针,从而使权重修改操作的时间复杂度由nlog(n)降低到log(n),加快了权重调整速度。以下具体举例说明。如图2所示,为根据物理存储设备在集群组织架构中的位置定义节点的流程图,先创建root节点,其为非实体节点,代表整个集群组织架构。则,nodeid=0,nodetype=node_type_root,weight=0,子节点及其权重序列定义为childrennodes={},childrenweights={}因此时无任何子节点,数组为空。parentnode=null(root节点位于存储层级最上层,无父节点)。再将设备逐一加入集群,首先检查设备deviceid是否已存在,若存在,则结束,继续添加下一设备。从设备所处位置的最高存储层级开始(本实施例中为rack),检查标识为(device.rackid)的节点是否存在于集群中,若不存在,则创建新节点racknode,nodeid=device.rackid,nodetype=node_type_rack,weight=0,childrennodes={},childrenweights={},parentnode=root(父节点指针),将racknode添加进其父节点root的子节点列表root.childrennodes,将其权重weight添加进root.childrenweights,将racknode设置为下一个新创建节点的插入点(即其parentnode)。检查标识为device.serverid的节点是否存在于集群中,若不存在,则创建新节点servernode,nodeid=device.serverid,nodetype=node_type_server,weight=0,childrennodes={},childrenweights={},parentnode=racknode(父节点指针),将servernode添加进其父节点racknode的子节点列表中,racknode.childrennodes,将其权重weight添加进rack.childrenweights,将servernode设置为下一个新创建节点的插入点。当设备的所有上层节点创建完毕后,便得到设备在集群中的插入点,本实施例中为servernode,创建新节点devicenode,nodeid=device.deviceid,nodetype=node_type_device,weight=0(后续步骤调整为device.weight),childrenweights={},其父节点指针parentnode=servernode,将devicenode添加进其父节点servernode的子节点列表中,servernode.childrennodes,将其权重weight添加进server.childrenweights;设备节点创建完毕后,需调整其上层节点的权重及子节点权重列表,调整上层子节点权重列表中子节点权重为对应下层子节点权重,本层节点权重等于其所有子节点权重和;本实施例中在节点结构中加入父节点指针,从而使权重的调整过程只需沿着父节点指针指向的路径,逐一修改父节点的权重weight并将子节点weight加入到其childrenweights列表即可,时间复杂度为o(log(n))。所有设备添加后,集群架构初始创建完毕,如图1所示,集群含有2个rack,每rack有2个server,每server有2个device。步骤二、依据集群组织架构建立存储规则。依据预存储数据冗余存储方式,确定数据份数和每一份存储数据。依据集群组织架构建立存储规则,作为后续权重随机选择算法的监督规则。先确定预存储数据的总副本数,然后确定每一存储层级允许存储的最大副本数,最后建立节点类型与最大存储副本数的映射关系表。其中,设定存储层级与节点类型相对应,映射关系表中包括为对象允许存储的最大副本数与对应的节点类型的节点允许被选择的最大次数相对应。其执行流程具体包括:1).冗余存储方式采用多副本模式时,确定预存储数据的总副本数n,此值与存储集群采用的数据冗余策略有关,n为预存储数据的预设的总副本数,每一份存储数据为预存储数据或其副本。冗余存储方式采用纠删码(n,k)模式时,将预存储数据切分为k数据块,编码成n编码块,n为对预存储数据编码后的总编码块数。数据份数则为总编码块数,每一份存储数据对应一个编码块。2).确定每一存储层级(即节点类型,包括主机、机架、数据中心、集群代表root等)允许存储的最大副本数;这个由集群规模、失效域定义(如支持单/多主机、机架、数据中心失效等)、存储位置偏好(是否要求就近存放)等决定,部署时根据实际情况确定;对于一般情况,如采用多副本模式,root节点必然保存所有n副本,若其下层节点(即子节点)数为m,则可设置其每个子节点最多存放⌈n/m⌉(不小于n/m的整数)副本。3).建立存储规则,本实施例中定义一种存储规则为节点类型与最大存储副本数映射关系表,即key-valuemap,其中key为节点类型,value为对象允许存储的最大副本数。失效域定义具体指支持单/多主机、机架和/或数据中心失效。数据冗余模式具体指多副本、纠删码和/或再生码。我们称某一规定长度的数据段为对象(object),对象为数据副本或编码的基本单元,对象存储于哈希子空间中,后者为节点选择主体。建立存储规则的具体步骤,首先,确定预存储数据总副本数n。在分布式存储系统中,通过增加数据冗余提高数据安全性。常用数据冗余方式有多副本、纠删码/再生码等,多副本方式保存对象的n份副本于集群不同位置,纠删码将对象切分为k数据块,编码后形成n编码块,然后将n编码块保存于集群不同位置。本示例中假设使用3副本模式,即n=3。其次,确定每一存储层级(本实施例中,包括设备device,主机server、机架rack、root)允许存储的最大副本数。每一层级最大副本数的确定,由集群规模、故障域划分及其数量、是否设置存储位置偏好等因素决定。本实施例考虑3副本模式的一般情况,规定一个rack中保存的副本数不大于2,每server或device最多保存一个副本。如下表所示,为节点选择监督规则表:存储等级类型名类型值允许存储最大副本数备注rootnode_type_root33副本总数nracknode_type_rack22servernode_type_server11devicenode_type_device01最后,建立节点类型与最大存储副本数映射关系表,设置:roottypetimes=3,racktypetimes=2,servertypetimes=devicetypetimes=1。因为root代表整个集群,所以存放副本数目为n=3。步骤三、定义哈希环参数,依据所述存储规则,利用带监督的权重随机选择算法,从集群中为预存储数据选择目标存储节点序列。在建立结构化集群组织图和存储限制规则后,便可执行带监督的一致性哈希节点权重随机选择算法。首先确定起始选择点,从起始选择点开始,对于每一存储层级,依据存储规则限制,根据节点权重值,随机选择合适节点,直到集群组织架构的叶节点,从叶节点中选择合适的设备节点。哈希环参数包括哈希空间长度、哈希子空间长度、哈希子空间数量和采用的哈希函数hash。哈希子空间长度对应同样长度的哈希值范围,邻接且不相交,共同组成整个哈希空间。预存储数据带有唯一的标识,通过计算其标识哈希值,映射到唯一哈希子空间。其执行流程包括:1).定义哈希环参数,包括哈希空间长度l(即哈希值长度,如32bits)、哈希子空间长度sl、采用的哈希函数等,其中根据l和sl可得哈希子空间总数sn=2(l-sl)。2).根据对象标识objectid寻址其所属哈希子空间,其为对象标识的哈希值取模哈希子空间总数,即subspace=hash(objectid)%sn。3).选择起始点,可从任意存储层级节点开始,对于初始选择,一般从root节点开始,为subspace选择n存储设备,因为subspace为数据冗余基本单元,多个对象可映射进同一subspace。4).从选择点开始,对于每一存储层级,依据存储规则限制,根据子节点权重值,随机选择合适子节点,直到集群架构树的最底层叶节点,最后从叶节点中选择合适的设备节点;本发明在此处的创新点在于,在每一层级选择时,首先判断子节点是否已达到存储规则限制,即被选择次数是否超过最大允许次数,若达到限制,则排除子节点,如果此层级所有子节点都已达到存储限制,则排除整个层级(即父节点);当在最底层设备节点中选中合适的节点时,首先更新(加1)其选中次数,然后更新其父路径上直到root节点所有节点的被选择次数(子节点被选中代表其所有祖先节点也被选中)。简单理解为,起始选择点为选择算法的起始入口,从根节点开始,也可从任意存储层级节点开始,每一个存储层级指定所述节点被允许选择的最大次数。选择起始选择点从最高选择点开始,逐层往下选择,每一层被选出的节点作为新的入口点,重复层级节点选择过程,直到叶节点。若有合适设备被选中,则更新此设备及其所有父节点的被选择次数。判断子节点是否已达到存储规则限制,若达到限制,则排除此子节点;若此层级所有子节点都已达到存储限制,则排除子节点的父节点。在子节点列表中选择节点过程中,采用依据子节点的权重值进行选择。根据存储规则,先排除不符合条件的节点,不符合条件的节点具体可以指节点已达到存储限制。5).当已选择设备数等于指定值(如n),或者尝试选择的次数大于某设置阈值时,则停止搜索,若无足够满足存储规则的设备(如集群规模设备数太少或集群存储分配不均衡),此时可从集群设备随机挑选仍欠缺数目设备节点,可以优先从未被选择的设备中选择。以下举例说明,利用带监督的节点权重随机选择算法,从集群中为预存储数据选择目标存储节点(设备)序列。首先,定义哈希环参数,本实施例中定义哈希空间长度l=32bits,即哈希空间为:[0,232-1],每哈希子空间的长度为sl=20bits,哈希子空间数量sn=2(32-20)=212,采用的哈希函数为murmur3,其输出哈希值为32位整数。然后计算对象哈希值,定位哈希子空间:objecthash=murmur3(objectid),利用哈希函数计算对象id哈希值;hashsubspacevalue=objecthash%sn,定位哈希子空间,同一哈希子空间对应相同的目标设备列表。如图3所示,为哈希环划分及对象路由过程示意图,展示哈希环划分及哈希子空间节点序列路由过程,其中每个对象对应一个哈希子空间,哈希子空间映射到多设备节点,每存储设备被分配多个哈希子空间。然后,确定起始选择点,可从集群任意点开始,在其下层级子节点序列中,选择符合存储规则的指定数量的设备。本实施例中,假设从root节点开始,为对象(即对应哈希子空间hashsubspacevalue)选择3个设备节点。最后,从选择点开始,对于每一存储层级,依据存储规则限制,根据节点权重值,随机选择合适节点,直到集群架构树的最底层叶节点,从叶节点中选择合适的节点(即存储设备),如图4所示,为节点选择总体流程图,具体实施步骤:获取存储规则,即节点类型与节点最大被选择次数(本事实例中为存储最大副本数)映射关系表。初始化节点标识nodeid与节点被选择次数映射表selectednodetimesmap,本示例从root节点开始进行全新选择过程,则selectednodetimesmap为空,即无任何已被选节点。设置从选择点开始的要选择节点的数目replicasnumber:本实施例中,从root开始,则replicasnumber=n=3。采用深度优先搜索方式,从root节点开始,每选择一个下层节点,则以此节点为选择点,重复选择过程,直到选择一个合适的设备节点device,然后返回到起始选择点。根据存储规则带监督的选出一个节点,判断其节点类型是否为设备且节点标识有效。若是,则判断其被选择次数是否超过最大允许被选次数typemaxselectionnumber。若超过,则选择发生碰撞,返回无效节点标识node_item_invalid。若未超过,更新selectednodetimesmap中此节点标识的被选择次数,返回设备的节点标识nodeid。若选择的节点类型为非设备,则以此节点为选择点,重复进入下一层级的节点选择过程。每一次节点选择过程返回时,若选择的节点标识不等于node_item_invalid(无效节点),则更新selectednodetimesmap中此节点的被选择次数;进一步,每次成功选择一个设备节点时,都会更新此设备节点及其所有祖先节点直到root节点的被选择次数,即更新监督规则;当选择的设备节点数等于replicasnumber,或者尝试选择的次数大于某设置阈值(如当集群规模较小时,设置为集群设备数目的2倍,实际可能只需略大于replicasnumber即可),则停止搜索,若无足够满足存储规则的设备(假设已选replicasnumberselected),此时可优先从集群未选设备中,随机挑选(replicasnumber-replicasnumberselected)设备节点。其中,每一层级的节点选择过程如图5所示,为带监督的权重随机节点选择流程图,其具体执行流程为:获取选择点selectingnode子节点childrennodes的节点类型及存储规则中限定的此子节点类型允许被选的最大次数typemaxselectionnumber,此即为本发明带监督节点选择算法的监督规则,每次选择范围限定在符合存储规则的候选子节点内,避免随机选择后再去判断节点是否为合适节点的过程,从而减少重复选择次数,加快选择收敛速度。如果selectingnode的子节点列表childrennodes只有一个节点,则判断此子节点被选择次数是否超过此类型节点最大选择次数typemaxselectionnumber,若没有,则选择此唯一子节点,返回此子节点指针。否则,设置此selectingnode的选择次数为typemaxselectionnumber,关闭此选择点。若selectingnode的子节点列表childrennodes存在多于一个节点,则继续。对于子节点列表childrennodes中的每一个节点,计算其权重和totalweight,此过程中排除已被选择次数超过其类型对应的最大选择次数typemaxselectionnumber的节点。如果totalweight=0,则无合适节点,返回空节点指针null,否则,继续。生成随机数randomweight,并对totalweight取模,即randomweight=rand()%totalweight。依次累加childrennodes中节点权重,直到权重和hitsumweight>=randomweight,记录此时被累加的子节点索引childindex。返回childrennodes[childindex],此为被选中节点。基于上述实施例,本申请公开了一种基于一致性哈希算法的分布式数据冗余存储方法,本方法由于在集群节点中加入父节点指针,从而使节点属性设置或调整的效率提升,表现为时间复杂度由nlog(n)降低到log(n)。同时在节点选择过程中,加入监督规则,事先排除不符合条件的节点,从而避免或减少随机选择后碰撞几率,减少重试选择次数,加快节点选择速度。另外每一层级子节点选择时,用面向每层级的(单次)随机函数取代面向每层级所有子节点的(多次)哈希值计算,进一步提高节点选择效率。本方法加快了存储设备属性调整时间,当集群节点状态发生变化时,如因故障导致离线、节点增加、节点移除时,可提供更快的响应速度,从而减少系统修复或负载均衡时间。另外由于节点选择效率的提升,加快了数据访问时对象寻址过程,从而可提高数据访问速度和存储系统吞吐量。以上应用了具体个例对本发明进行阐述,只是用于帮助理解本发明,并不用以限制本发明。对于本发明所属
技术领域
:的技术人员,依据本发明的思想,还可以做出若干简单推演、变形或替换。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1