面试官:一致性哈希算法?

  1. 考虑到分布式系统每个节点都有可能失效,并且新的节点很可能动态的增加进来,如何保证当系统的节点数目发生变化时仍然能够对外提供良好的服务?
  2. 如果某台服务器失效,对于整个系统来说如果不采用合适的算法来保证一致性,那么缓存于系统中的所有数据都可能会失效(即由于系统节点数目变少,客户端在请求某一对象时需要重新计算其hash值(通常与系统中的节点数目有关),由于hash值已经改变,所以很可能找不到保存该对象的服务器节点),因此一致性hash就显得至关重要。

了解一致性哈希之前,首先了解哈希在分布式系统中的使用
在缓存中,常使用哈希算法来对key取哈希值,并通过key来快速获取value。

一致性哈希算法

    • 哈希取模-解决分布式缓存
      • 哈希取模算法的局限性
    • 哈希一致性算法
      • 如何判断哪些key映射到哪些节点服务器上呢?
      • 对于节点增加/减少的情况
      • 虚拟节点
      • 一致性哈希算法的优势

哈希取模-解决分布式缓存

当缓存的数据量过大,单个节点或机器无法满足需求,我们需要多个节点或机器来存储这些数据。那么如何确定key存储在哪个节点上呢? 最简单的方法是哈希取模
面试官:一致性哈希算法?_第1张图片

哈希取模算法的局限性

以下两个场景下会出现什么问题?

  • 由于故障原因导致某个分布式机器或节点宕机

由于节点数量发生了变化,那么重新调整 “模值”
面试官:一致性哈希算法?_第2张图片
节点的减少导致节点映射关系发生变化, 这种变化对新来的key,获取value没有影响。但是对于已有的key来说,可能存在获取不到value的问题。以 “semlinker” 为例,变化前key放在编号1的节点,直接从1号节点获取value。但是变化后,我们获取value需要从0号节点获取,显然0号节点是不会存在“semlinker”的。

  • 需求量过大需要增加节点或者机器
    面试官:一致性哈希算法?_第3张图片
    同理,也是对新来的key不会影响,对已经有key,可能存在获取不到value的现象。
无论是增加节点还是减少节点,都会由于模值的改变,而改变了映射规则。
映射规则失效意味着之前缓存的失效,对于热点数据,可能会存在缓存击穿的现象。

如何解决上述问题?
可以通过rehash,也就是对已有的key重新分配节点。如果是数据量大的情况下,将会非常复杂。有没有更好的方法:一致性哈希算法

哈希一致性算法

原理:通过一个“哈希环”,将节点或机器以及key全部映射到哈希环上。如下图所示k1、k2、k3、k4是key。t1、t2、t3是节点服务器。
面试官:一致性哈希算法?_第4张图片

如何判断哪些key映射到哪些节点服务器上呢?

每个key顺时针找到最近的节点服务器,那么该节点服务器就会缓存当前的key。

对于节点增加/减少的情况

对于节点增加的情况,需要增加一台t4,同样经过hash运算映射到“哈希环”上。那么只需要将k3重新分配至t4即可,其余的key都不需要重新分配。
面试官:一致性哈希算法?_第5张图片
节点减少的情况与节点增加的情况原理是一样的,参照节点增加的情况。

虚拟节点

但对于新增服务器的情况还存在一些问题。新增的服务器 t4 只分担了 t1 服务器的负载,服务器 t2 和t3 并没有因为t4 服务器的加入而减少负载压力。如果t3服务器负载压力过大,那么t4的加入并不能够均衡t3的负载压力。

针对这个问题通过引入虚拟节点来解决数据倾斜而导致负载不均衡的现象。将每台物理服务器虚拟为一组虚拟服务器,将虚拟服务器放置到哈希环上,如果要查询key,先确定key的虚拟服务器,然后再由虚拟服务器确定物理服务器。
面试官:一致性哈希算法?_第6张图片
其实就是在物理服务器之上加了一层映射,用于解决负载不均衡的现象。

一致性哈希算法的优势

  1. 可扩展性。一致性哈希算法保证了增加或减少服务器时,数据存储的改变最少,相比传统哈希算法大大节省了数据移动的开销 。
  2. 更好地适应数据的快速增长。
    一致性哈希算法和哈希算法的关系
    一致性哈希算法在哈希算法的基础上提出来的,可以有效应对动态变化的分布式环境。
    参考
    图解哈希一致性算法
    理解哈希一致性算法

你可能感兴趣的:(学习笔记,算法,memcached,数据库)