什么是一致性hash?

一致性hash

前言

说出来你们可能不相信,我昨天作梦梦到本身在面试,而后面试官问了我这个问题哈哈~而后我就打算按照本身的理解写一写。若是有写的不对的欢迎你们指正!node

直接开始

普通hash算法

一致性hash1

普通hash算法就是把存储的key取hash而后再对节点数取模以后判断key所在节点的位置,面试

如上图所示,假设如今有key1,key2,key3,key4四个key,经过上面说的方法均匀分布在了这4个节点上面。看上去很是nice~算法

可是若是如今咱们集群须要扩容,增长一台机器会发生啥?缓存

能够看到,因为如今增长了一台机器,因此如今咱们取模的对象由3变成了4。优化

致使什么现象呢?假设咱们的数据如今没有迁移,那原来的key3和key4原本是分别在node0和node1上的,如今经过hash取模运算以后倒是在node0和node3上,因此在数据不作迁移的状况下会致使原有的缓存会大量失效。而后这种大面积的数据迁移是很是麻烦的!3d

这是扩容致使的问题,若是集群中的节点宕机呢?对象

如今node2挂了,集群节点数量变成了2,对应的key经过hash取模以后所在的节点也会变化。致使node2上面原有的key查询不到,会直接查库。其他的key,除了key1能正常查询外,其余key全都失效了。这时不只涉及到数据迁移还会致使缓存穿透。blog

一致性hash

一致性hash实际上是普通取模hash算法的改良版,其hash计算方法没有变化,可是hash空间发生了变化,由原来的线性的变成了环。缓存节点经过hash计算以后获得在hash环中的位置;key经过hash计算以后获得所在环的位置,而后顺时针方向找到第一个节点,这个节点就是存放key的节点。hash

来看看一致性hash是如何解决普通取模hash中扩容和宕机的问题的。集群

假设如今咱们增长了一个节点node3,原来的key1如今顺时针找到了新增长node3,对其他的节点没有任何影响。只须要将node0到node3之间的key迁移到新的节点便可。

若是node2如今宕机了,那么原来的key2顺时针找到的节点会变成node0,其他节点也没有任何影响,只须要把node2上的key迁移到node0上便可。

那这个一致性hash难道就没有啥毛病了嘛?

想一下,若是咱们的节点数量不多,而且节点偏向一侧会发生什么事情?

能够看到很大一部分的key都会落在node0上,从而致使node0的压力过大挂掉,node0挂掉以后数据同时又会向node1上转移,node1又会挂掉,最终致使整个集群不可用!这就是数据倾斜的问题,会引发节点雪崩。可想而知这个问题会很严重。

一致性hash优化

数据倾斜的问题是经过虚拟节点来解决的。

就是在节点稀疏的hash环上对物理节点虚拟出一部分虚拟节点,key会打到虚拟节点上面,而虚拟节点上的key实际也是映射到物理节点上的,这样就避免了数据倾斜致使单节点压力过大致使节点雪崩的问题。

结语

作梦引发的一片博文。

介绍了普通取模hash的弊端,一致性hash如何解决,以及一致性hash优化的问题。

上面的介绍若是有什么不对的地方但愿各位能指正~我也会虚心接受。

相关文章
相关标签/搜索