zoukankan      html  css  js  c++  java
  • 《算法

    图片摘自:

      每天进步一点点——五分钟理解一致性哈希算法(consistent hashing)

    一:背景

      - 一致性哈希算法在1997年由麻省理工学院的Karger等人在解决分布式Cache中提出的。

      - 设计目标是为了解决因特网中的热点(Hot spot)问题

      - 一致性哈希修正了使用的简单哈希算法带来的问题

    二:简单哈希算法带来的问题?

      - 在简单哈希算法中

        - 我们会根据hash算法得出的数值和机器数取模计算,计算发到哪台机器上。

        - Hash(资源)% 机器数 = 落到哪台机器上

        - 这样的话就不会遍历所有的服务器,大大提升了性能!

      - 但是,在服务器数量变动的时候,所有缓存的位置都要发生改变!

        - 假设4台缓存中突然有一台缓存服务器出现了故障,无法进行缓存。

        - 那么我们则需要将故障机器移除,但是如果移除了一台缓存服务器,那么缓存服务器数量从4台变为3。

        - 如果想要访问资源,资源的缓存位置必定会发生改变,以前资源缓存也会失去缓存的作用与意义。

        - 同时由于大量缓存在同一时间失效,造成了缓存的雪崩,服务端也会承受巨大压力。

    三:一致性哈希(hash)解决的问题

      - 解决增减服务器导致的大量数据震荡问题。

    四:一致性哈希(hash)

      - 原理

        - 创造环形哈希(hash)空间,不同节点映射到环上的不同位置,通过和机器节点的匹配,完成hash一致。

      - 做法

        -  按照常用的hash算法将对应的key哈希到一个具有2^32次方个桶的空间中,即0~(2^32)-1的数字空间中。 可以将这些数字头尾相连,想象成一个闭合的环形

          - 

        -  现在我们将object1、object2、object3、object4四个对象通过特定的Hash函数计算出对应的key值,然后散列到Hash环上。

          - 

        - 在采用一致性哈希算法的分布式集群中将新的机器加入。

        - 其原理是通过使用与对象存储一样的Hash算法将机器也映射到环中,然后以顺时针的方向计算,将所有对象存储到离自己最近的机器中。 

          - 

        -  通过上图可以看出对象与机器处于同一哈希空间中,这样按顺时针转动object1存储到了节点1中

        - object3存储到了节点2中

        - object2、object4存储到了节点3中。

        - 在这样的部署环境中,hash环是不会变更的,因此,通过算出对象的hash值就能快速的定位到对应的机器中,这样就能找到对象真正的存储位置了。

    五:问题解答

      - 如何解决单个节点压力过大的问题?

        - 在 一致哈希算法中,提出了虚拟节点的概念,既一个机器可以通过 哈希 算法,映射至多个节点。以解决单个节点的压力问题

  • 相关阅读:
    babel的使用以及安装配置
    常见的浏览器兼容性问题与解决方案——CSS篇
    ES6入门——变量的解构赋值
    ES6入门——let和const命令
    第一个移动端项目
    向Github提交更改的代码
    MySQL安装配置
    HTTP 状态消息
    HTMl基础
    Shell 常用的命令
  • 原文地址:https://www.cnblogs.com/25-lH/p/11345066.html
Copyright © 2011-2022 走看看