天天看点

一致性哈希算法场景描述

本文为参考 朱双印 大佬博客内容的整理,有兴趣的同学可以点击下方链接,查看原文。

参考连接:白话解析:一致性哈希算法 consistent hashing

场景描述

假设有N台缓存服务器,在分布式情况下,要将资源均匀的缓存到这3台服务器上,可以使用下面的算法定位需要操作资源的位置:

hash(资源ID)% N
           

但是,当缓存服务器数量发生变化时,可能出现以下问题

  1. 会引起缓存的雪崩,可能会引起整体系统压力过大而崩溃(大量缓存同一时间失效)。
  2. 几乎所有缓存的位置都会发生改变,怎样才能尽量减少受影响的缓存呢?

一致性哈希算法的基本概念

一致性哈希算法是对

2^32

取模,将这些哈希槽顺时针排列,想象为一个 hash 环。

一致性哈希算法场景描述

这里我们将 3 台服务器的IP通过此算法进行取模(

hash(服务器的IP地址) % 2^32

),并映射到这个环上。后续的资源也通过此算法哈希自己的 ID 并定位到环上。资源在环上顺时针找到的第一台服务器就是它存储的服务器(如:2、1 存放在 A 服务器)。

一致性哈希算法场景描述

一致性哈希算法的优点

假设,服务器B 出现了故障,我们现在需要将服务器B移除,那么,我们将上图中的服务器B 从 hash 环上移除即可。此时客户端取资源 3 的缓存将到服务器C 中获取,资源3的缓存后续也存在服务器C 中。

一致性哈希算法场景描述

如果使用之前的hash算法,服务器数量发生改变时,所有服务器的所有缓存在同一时间失效了,将引起缓存雪崩。

而使用一致性哈希算法时,服务器的数量如果发生改变,并不是所有缓存都会失效,而是只有部分缓存会失效,前端的缓存仍然能分担整个系统的压力,而不至于所有压力都在同一时间集中到后端服务器上。

hash环的偏斜

hash环的偏斜的概念

在实际的映射中,服务器可能会被映射成如下模样。A、B、C 三台服务器并没有被合理的平均的充分利用,缓存分布的极度不均匀,而且,如果此时服务器A出现故障,那么失效缓存的数量也将达到最大值,在极端情况下,仍然有可能引起系统的崩溃,下图中的情况则被称之为 hash环的偏斜。

一致性哈希算法场景描述

hash环的偏斜的解决方式:虚拟节点

将现有的物理节点通过虚拟的方法复制出来,这些由实际节点虚拟复制而来的节点被称为”虚拟节点”。

一致性哈希算法场景描述

引入虚拟节点的概念后,缓存的分布就均衡多了,如果你还不放心,可以虚拟出更多的虚拟节点,以便减小hash环偏斜所带来的影响,虚拟节点越多,hash环上的节点就越多,缓存被均匀分布的概率就越大。

继续阅读