一致性哈希

爱被打了一巴掌 2022-05-31 14:50 371阅读 0赞

首先我们可以看看为什么需要一致性哈希算法。

假设我们有3台Redis缓存服务器,编号为0,1,2.现在我们想将3万张图片均匀的缓存存到这3台服务器上。因为不想在缓存中找某张图片时去遍历3台服务器,所以我们原始的做法是对缓存项的键进行哈希,将哈希后的结果对服务器的数量进行取模操作。

  1. hash(图片名称) % 3

这样当我们访问任意一张图图片时,就能快速的找出该图片被缓存在哪个服务器上
这里写图片描述
但是当我们需要增加服务器,或者一个缓存服务器突然出现故障时,服务器的数量就改变了,这么取余的结果肯定会发生变化。这样带来的后果就是所有缓存的位置都会发生变化,造成缓存的崩溃,引起整体体统压力过大崩溃。

这时候就引入了一致性哈希算法。


一致性哈希

一致性哈希也是使用取模的方法,只不过是对2^32取模。

我们把2的32次方想象成一个圆,和钟表一样,如图
这里写图片描述
正上方的点代表成0,一直到2^32-1. 这个环就是hash环。

然后我们三台服务器的IP地址进行哈希计算,再对2^32取模,映射到环上。

  1. hash(服务器AIP地址) % 2^32
  2. hash(服务器BIP地址) % 2^32
  3. hash(服务器CIP地址) % 2^32

这里写图片描述

我们再将4张图片也通过同样的方法映射到哈希环上

  1. hash(图片1的名字) % 2^32
  2. hash(图片2的名字) % 2^32
  3. hash(图片3的名字) % 2^32
  4. hash(图片4的名字) % 2^32

然后通过顺时针方向,遇到的第一个服务器就将图片缓存到服务器上
这里写图片描述
图片1、2缓存到A ,图片3缓存到B,图片4缓存到C。


一致性哈希的优点

假设服务器B出现了问题
这里写图片描述
那么只有图片3改变然后就会被缓存到C中,之前如果一台服务器故障,所有的缓存都会失效,而使用一致性哈希算法,只有部分的图片(图片3)缓存会失效。


一点小问题

这里写图片描述
但是现实中可能会出现这样的问题,1、2、3、4、6号图片全部被缓存到了同一个服务器上,这样资源分布是极度不均匀的。

虚拟节点
只要让服务器的数量更多,哈希环就会更均匀。但真正的服务器资源只有3台,该怎么办呢?
我们只能将现有的物理节点通过虚拟的方式复制出来。这些被复制出来的节点就是“虚拟节点”。
这里写图片描述
创造出虚拟节点之后,缓存的分布就均匀多了。Hash环上的节点越多,均匀分布的概率越大。

发表评论

表情:
评论列表 (有 0 条评论,371人围观)

还没有评论,来说两句吧...

相关阅读

    相关 一致性

    基本哈希知识:[hash函数的基本知识][hash] 最常规的方式莫过于hash取模的方式。比如集群中可用机器适量为N,那么key值为K的的数据请求很简单的应该路由到ha

    相关 一致性

    首先我们可以看看为什么需要一致性哈希算法。 假设我们有3台Redis缓存服务器,编号为0,1,2.现在我们想将3万张图片均匀的缓存存到这3台服务器上。因为不想在缓存中找某张图

    相关 一致性算法

    在讲本文的主题之前,我们先来看一个现实中的应用场景,那就是分布式缓存。 场景描述: 假设我们现在有三台服务器用于缓存我们的一些文件,比如图片。我么将这三台服务器进行编号便于

    相关 一致性

    一、分布式算法         在做服务器负载均衡时候可供选择的负载均衡的算法有很多,包括: 轮循算法(Round Robin)、哈希算法(HASH)、最少连接算法(Le

    相关 一致性算法

    场景如下: 有三台缓存服务器分别为A、B、C,编号依次为1、2、3,现在有N张名称不重复的图片平均分配到每台服务器上进行缓存,如何设计一套算法,使得每次图片请求都能