一致性哈希学习

转自:https://developer.huawei.com/consumer/cn/forum/topic/0203810951415790238?fid=0101592429757310384

https://blog.csdn.net/weixin_43217065/article/details/107659713

1.普通哈希存在的问题

 

 对服务器的数量取模,当服务器数量变动的时候,所有缓存的位置都要发生改变。

当增加或者减少一台服务器(故障),hash(a.png) % 5 = ?或者hash(a.png) % 3 = ?结果肯定不会映射到第2台服务器上,那么所有缓存在一定时间内是失效的,当应用无法从缓存中获取数据时,则会向后端数据库请求数据,会出现雪崩的情况?

2.一致性哈希

一致性哈希是指将「存储节点」和「数据」都映射到一个首尾相连的哈希环上。

一致性Hash算法也是使用取模的方法,对2^32取模,将整个哈希值空间组织成一个虚拟的圆环,将各个服务器使用Hash进行一个哈希,具体可以选择服务器的IP或主机名作为关键字进行哈希。【那需要先将ip或者主机名的字符串转换为整型之后再对2^32取模?那string->int需要自己定义?】每次根据要缓存的对象计算得到hash值,在hash环上顺时针查找距离最近的缓存服务器节点:

 根据一致性Hash算法,数据A会被定为到Node A上,B被定为到Node B上,C被定为到Node C上,D被定为到Node D上。

2.1 容错性和可扩展性

减少服务器:

(对应到网络抖动判断服务不可用的情况)

假设Node C不幸宕机,可以看到此时服务器A、B、D中原有的缓存对象不会受到影响,仍可正常访问,只有C对象被重定位到Node D。

一般的,在一致性Hash算法中,如果一台服务器不可用,则受影响的数据仅仅是此服务器到其环空间中前一台服务器(即沿着逆时针方向行走遇到的第一台服务器)之间的数据,其它不会受到影响。

增加服务器: 

(对应到部署一个新服务的情况)

 假设在服务区B和C之间增加一台,那么受影响的数据仅仅是新服务器到其环空间中前一台服务器(即沿着顺时针方向行走遇到的第一台服务器)之间数据,其它数据也不会受到影响。

一致性Hash算法对于节点的增减都只需重定位环空间中的一小部分数据,具有较好的容错性和可扩展性。

3. 哈希环数据倾斜问题

一致性哈希算法不能够均匀地分布节点,会出现大量请求都集中在一个节点的情况,在这种情况下进行容灾与扩容时,容易出现雪崩的连锁反应。

之后再继续了解。

 

posted @ 2022-08-09 10:38  lypbendlf  阅读(30)  评论(0编辑  收藏  举报