专利名称:一种云存储中数据均衡分布方法
技术领域:
本发明属于云存储领域,具体涉及一种云存储中数据如何均衡分布的策略。
背景技术:
云存储是在云计算(cloud computing)概念上延伸和发展出来的一个新的概念。 它是指通过集群应用、网格技术或分布式文件系统等功能,将网络中大量各种不同类型的存储设备通过应用软件集合起来协同工作,共同对外提供数据存储和业务访问功能的一个系统。当云计算系统运算和处理的核心是大量数据的存储和管理时,云计算系统中就需要配置大量的存储设备,那么云计算系统就转变为一个云存储系统,所以云存储是一个以数据存储和管理为核心的云计算系统。云存储就如同云状的广域网和互联网一样,对使用者来讲,并不是指一个具体的存储节点,而是指一个由许许多多个存储节点所构成的一个集合体。而只有均勻分布数据才可以保证负载均衡和云存储系统良好的可扩展性。因此,在云存储系统中,如何均衡分布用户存储的数据是其中一项非常关键的技术。目前,在分配存储的数据时,一般是采用一致性哈希方法。该方法分两步进行首先求出存储节点的哈希值,将该存储节点映射到环上的一个存储节点(环上的每个点代表一个哈希值);接着计算数据的哈希值,按顺时针方向将其映射到环上距其最近的存储节点。添加新设备存储节点时,按照上述规则,调整相关数据到新的存储节点上。删除存储节点和添加存储节点过程相反。使用一致性哈希方法分配数据的好处是每个存储节点只需要处理落在它和它的前驱存储节点之间的数据,这样在增加/删除设备存储节点时系统振荡较小。但是一致性哈希函数是一种随机性的函数,在存储节点数量较少的情况下很可能造成环上存储节点分布的不均勻,导致负载不均勻因为在选择存储节点位置时,并没有考虑不同存储节点的性能差异。
发明内容
为了解决这些问题,本发明在每个存储节点中引入“虚拟节点”(partition)的概念。一个云存储系统中有大量的“虚拟节点”,每个“虚拟节点”属于某一个实际的存储节点,一个存储节点可以拥有多个“虚拟节点”,且一个存储节点的性能取决于它所拥有的“虚拟节点”的个数。而每个存储节点所拥有的“虚拟节点”的个数又取决于该存储节点的权值 (weight),系统中总的“虚拟节点”个数是固定的,在云存储系统初始化时确定。本发明在保证了可用性和可靠性的前提下,可以在很大程度上提高用户数据分布的均衡性,具有较高的实用价值和商业价值。本发明的目的在于提供一种云存储系统中数据均衡分布的方法,旨在解决现有云存储系统中不同存储节点的数据分布不均衡的问题。本发明所涉及的云存储系统中数据均衡分布的方法包括下述步骤
1、设置当前云存储系统总的“虚拟节点”(partition)个数,副本个数(默认为 3);2、设置当前云存储系统中各个存储节点的分布权值(weight),该值大小由存储节点的存储能力决定,取值范围为weight >= 0,即存储节点的存储能力与该值成正比;3、根据当前云存储系统中总的虚拟节点个数,副本个数以及各个存储节点的分布权值,确定每个存储节点的待分配虚拟节点个数;4、根据当前云存储系统中每个存储节点的待分配虚拟节点个数,采用一定的策略,将所有虚拟节点的三个副本均衡地分布到存储节点上,并使每个虚拟节点的副本分布在不同的存储节点上;5、当有数据需要存储时,通过哈希函数,将该数据映射到某个虚拟节点,然后将该数据的三个副本分别存放在已获取的虚拟节点的三个副本中;6、当云存储系统中添加或者移除存储节点时,获取要重新分配的虚拟节点信息, 重新计算每个可用存储节点的待分配虚拟节点个数,然后重新分配这些虚拟节点。
图1为本发明初始化虚拟节点均衡分布流程图;图2为本发明云存储系统中数据、虚拟节点和存储节点映射关系图。
具体实施例方式为了使本发明的目的、技术方案及有益效果更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。以下1 4步骤讲述云存储系统中初始化均衡分布虚拟节点的内容,具体实现流程如图1所示。1、设置当前云存储系统的总虚拟节点个数及虚拟节点的副本个数。通常情况下, 为了保证数据分布的均衡性,平均每个存储节点上的虚拟节点个数最好都在100以上。各个存储节点上虚拟节点个数相加为当前云存储系统拟总虚拟节点个数;除此之外,当前云存储系统总的虚拟机节点个数满足以下条件当前云云存储系统总的虚拟节点个数为2的 η次方,其中,η的取值为大于等于1且小于等于31的整数。每个虚拟节点副本个数在2个以上,在本实施例中存储节点副本个数取为3个。2、设置当前云存储系统中每个存储节点的分布权值(weight)。该值表示节点的性能。一般分布权值(weight)的值与该存储节点的存储能力成正比。存储能力越强,容量越大,该值越大;反之越少。3、根据1和2设置的参数值,分配每个存储节点的虚拟节点个数1)平均每个分布权值应该分配的虚拟节点个数,用partS_Weight表示parts_weight =总虚拟节点个数*副本个数/所有存储节点weight值相加和;2)第i个存储节点的待分配虚拟节点个数(partS_Wanted[i])为,1)中获取的 parts_weight*该存储节点的分布权值weight,即parts_wanted[i] = Parts_weight* 该存储节,点的 weight 权值;
3)初始化每个存储节点已分配虚拟节点个数为0,即parts_assigned[i] = 0,i = 0,1,.......4、根据当前云存储系统中各个存储节点的待分配虚拟节点个数partjanted数值,决定每个存储节点上的虚拟节点分布,所述虚拟节点使用一个3*n的二维数组表示,即 replica2part2node [replica] [partitions],胃中,replicai ^ giJ^W id 号 nl, nl的取值范围为大于等于零且小于虚拟节点副本总数,默认副本数为3 ;partitions为虚拟节点的id号π2,η2的取值范围为大于等于零且小于虚拟节点总数。本发明确保每个虚拟节点的三个副本分布在不同的存储节点上,保证数据的可用性和可靠性;详细的步骤如下对于当前云存储系统中每个虚拟节点,执行以下步骤1)对所有可用的存储节点,根据partsjanted值,进行从小大到的排序。为了防止出现partsjanted值相同的情况,取(0,0xffff)之间的一个随机值,添加到part_ wanted的小数点后面。这样一般情况下不会出现值相同的情况;2)从1)的排序结果中,找出part_Wanted值最大的存储节点,用于存放当前虚拟节点的第一个副本。并对该节点进行标记,以防止另外的任何一个副本存放在该存储节点上;3)对幻中选择的节点的partjanted值减去1,已分配出去的虚拟节点个数 parts_assigned 值力口 1 ;4)数据的第二个副本,第三个副本的分布方法同上所述,确保将其分配在parts_ wanted值最大且与另外两个副本不同的存储节点上;5)重复1),对所有可用存储节点进行排序。正常下,经过以上步骤,当前云存储系统中每个存储节点的partsjants值变为 0,M parts_assigned 为 parts_wanted5、当有数据需要存储时,通过哈希函数,将该数据映射到某个虚拟节点,然后将该数据的三个副本分别存放在已获取的虚拟节点的三个副本所在存储节点上,如图2所示, 具体的执行步骤如下(1)根据数据的用户信息、目录信息、对象信息,通过哈希函数计算该数据对象的哈希值;(2)根据(1)获取的哈希值,再计算映射的虚拟节点值,具体计算方法为哈希值由字符串转换为整型数组后,将数组中的第1个整数值右移shift位,shift的值设置为 32-n,其中η为步骤1中的η值;(3) Iflig replica2part2node[replica] [partitions] (replica 为虚拟节点副本的id号,默认副本数为3,partitions为虚拟节点的id号),获取2)得到的 part三个副本所在存储节点;(4)最后,上传数据的三个副本至相应存储节点上相应的虚拟节点part中。6、当云存储系统中添加或者移除存储节点时,获取要重新分配的虚拟节点信息, 重新计算每个可用存储节点的待分配虚拟节点个数,然后重新分配这些虚拟节点。以下分别从移除存储节点和新增存储节点两个方面讲述如何重新分配虚拟节点。6. 1、当移除其中一个或多个存储节点时,详细步骤如下所示
1)重设被移除存储节点的weight值为0 ;并将其添加到被移除节点队列中,该队列用 remove_nodes 表不;2)重新分配当前云存储系统中可用存储节点的partsjants值平均每个weight应该分配的虚拟节点个数为parts_weight =总虚拟节点个数*副本个数/所有存储节点weight值相加和;第i个可用存储节点的待分配虚拟节点个数(partsjantedti])为parts_wanted[i] = Parts_weight氺该存储节点的 weight 权值-parts_ assigned[i], i =0,1,......;3)最后执行重新均衡操作(rebalance),详细操作步骤见6. 3。6. 2、当向当前云存储系统添加一个或多个存储节点时,详细步骤如下所示1)首先判断新添加进来的节点是否已经存在于当前云存储系统中,如果重复添力口,则报出异常;2)根据传进来的参数,获取新添加存储节点的weight值;并初始化该节点的 parts_assigned为0 ;将其添加到可用存储节点序列中;3)重新分配当前云存储系统中可用存储节点的partsjants值平均每个分布权值weight应该分配的虚拟节点个数为Parts_weight =总虚拟节点个数*副本个数/所有存储节点weight值相加和;第i个可用存储节点的待分配虚拟节点个数(partS_Wanted[i])为parts_wanted[i] = Parts_weight氺该存储节点的 weight 权值-parts_ assigned[i],i =0,1,......由于新增存储节点,那么正常情况下,Parts_weight*该存储节点的weight权值会小于 parts_assigned[i],因此,parts_wanted[i]为负值,艮口 <0 ;4)最后执行均衡rebalance操作,详细操作步骤见6. 3。6. 3、重新均衡各个可用存储节点的数据分布状况,步骤如下获取当前云存储系统中要重新分配的虚拟节点信息,步骤如下A、判断被移除节点队列,即removejodes队列是否为空,若非空,则执行以下步骤;B、遍历每个虚拟节点的每个副本,查看该副本所在的存储节点是否属于被移除节点队列,即removejodes队列。如果属于,则取消该副本与该存储节点的映射关系,将该虚拟节点添加到reassigruparts队列中,设置该虚拟节点该副本的存储节点id位为 Oxffff ;C、遍历每个虚拟节点的每个副本,查看该副本距离上次被移动的时间值。如果该值大于某个最小移动时间值,比如M小时,并且该副本所在存储节点的partsjanted值小于0,则将该副本添加到reassigruparts队列中,设置该虚拟节点该副本的存储节点id位为 Oxffff ;D、对当前云存储系统中需要重新分配虚拟节点,进行重新分布,步骤如下A)、对所有可用的存储节点,根据partsjanted值,进行从小大到的排序。为了防止出现partsjanted值相同的情况,取(0,Oxffff)之间的一个随机值,添加到part_ wanted的小数点后面。这样一般情况下不会出现值相同的情况;对于reassigned_parts队列中的每个part执行以下步骤B) D),
8
B)、遍历该part的每个副本,查看副本的存储节点id位是否为Oxffff,如果是,则从A)的排序结果中,找出partjanted值最大且与其他两个副本不同存储节点的节点,用于存放当前虚拟节点的这个副本;并对该节点进行标记,以防止另外的任何一个副本存放在该节点上;C)、对B)中选择的节点的part_wanted值减去1,已分配出去的parts_assigned 值加1 ;D)、重复A),重新对所有可用存储节点进行排序。以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所做的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
权利要求
1.一种云存储系统中用户数据均衡分布的方法,其特征在于,其包括下述步骤1)设置当前云存储系统总的虚拟节点个数及虚拟节点的副本个数;2)设置当前云存储系统中各个存储节点的分布权值,以下用weight表示分布权值,该值大小由存储节点的存储能力决定,取值范围为weight >= 0,即存储节点的存储能力与该值成正比;3)根据当前云存储系统中总的虚拟节点个数、副本个数以及各个存储节点的分布权值,确定每个存储节点的待分配虚拟节点个数;4)根据当前云存储系统中每个存储节点的待分配虚拟节点个数,将所有虚拟节点的副本均衡地分布到存储节点上,并使每个虚拟节点的副本分布在不同的存储节点上;5)当有数据需要存储时,通过哈希函数,将该数据映射到某个虚拟节点,然后将该数据的各副本分别存放在已获取的虚拟节点的各副本中;6)当云存储系统中添加或者移除存储节点时,获取要重新分配的虚拟节点信息,重新计算每个可用存储节点的待分配虚拟节点个数,然后重新分配这些虚拟节点。
2.如权利要求1所述的方法,其特征在于在所述步骤1)中,平均每个存储节点上的虚拟节点个数在100以上,且每个虚拟节点副本个数在2个以上。
3.如权利要求1所述的方法,其特征在于在所述步骤1)中,存储节点副本个数为3 个;各个存储节点上虚拟节点个数相加为当前云存储系统总虚拟节点个数,且当前云存储系统总的虚拟节点个数为2的η次方,η的取值为大于等于1且小于等于31的整数。
4.如权利要求1所述的方法,其特征在于在所述步骤3)中,分配每个存储节点的虚拟节点个数的步骤如下(1)首先计算平均每个分布权值应该分配的虚拟节点个数,用partS_weight表示parts_weight =总虚拟节点个数*副本个数/所有存储节点分布权值weight相加和;(2)第i个存储节点的待分配虚拟节点个数partS_wanted[i]为(1)中获取的parts_ weight*该存储节点的分布权值weight,即parts_wanted[i] = Parts_weight* 该存储节点的分布权值 weight ;(3)初始化每个存储节点已分配虚拟节点个数partsjssigned为0,即parts_ assigned[i] = 0, i =0,1,......;
5.如权利要求3中所述的方法,其特征在于在所述步骤4)中,根据当前云存储系统中各个存储节点的待分配虚拟节点个数partjanted数值,决定每个存储节点上的虚拟节点分布,详细的步骤如下对于当前云存储系统中每个虚拟节点,执行以下步骤(1)取(0,Oxffff)之间的一个随机值,添加到待分配虚拟节点个数part_wanted的小数点后面以防止出现待分配虚拟节点个数parts_Wanted值相同的情况,然后对所有可用的存储节点,根据待分配虚拟节点个数parts^anted值,进行从小大到的排序;(2)从⑴的排序结果中,找出待分配虚拟节点个数partjanted值最大的存储节点, 用于存放当前虚拟节点的第一个副本,并对该存储节点进行标记,以防止另外的任何一个副本存放在该存储节点上;(3)对(2)中选择的存储节点的待分配虚拟节点个数partjanted值减去1,已分配出去的虚拟节点个数parts_assigned值加1 ;(4)数据的第二个副本,第三个副本的分布方法同上所述,以将其分配在待分配虚拟节点个数partsjanted值最大且与另外两个副本不同的存储节点上;(5)重复(1),对所有可用存储节点进行排序。
6.如权利要求3中所述的方法,其特征在于在所述步骤5)中,当有数据需要存储时, 通过哈希函数,将该数据映射到某个虚拟节点,然后将该数据的三个副本分别存放在已获取的虚拟节点的三个副本所在存储节点上,具体的执行步骤如下(1)根据数据的用户信息、目录信息、对象信息,通过哈希函数计算该数据对象的哈希值;(2)根据(1)获取的哈希值,再计算映射的虚拟节点值,具体计算方法为哈希值由字符串转换为整型数组后,将数组中的第1个整数值右移shift位,shift的值设置为32-n ;(3)获取( 得到的虚拟节点part三个副本所在存储节点;(4)然后,上传数据的三个副本至相应存储节点上相应的虚拟节点part中。
7.如权利要求1中所述的方法,其特征在于在所述步骤6)中,当移除其中一个或多个存储节点时,需要重新分配虚拟节点,详细步骤如下(1)重设被移除存储节点的分布权值weight值为0,并将其添加到被移除节点队列中;(2)重新分配当前云存储系统中可用存储节点的待分配虚拟节点个数partsjants值平均每个分布权值weight应该分配的虚拟节点个数为 parts_weight =总虚拟节点个数*副本个数/所有存储节点weight值相加和; 第i个可用存储节点的待分配虚拟节点个数parts_wanted[i]为 parts_wanted[i] = Parts_weight氺该存储节点的 weight 权值-parts_assigned[i], i = 0,1,......;(3)然后执行重新均衡操作。
8.如权利要求1中所述的方法,其特征在于在所述步骤6)中,当向当前云存储系统添加一个或多个存储节点时,需要重新分配虚拟节点,详细步骤如下(1)首先判断新添加进来的节点是否已经存在于当前云存储系统中,如果重复添加,则报出异常;(2)根据传进来的参数,获取新添加存储节点的分布权值weight;并初始化该节点的已分配虚拟节点个数parts^ssigned为0 ;将其添加到可用存储节点序列中;(3)重新分配当前云存储系统中可用存储节点的待分配虚拟节点个数partsjants值平均每个分布权值weight应该分配的虚拟节点个数为 parts_weight =总虚拟节点个数*副本个数/所有存储节点weight值相加和; 第i个可用存储节点的待分配虚拟节点个数parts_wanted[i]为 parts_wanted[i] = Parts_weight氺该存储节点的 weight 权值-parts_assigned[i], i = 0,1,......;(4)然后执行重新均衡操作。
9.如权利要求7或8中所述的方法,其特征在于重新均衡各个可用存储节点的数据分布状况的实现步骤如下①获取当前云存储系统中要重新分配的虚拟节点信息,步骤如下A、判断被移除节点队列是否为空,若非空,则执行以下步骤;B、遍历每个虚拟节点的每个副本,查看该副本所在的存储节点是否属于被移除节点队列;如果属于,则取消该副本与该存储节点的映射关系,将该虚拟节点添加到reassigru parts队列中,设置该虚拟节点该副本的存储节点id位Oxffff ;C、遍历每个虚拟节点的每个副本,查看该副本距离上次被移动的时间值,如果该值大于一个预定的最小移动时间值,并且该副本所在存储节点的待分配虚拟节点个数parts_ wanted值小于0,则将该副本添加到reassigr^parts队列中,设置该虚拟节点该副本的存储节点id位为Oxffff ;②对当前云存储系统中需要重新分配虚拟节点,进行重新分布,步骤如下A、首先取(0,0xffff)之间的一个随机值,添加到partjanted的小数点后面以防止出现partsjanted值相同的情况,然后对所有可用的存储节点,根据待分配虚拟节点个数 parts_wanted值,进行从小大到的排序;并对于reassigned—parts队列中的每个part执行以下步骤B D ;B、遍历该part的每个副本,查看各副本的存储节点id位是否为OxfTfT,如果是,则从 A的排序结果中,找出待分配虚拟节点个数partjanted值最大且与其他两个副本不同存储节点的节点,用于存放当前虚拟节点的这个副本,并对该节点进行标记,以防止另外的任何一个副本存放在该节点上;C、对B中选择的节点的待分配虚拟节点个数partjanted值减去1,已分配出去的已分配虚拟节点个数parts_assigned值加1 ;D、重复A,对所有可用存储节点进行排序。
全文摘要
一种云存储系统中用户数据均衡分布的方法,包括设置云存储系统总的虚拟节点个数、副本个数;设置云存储系统中各个存储节点的分布权值;根据云存储系统中总的虚拟节点个数、副本个数以及各个节点的分布权值确定每个存储节点的待分配虚拟节点个数;根据云存储系统中每个节点的待分配虚拟节点个数,将所有虚拟节点的三个副本均衡地分布到不同的存储节点上;当有数据需要存储时,通过哈希函数,将该数据映射到某个虚拟节点,然后将该数据的三个副本分别存放在已获取的虚拟节点的三个副本中。当云存储系统中添加或者移除存储节点时,获取要重新分配的虚拟节点信息,重新计算每个可用存储节点的待分配虚拟节点个数,然后重新分配这些虚拟节点。
文档编号H04L29/08GK102457571SQ20111027297
公开日2012年5月16日 申请日期2011年9月15日 优先权日2011年9月15日
发明者兰雨晴, 夏颖, 宋潇豫, 张永军, 李俊丽 申请人:中标软件有限公司