您的位置:首页 > 其它

哈希分布与一致性哈希算法简介

2012-01-03 15:38 417 查看

哈希分布与一致性哈希算法简介

一致性hash应用领域主要是分布式缓存(分布式memcache)以及分布式存储(amazon的dynamo存储)。

在大型web应用中,缓存算是一个标配,在大规模的缓存应用中,分布式缓存系统应运而生。key-value如何均匀的分散到集群中?最常规的方式莫过于hash取模的方式。比如集群中可用机器数量为N,那么key值为K的的数据请求很简单的可以路由到hash(K) mod N对应的机器。这种结构较简单实用。但是在一些高速发展的web系统中,这样的解决方案仍有缺陷。随着系统访问压力的增长,缓存系统不得不通过增加机器节点的方式提高集群的响应速度和数据承载量。如果还是按照hash取模的方式,在增加机器节点的时,会存在大量的缓存不命中,缓存数据需要重新建立,甚至进行整体的缓存数据迁移,会给DB带来极高的系统负载,甚至导致DB服务器宕机。
那么就没有办法解决hash取模的方式带来的诟病吗?看下文。

(一) 一致性哈希基本原理(Consistent Hashing)

选择具体的机器节点不在只依赖需要缓存数据的key的hash本身了,而是机器节点本身也进行了hash运算。

(1) hash机器节点

首先求出机器节点的hash值(怎么算机器节点的hash?ip可以作为hash的参数,当然还有其他的方法),然后将其分布到0~2^32的一个圆环上(顺时针分布)。如下图所示:

x轴表示的是需要为每台物理服务器扩展的虚拟节点倍数(scale),y轴是实际物理服务器数,可以看出,当物理服务器的数量很小时,需要更大的虚拟节点,反之则需要更少的节点,从图上可以看出,在物理服务器有10台时,差不多需要为每台服务器增加100~200个虚拟节点才能达到真正的负载均衡。



(2)访问方式

如果有一个写入缓存的请求,其中Key值为K,计算器hash值Hash(K), Hash(K) 对应于图 – 1环中的某一个点,如果该点对应没有映射到具体的某一个机器节点,那么顺时针查找,直到第一次找到有映射机器的节点,该节点就是确定的目标节点,如果超过了2^32仍然找不到节点,则命中第一个机器节点。比如 Hash(K) 的值介于node2~node2之间,那么命中的机器节点应该是node节点(如上图 )。

(3)增加节点的处理

在原有集群的基础上欲增加一台机器node5,增加过程如下: 计算机器节点的Hash值,将机器映射到环中的一个节点,如下图:



(一):如果用在缓存领域,增加机器节点node5之后,访问策略不改变,依然按照(2)中的方式访问,此时缓存命不中的情况依然不可避免,不能命中的数据是hash(K)在增加节点以前落在node2~node5之间的数据。尽管依然存在节点增加带来的命中问题,但是比较传统的 hash取模的方式,一致性hash已经将不命中的数据降到了最低。

(二):在实际的像dynamo这样的实际存储系统中,加入节点成功的标准应该是把 node2和node5之间之前存储在node4中的数据迁移到新加入的node5中才算成功。

(二)负载均衡+虚拟节点

Consistent Hashing最大限度地抑制了hash键的重新分布。另外要取得比较好的负载均衡的效果,往往在服务器数量比较少的时候需要增加虚拟节点来保证服务器能均匀的分布在圆环上。因为使用一般的hash方法,服务器的映射地点的分布非常不均匀。使用虚拟节点的思想,为每个物理节点(服务器)在圆上分配100~200个点。这样就能抑制分布不均匀,最大限度地减小服务器增减时的缓存重新分布。用户数据映射在虚拟节点上,就表示用户数据真正存储位置是在该虚拟节点代表的实际物理服务器上。

下面有一个图描述了需要为每台物理服务器增加的虚拟节点。



x轴表示的是需要为每台物理服务器扩展的虚拟节点倍数(scale),y轴是实际物理服务器数,可以看出,当物理服务器的数量很小时,需要更多的虚拟节点,反之则需要更少的节点,从图上可以看出,在物理服务器有10台时,差不多需要为每台服务器增加100~200个虚拟节点才能达到较好的负载均衡。

(二)参考资料

以下为一些分布式缓存的资料。

《memcached 全面剖析》:

ponit:

类似内核高速缓存slab机制的内存管理
一致性hash
rddtools 图形化监控与管理
可插拔的存储引擎

slab内存 / bdb 等

memcache的适用性 http://blog.developers.api.sina.com.cn/?p=124

《dynamo》:http://www.allthingsdistributed.com/files/amazon-dynamo-sosp2007.pdf

《Scaling Parallel I/O Performance through I/O Delegate and Caching System》:http://dl.acm.org/ft_gateway.cfm?id=1413380&type=pdf&CFID=76343966&CFTOKEN=54995877
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: