一种基于一致性哈希算法的分布式存储方法

文档序号:6550606阅读:220来源:国知局
一种基于一致性哈希算法的分布式存储方法
【专利摘要】本发明公开了一种基于一致性哈希算法的分布式存储方法,属于分布式数据库存储【技术领域】,包括以下步骤:S1:将哈希数值空间设置成一个首尾相接的圆环;S2:把对象映射到哈希数值空间;S3:把高速缓冲存储器Cache映射到对象映射到的同一个哈希数值空间,并且使用相同的哈希算法;S4:把对象映射到Cache;S5:移除Cache或者添加Cache。本发明的有益效果如下:数据检索效率高,每次检索时,在相应的服务器中就能得到相应的数据,快速地进行响应;当增加或减少服务器时,不会对已有的分布式环境造成太大的影响,只会对部分数据的存储产生影响,并且哈希服务器不会改变。
【专利说明】一种基于一致性哈希算法的分布式存储方法

【技术领域】
[0001] 本发明属于分布式数据库存储【技术领域】,具体涉及基于一致性哈希算法的分布式 存储方法。

【背景技术】
[0002] 随着云时代的来临,大数据吸引了越来越多的关注。大数据通常用来形容一个公 司创造的大量非结构化和半结构化数据,这些数据在存储到数据库时会花费过多时间。大 数据常和分布式系统联系到一起,因为实时的大型数据集存储需要像编程模型Map Reduce 一样的框架向数百上千的电脑分配工作。
[0003] 传统的分布式系统,对于这些大数据如果只是简单的进行哈希运算,再进行分布 式处理,那么当分布的服务器的数量频繁地增加或删除时,哈希结果会重新计算重新生成。 这将导致所读取数据的服务器进行变换,服务器中的高速缓冲存储器Cache全部作废,从 而降低服务器的响应速度,给用户带来非常不好的体验,并且服务器也面临着巨大考验。


【发明内容】

[0004] 本发明针对现有技术的不足,提供了一种基于一致性哈希算法的分布式存储方 法,使得大数据的存储更加灵活方便,检索更加快捷。
[0005] 为了实现以上发明目的,本发明采取的技术方案如下:一种基于一致性哈希算法 的分布式存储方法,包括以下步骤:
[0006] S1 :将哈希数值空间设置成一个首尾相接的圆环;
[0007] S2 :通过哈希函数计算出哈希值Key在环上的分布,把对象映射到哈希数值空间;
[0008] S3 :把高速缓冲存储器Cache映射到对象映射到的同一个哈希数值空间,并且使 用相同的哈希算法;
[0009] S4 :把对象映射到Cache :沿着圆环的顺时针方向从对象的Key值出发,直到遇见 一个Cache,那么就将该对象存储在这个Cache上;
[0010] S5 :移除 Cache 或者添加 Cache。
[0011] 作为优选:S1所述的哈希数值空间是一个首(0)尾(2~32-1)相接的圆环。
[0012] 作为优选:S3所述的Cache的哈希计算方法如下:使用Cache的IP地址或者 Cache的机器名称作为哈希输入。
[0013] 作为优选:所述步骤还包括S6 :加入虚拟节点;虚拟节点是实际节点在哈希数值 空间的复制品,一个实际节点对应了至少一个虚拟节点,这个对应个数就是复制个数,虚拟 节点在哈希数值空间中以Hash值排列。
[0014] 作为优选:虚拟节点的哈希计算采用对应节点的IP地址加数字后缀的方式。
[0015] 作为优选:所述的S2有4个对象objectl?object4,通过哈希函数计算出哈希 值Key在环上的分布,
[0016] Hash (objectl) = Keyl ;
[0017] Hash (object2) = Key2 ;
[0018] Hash (ob ject3) = Key3 ;
[0019] Hash (ob ject4) = Key4〇
[0020] 作为优选:所述的S3有A、B、C共3台Cache,在哈希数值空间中以对应的Hash值 排列;
[0021] Hash (Cache A) = Key A ;
[0022] Hash (Cache B) = Key B ;
[0023] Hash (Cache C) = Key C〇
[0024] 作为优选:S4所述的把对象映射到Cache :对象objectl存储到Cache A上; object2 和 object3 存储到 Cache C ;object4 存储到 Cache B。
[0025] 本发明的有益效果如下:
[0026] 1.数据检索效率高,每次检索时,在相应的服务器中就能得到相应的数据,快速地 进行响应。
[0027] 2.当增加或减少服务器时,不会对已有的分布式环境造成太大的影响,只会对部 分数据的存储产生影响,并且哈希服务器不会改变。

