一致性Hash算法原理白话

拥有回忆 提交于 2020-04-05 23:18:05

1、技术背景

1.1、技术举例:Memcache

1.2、技术瓶颈

memcached服务器端本身不提供分布式cache的一致性,由客户端实现提供。以余数分布式算法为例。

余数分布式算法是根据添加进入缓存时key的hash值通过特定的算法得出余数,然后根据余数映射到关联的缓存服务器,将该key-value数据保存到该服务器

1.2.1、假设有3台缓存服务器以及它们对应的余数值

Node A:0,3,6,9

Node B:1,4,7

Node C:2,5,8

1.2.2、此时添加一台服务器Node D

服务器对应的余数值发生变化,如下

Node A:0,1,2

Node B:3,4

Node C:5,6

Node C:7,8,9

 

根据上面的变化,发现只有余数值为0,4,5所对应的缓存服务器没有发生改变,也就是说其它余数值对应的缓存服务器发生了改变,即缓存失效,如果大量缓存失效会严重影响系统的性能,也就是缓存动荡。针对这样大片缓存失效的技术瓶颈,于是提出了一致性hash算法。缩小失效缓存范围。

 

2、一致性Hash算法

2.1、将hash值范围看成一个0~232的圆。

2.2、将服务器节点的hash值映射到该圆上。

2.3、对数据进行缓存时,计算key的hash值,然后找到该值在圆上的位置,顺时针进行查找,将数据保存到第一个查找到的服务器。

 

2.4、添加一个缓存服务器,如图

根据hash一致算法的映射查找规则,受影响的缓存只有新服务器的hash值----新服务器逆时针的第一个服务器hash值得范围,也就这块区域的缓存失效,大大降低了失效范围。

2.5、当服务器过少时,会带来数据倾斜问题

加入只有两台服务器A和B,那么hash范围如下

Node A:0-231

Node B:0-232

很容易造成数据堆积在节点A,于是一致性哈希算法引入了虚拟节点机制,即对每一个服务节点计算多个哈希,每个计算结果位置都放置一个此服务节点,称为虚拟节点。具体做法可以在服务器ip或主机名的后面增加编号来实现。过程如图

无虚拟节点

引入虚拟节点

注:图是从其它网站下载

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!