一致性哈希原理应用

一致性哈希

文章目录

  • 一致性哈希
  • 前言
  • 一、基本概念/原理
  • 二、优势
    • 1.服务器故障宕机节点减少
    • 2.扩容/动态添加服务器
  • 三、存在问题及解决方案
    • 1.哈希环偏斜
    • 2.新增节点数据命中问题
  • 四、应用场景
  • 总结


前言

本文主要讲明一致性哈希的 原理,优点,新问题及解决,应用场景。


一、基本概念/原理

      一致性哈希算法也是使用取模的方法,只不过是对232取模,然后将232个点均匀的散列在一个圆上,这个圆环叫做哈希环。
      可以参考下图,正上方的点代表0,顺时针方向为0,1,2,3…232-1 。
一致性哈希原理应用_第1张图片
      结合实际问题解释:
      有三台缓存服务器,需要将信息均匀的放到三台缓存服务器中。
      1、对三台机器的ip进行哈希计算后对232取模,计算出的结果是一个0到232-1之间的一个整数,这样三台机器就映射到了这个环上。(图例为理想情况)
一致性哈希原理应用_第2张图片
      2、将要存的信息同样映射放置到哈希环上,对信息的key进行hash计算后对232进行取模,计算出来的数值对应hash环上的位置如下图橙点所示,按照顺时针方向找到第一个服务器是A服务器,那么就会把信息放到A服务器中。
一致性哈希原理应用_第3张图片
      通过这种方法,判断一个资源应该被缓存到哪台服务器上,将缓存服务器与被缓存资源都映射到hash环上以后,从被缓存资源的位置出发,沿顺时针方向遇到的第一个服务器,就是当前资源将要缓存在上面的服务器,由于被缓存资源与服务器hash后的值是固定的,所以,在服务器不变的情况下,一个资源必定会被缓存到固定的服务器上。下次想要访问这个资源时,只要再次使用相同的算法进行计算,即可算出这个资源被缓存在哪个服务器上,直接去对应的服务器查找对应的资源就可以了。


二、优势

1.服务器故障宕机节点减少

      结合上面三台服务器来说,如果B服务器出现了故障,那么B服务器会从Hash环上移除。如下图所示,原先的资源3是放在B服务器的,现在B宕机移除后,资源3的位置会发生变化,会放到C机器中,但是其他的资源位置不会发生变动。

      一致性hash优点:如果使用之前的hash算法,服务器数量发生改变时,所有服务器的所有缓存在同一时间失效需要重新计算缓存拉取,而使用一致性哈希算法时,服务器的数量如果发生改变,并不是所有缓存都会失效,而是只有部分缓存会失效,前端的缓存仍然能分担整个系统的压力,而不至于所有压力都在同一时间集中到后端服务器上。
一致性哈希原理应用_第4张图片

2.扩容/动态添加服务器

      当我们发现三台机器压力过大需要增加机器时,对新加的机器D进行hash计算后对 232取模映射放置到hash环上,如下图所示,此时只会影响资源2所存的位置,而不会影响其他的资源。
一致性哈希原理应用_第5张图片

三、存在问题及解决方案

1.哈希环偏斜

      问题:
      在上面hash环上的服务器分布是极其理想化的,在实际情况中可能会出现下图情况,这样的话,1,2,3,4,6号资源均被缓存在了服务器A上,5号资源被缓存在了服务器B上,服务器C上没有缓存任何资源,三台服务器并没有被合理的平均的充分利用。如果此时服务器A出现故障,那么失效缓存的数量也将达到最大值,在极端情况下,仍然有可能引起系统的崩溃,这种情况为hash环的偏斜。
一致性哈希原理应用_第6张图片

      解决方案:
      可以通过虚拟节点来解决偏斜问题。将现在已有的三台真实的物理服务器节点通过虚拟的方法复制出来,这些节点为虚拟节点。“虚拟节点"是"实际节点”(实际的物理服务器)在hash环上的复制品,一个实际节点可以对应多个虚拟节点。
      如下图所示ABC三台机器分别虚拟出了一个虚拟节点,也可以虚拟出更多的虚拟节点,这样缓存的分布就会刚加均衡,虚拟节点越多,hash环上的节点就越多,缓存被均匀分布的概率就越大。
一致性哈希原理应用_第7张图片

2.新增节点数据命中问题

      问题:
      当需要新增服务器时,读取资源的时候,会造成一小部分资源无法直接命中,在新增的服务器上获取资源但新增的服务器中并没有该资源,这个时候会穿透到数据库(或持久性服务器)中先取回资源放到新增机器上后再给服务返回需要的资源。

      解决方案:
      可以分为两阶段,如果拉取的资源没有在离自己最近的服务器上,那么首先去离自己第二近的服务器上拉取资源,然后异步将资源再缓存到最近的服务器上。

四、应用场景

      1、最主要用的场景是redis中多节点集群的负载中。
      2、如果像是图片等资源存的位置是自己管理的集群,可以使用该方式进行负载。一是避免集群中服务器数量发生变化的时候,会发生大量拉取图片的请求无法直接命中而引起的雪崩,导致整体系统压力过大而崩溃;二是如果使用的是其他的负载均衡方式,可能会导致几乎所有的图片资源位置发生变动,在此期间系统可用性会变差。
      3、集群经常需要变动时负载均衡方式可以采用该种方式,动态扩容,宕机等。

总结


本文主要依据实际场景来讲明了一致性hash的原理

你可能感兴趣的:(算法,算法)