【专利附图】

【附图说明】
[0028] 图1为哈希函数映射到数值空间示意图;
[0029] 图2为数据存储到C节点的数值空间示意图;
[0030] 图3为引入虚拟节点的数值空间示意图;
[0031] 图4为0到2~32_1次方的数值空间示意图;
[0032] 图5为4个对象的Key值分布示意图;
[0033] 图6为Cache和对象的Key值分布不意图;
[0034] 图7为Cache B被移除后的Cache映射关系图;
[0035] 图8为添加 Cache D后的映射关系图;
[0036] 图9为引入虚拟节点后的映射关系图。

【具体实施方式】
[0037] 为使本发明的目的、技术方案及优点更加清楚明白,以下参照附图并举实施例,对 本发明做进一步详细说明。
[0038] -种基于一致性哈希算法的分布式存储方法,包括以下步骤:
[0039] S1 :将哈希数值空间设置成一个首尾相接的圆环;
[0040] S2 :通过哈希函数计算出哈希值Key在环上的分布,把对象映射到哈希数值空间;
[0041] S3 :把高速缓冲存储器Cache映射到对象映射到的同一个哈希数值空间,并且使 用相同的哈希算法;
[0042] S4 :把对象映射到Cache :沿着圆环的顺时针方向从对象的Key值出发,直到遇见 一个Cache,那么就将该对象存储在这个Cache上;
[0043] S5 :移除 Cache 或者添加 Cache。
[0044] S1所述的哈希数值空间是一个首(0)尾(2~32-1)相接的圆环。
[0045] S3所述的Cache的哈希计算方法如下:使用Cache的IP地址或者Cache的机器 名称作为哈希输入。
[0046] 所述步骤还包括S6 :加入虚拟节点;虚拟节点是实际节点在哈希数值空间的复制 品,一个实际节点对应了至少一个虚拟节点,这个对应个数就是复制个数,虚拟节点在哈希 数值空间中以Hash值排列。
[0047] 虚拟节点的哈希计算采用对应节点的IP地址加数字后缀的方式。
[0048] 所述的S2有4个对象objectl?object4,通过哈希函数计算出哈希值Key在环 上的分布,
[0049] Hash (objectl) = Keyl ;
[0050] Hash (object2) = Key2 ;
[0051] Hash (ob ject3) = Key3 ;
[0052] Hash (ob ject4) = Key4〇
[0053] 所述的S3有A、B、C共3台Cache,在哈希数值空间中以对应的Hash值排列;
[0054] Hash (Cache A) = Key A ;
[0055] Hash (Cache B) = Key B ;
[0056] Hash (Cache C) = Key C〇
[0057] S4所述的把对象映射到Cache :对象objectl存储到Cache A上;object2和 object3 存储到 Cache C ;object4 存储到 Cache B。
[0058] 原理说明:一致性哈希算法是一种分布式系统常用的算法。比如,一个分布式的存 储系统,要将数据存储到具体的节点上,如果采用普通的哈希方法,将数据映射到具体的节 点上,如Key% N,Key是数据的关键字,N是机器(高速缓冲存储器Cache)节点数,如果有 一个机器加入或退出这个集群,则所有的数据映射都无效,如果是持久化存储则要做数据 迁移,如果是分布式缓存,则其它缓存就失效,因此引入了一致性哈希算法。
[0059] 如图1所示,把数据用哈希函数映射到一个很大的数值空间。数据存储时,先得到 一个哈希值,对应到这个环中的每个位置,如kl对应到了图中所示的位置,然后沿顺时针 找到一个机器节点B,将kl存储到B这个节点中。如果B节点死机,则B上的数据就会存 储到C节点,如图2所示。这样,只会影响C节点,对其他的节点A,D的数据不会造成影响。 然而,这又会造成一个"雪崩"的情况,即C节点由于承担了 B节点的数据,所以C节点的负 载会变高,C节点很容易也死机,这样依次下去,会造成整个集群都失效。
[0060] 为此引入了虚拟节点的概念:即想象在这个环上有很多虚拟节点,数据的存储是 沿着环的顺时针方向找一个虚拟节点,每个虚拟节点都会关联到一个真实节点,如图3所 示。图中的六1、八2、81、82、(:1、02、01、02都是虚拟节点,机器六负载存储六1、42的数据, 机器B负载存储Bl、B2的数据,机器C负载存储Cl、C2的数据。由于这些虚拟节点数量很 多,均匀分布,因此不会造成"雪崩"。
[0061] 具体实施例:下面通过介绍数据库分割技术和一致性哈希步骤来讲解本发明的实 现:
[0062] S1 :考虑到通常的哈希算法都是将值映射到一个32位的Key值,也就是0到 2~32-1次方的哈希数值空间;将这个哈希数值空间设置成一个首(0)尾(2~32-1)相接的 圆环,如图4所示。
[0063] S2 :把对象映射到哈希数值空间:
[0064] 假设考虑4个对象objectl?object4,通过哈希函数计算出哈希值Key在环上的 分布,如图5所示:
[0065] Hash (objectl) = Keyl ;
[0066] ......
[0067] Hash (ob jectN) = KeyN〇
[0068] S3:把Cache映射到哈希数值空间:
[0069] 一致性哈希的基本思想就是将对象和Cache都映射到同一个哈希数值空间中,并 且使用相同的哈希Hash算法;
[0070] 假设当前有A、B、C共3台Cache,那么其映射结果如图6所示,他们在哈希数值空 间中,以对应的Hash值排列;
[0071] Hash (Cache A) = Key A ;
[0072] ......
[0073] Hash (Cache C) = Key C ;
[0074] Cache的哈希计算,一般的方法是使用Cache的IP地址或者Cache的机器名称作 为Hash输入。
[0075] S4 :把对象映射到Cache :
[0076] 现在Cache和对象都已经通过同一个哈希算法映射到哈希数值空间中,接下来要 考虑的就是如何将对象映射到Cache ;
[0077] 在这个环形空间中,如果沿着顺时针方向从对象的Key值出发,直到遇见一个 Cache,那么就将该对象存储在这个Cache上,因为对象和Cache的哈希值是固定的,因此这 个Cache必然是唯一和确定的。这样就找到了对象和Cache的映射方法。依然继续上面的 例子(参见图6),对象objectl将被存储到Cache A上;object2和object3存储到Cache C ;object4 存储到 Cache B。
[0078] S5 :考察 Cache 变动
[0079] 在动态变化的Cache环境中,哈希算法应该满足平衡性和单调性,通过哈希然后 求余的方法不能满足单调性,当Cache有所变动时,Cache会失效,进而对后台服务器造成 巨大的冲击,因此提出了一致性哈希算法。
[0080] 移除 Cache :
[0081] 考虑假设Cache B失效了,根据上面讲到的映射方法,这时受影响的将仅是那些沿 Cache B逆时针遍历直到下一个Cache (Cache C)之间的对象,也即是本来映射到Cache B上 的对象;
[0082] 因此这里仅需要变动对象objects将其重新映射到Cache C上即可;
[0083] 添加 Cache :
[0084] 再考虑添加一台新的Cache D的情况,假设在这个环形Hash空间中,Cache D被映 射在对象〇b ject2和ob ject3之间,这时受影响的将仅是那些沿Cache D逆时针遍历直到下 一个Cache (Cache B)之间的对象,它们是也本来映射到Cache C上对象的一部分,将这些对 象重新映射到Cache D上即可;
[0085] 因此这里仅需要变动对象object2,将其重新映射到Cache D上,参见图8 ;
[0086] S6 :虚拟节点
[0087] 哈希算法的另一个指标是平衡性,定义如下:平衡性是指哈希的结果能够尽可能 分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用。哈希算法并不是保证 绝对的平衡,如果Cache较少的话,对象并不能被均匀的映射到Cache上,比如在上面的例 子中,仅部署Cache A和Cache C的情况下,在4个对象中,Cache A仅存储了 objectl,而 Cache C则存储了 object2、object3和object4 ;分布是很不均衡的。
[0088] 为了解决这种情况,一致性哈希算法引入了虚拟节点的概念,定义如下:虚拟节点 是实际节点在哈希数值空间的复制品,一实际个节点对应了至少一个个虚拟节点,这个对 应个数也成为复制个数,虚拟节点在哈希数值空间中以Hash值排列。
[0089] 仍以仅部署Cache A和Cache C的情况为例,在图7中我们看到,Cache分布并不均 匀,现在引入虚拟节点,并设置复制个数为2,这就意味着一共会存在4个虚拟节点,Cache Al, Cache A2 代表了 Cache A ;Cache Cl, Cache C2 代表了 Cache C ;假设一种比较理想的情 况,参见图9 ;
[0090] 此时,对象到虚拟节点的映射关系为:
[0091] objecl->Cache A2 ;objec2->Cache Al ;objec3->Cache Cl ;objec4->Cache C2 ;
[0092] 对象 objectl 和 object2 都被映射到了 Cache A,而 object3 和 object4 映射到了 Cache C上;平衡性有了很大提高。
[0093] 引入虚拟节点后,映射关系就从{对象_>节点}转换到了 {对象_>虚拟节点}。 虚拟节点的哈希计算可以采用对应节点的IP地址加数字后缀的方式。例如假设Cache A的 IP 地址为 202. 168. 14. 241。
[0094] 引入虚拟节点前,计算Cache A的哈希值:Hash ( "202. 168. 14. 241");
[0095] 引入虚拟节点后,计算虚拟节点Cache Al和Cache A2的哈希值:
[0096] Hash( "202. 168. 14. 241#1");//Cache A1
[0097] Hash( "202. 168. 14. 241#2");//Cache A2。
[0098] 本领域的普通技术人员将会意识到,这里所述的实施例是为了帮助读者理解本发 明的实施方法,应被理解为本发明的保护范围并不局限于这样的特别陈述和实施例。本领 域的普通技术人员可以根据本发明公开的这些技术启示做出各种不脱离本发明实质的其 它各种具体变形和组合,这些变形和组合仍然在本发明的保护范围内。
【权利要求】
1. 一种基于一致性哈希算法的分布式存储方法,其特征在于,包括以下步骤:S1 :将哈 希数值空间设置成一个首尾相接的圆环; 52 :通过哈希函数计算出哈希值Key在环上的分布,把对象映射到哈希数值空间; 53 :把高速缓冲存储器Cache映射到对象映射到的同一个哈希数值空间,并且使用相 同的哈希算法; 54 :把对象映射到Cache :沿着圆环的顺时针方向从对象的Key值出发,直到遇见一个 Cache,那么就将该对象存储在这个Cache上; 55 :移除Cache或者添加 Cache。
2. 根据权利要求1所述的方法,其特征在于,S1所述的哈希数值空间是一个首(0)尾 (212-1)相接的圆环。
3. 根据权利要求2所述的方法,其特征在于,S3所述的Cache的哈希计算方法如下:使 用Cache的IP地址或者Cache的机器名称作为哈希输入。
4. 根据权利要求1所述的方法,其特征在于,所述步骤还包括S6 :加入虚拟节点;虚拟 节点是实际节点在哈希数值空间的复制品,一个实际节点对应了至少一个虚拟节点,这个 对应个数就是复制个数,虚拟节点在哈希数值空间中以Hash值排列。
5. 根据权利要求4所述的方法,其特征在于,虚拟节点的哈希计算采用对应节点的IP 地址加数字后缀的方式。
6. 根据权利要求1所述的方法,其特征在于,所述的S2有4个对象objectl? object4,通过哈希函数计算出哈希值Key在环上的分布, Hash(objectl) = Keyl ; Hash(object2) = Key2 ; Hash(object3) = Key3 ; Hash(object4) = Key4〇
7. 根据权利要求6所述的方法,其特征在于,所述的S3有A、B、C共3台Cache,在哈 希数值空间中以对应的Hash值排列; Hash (Cache A) = Key A ; Hash (Cache B) = Key B ; Hash(Cache C) = Key C〇
8. 根据权利要求7所述的方法,其特征在于,S4所述的把对象映射到Cache:对象 objectl 存储到 Cache A 上;object2 和 object3 存储到 Cache C ;object4 存储到 Cache B。
【文档编号】G06F17/30GK104050270SQ201410284250
【公开日】2014年9月17日 申请日期:2014年6月23日 优先权日:2014年6月23日
【发明者】唐雪飞, 张小盼, 楚龙辉, 王淋铱 申请人:成都康赛信息技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1