北京网站建设公,湖南响应式官网建设哪家好,天元建设集团有限公司济南第六建筑工程分公司,小米手机官方网站前言
在进行一致性哈希介绍前#xff0c;先思考2个问题#xff1a;
什么是Hash一致性Hash和Hash的关系是什么
对于第一个问题Hash的定义
Hash也成散列#xff0c;基本原理就是把任意长度的输入#xff0c;通过hash算法变成固定长度的输出。
对于第二个问题#xff0c…前言
在进行一致性哈希介绍前先思考2个问题
什么是Hash一致性Hash和Hash的关系是什么
对于第一个问题Hash的定义
Hash也成散列基本原理就是把任意长度的输入通过hash算法变成固定长度的输出。
对于第二个问题下面我们进行详细介绍。
引出问题
在了解一致性哈希算法之前最好先了解一下缓存中的一个应用场景了解了这个应用场景之后再来理解一致性哈希算法就容易多了也更能体现出一致性哈希算法的优点那么我们先来描述一下这个经典的分布式缓存的应用场景。 场景描述 对于3万张图片的处理第一种随机存储可以满足我们的要求吗可以。但是如果这样做当我们需要访问某个缓存项时则需要遍历3台缓存服务器从3万个缓存项中找到我们需要访问的缓存遍历的过程效率太低时间太长当我们找到需要访问的缓存项时时长可能是不能被接受的也就失去了缓存的意义。
那么就是第二种方式进行Hash取模算法。 似乎Hash取模算法可以满足我们的使用场景了但是上面还是会出现一些缺陷的试想一下如果3台缓存服务器已经不能满足我们的缓存需求需要对服务器进行扩容假设我们增加了一台缓存服务器那么缓存服务器数量由3台变为4台。此时如果仍然使用上述方法对同一张图片进行缓存那么这张图片所在的服务器编号必定与原来3台服务器时所在的服务器编号不同因为除数由3变为了4被除数不变的情况下余数肯定不同这种情况带来的结果就是当服务器数量变动时所有缓存的位置都要发生改变换句话说当服务器数量发生改变时所有缓存在一定时间内是失效的当应用无法从缓存中获取数据时则会向后端服务器请求数据。数据库减少时场景同理。 正式上述所述问题由于大量缓存在同一时间失效造成了缓存的雪崩此时前端缓存已经无法起到承担部分压力的作用后端服务器将会承受巨大的压力整个系统很有可能被压垮所以我们应该想办法不让这种情况发生但是由于上述HASH算法本身的缘故使用取模法进行缓存时这种情况是无法避免的为了解决这些问题一致性哈希算法诞生了。 我们来回顾一下Hash算法会出现的问题。
问题1当缓存服务器数量发生变化时会引起缓存的雪崩可能会引起整体系统压力过大而崩溃大量缓存同一时间失效。
问题2当缓存服务器数量发生变化时几乎所有缓存的位置都会发生改变怎样才能尽量减少受影响的缓存呢
其实上面两个问题是一个问题那么一致性哈希算法能够解决上述问题吗
我们现在就来了解一下一致性哈希算法
一致性哈希算法的基本概念 一致性哈希算法的优点
经过上述描述大家应该已经明白了一致性哈希算法的原理了但是话说回来一致性哈希算法能够解决之前出现的问题吗我们说过如果简单的对服务器数量进行取模那么当服务器数量发生变化时会产生缓存的雪崩从而很有可能导致系统崩溃那么使用一致性哈希算法能够避免这个问题吗我们来模拟一遍即可得到答案。 如上优点所述这就是一致性哈希算法的优点如果使用之前的hash算法服务器数量发生改变时所有服务器的所有缓存在同一时间失效了而使用一致性哈希算法时服务器的数量如果发生改变并不是所有缓存都会失效而是只有部分缓存会失效前端的缓存仍然能分担整个系统的压力而不至于所有压力都在同一时间集中到后端服务器上。
hash环的偏斜 上述内容我们理想化的将3台服务器均匀映射到hash环上了但是我们想象的与实际情况往往不一样。很有可能大部分集中缓存到某一台服务器上我们称这种现象为数据倾斜 虚拟节点
所谓虚拟节点就是凭空的让服务器节点多起来既然没有多余的真正的物理服务器节点我们就只能将现有的物理节点通过虚拟的方法复制出来这些由实际节点虚拟复制而来的节点被称为”虚拟节点”。加入虚拟节点以后的hash环如下。