Welcome to

Vcode

首页 / Java / 关于一致性HASH算法

关于一致性HASH算法

    哈希算法对于分布式,大数据存储适用性十分广泛 ,其根本的就是取模运算  hash%N   

随便举个例子,假如我有10台服务器,要缓存10w个文件,怎么存才能使文件均匀的分布到10台服务器上了,答案当然是用哈希算法对10取余,也就是 HASH(文件名)%10  =0,1,2,3,4,5,6,7,8,9 这样文件就会均匀的分布到10服务器上,假如,要找文件,就不用遍历10台服务器上的所有资源了,再利用哈希算法得到哈希值,到相应的服务器上遍历,如没有,那当然没有缓存此文件。

    使用后,可能会出现下列问题:

    1.当服务器数量发生变化时,会引起缓存雪崩,导致大量缓存同一时间失效

    2.还是服务器数量变化,几乎所有的缓存都会改变位置,那么 ,怎么才能尽可能的减少此情况的发生。


问题来了,那么 一致性hash能否解决上述问题了。

一致性HASH其实也是取模,当然不是对服务器数量取模,而是对2的32次方取模。


把0-2^32-1上的点分布到一个圆环上,服务器 都有相应的ip 对其进行一致性哈希运算,得到的值,就在圆环上,还是存储文件,用文件名做hash运算,得到的值,在环上,按顺时针,离服务器坐落的点最近的 就把文件存到该服务器上,理想是丰满的,现实是残酷的。

    


    假如 A B C D 4个服务器,分布不均匀,全都离得很近,而文件坐落的点,大部分离A服务器很近,那么就会导致大部分文件都会存在A服务器上,而B C D却有很少的文件,这种情况叫HASH环偏斜

    

    那么怎么解决了,聪明的你可能想到了解决方案,就是让服务器 尽可能的 多且 均匀分布


可是资金有限,服务器数量不够 怎么办,这时候 就需要虚拟节点了,一个物理机可能对应多个虚拟节点。

本文暂无评论

发表评论

您的电子邮件地址不会被发布。

>> <<