• 一致性hash


    一、一致性hash的概念

    一致哈希是一种特殊的哈希算法。在使用一致哈希算法后,哈希表槽位数(大小)的改变平均只需要对 K/n个关键字重新映射,其中K是关键字的数量, n是槽位数量。然而在传统的哈希表中,添加或删除一个槽位的几乎需要对所有关键字进行重新映射。

    二、普通hash的原理

          普通hash算法能够均匀的将数据打散到这些节点上,使用的是Hash算法(MD5算法)实现的随机分布。但是当一个节点出现问题时,node数量发生了变化,item所对应node也会相应发生变化,改变的数量大概为99%,假设这是redis的缓存层,那么在后端服务器和数据库之间设置的缓存层等同于在一段时间内失效。

          如果继续使用普通hash来部署结构,则只能使用主从模式

     三、一致性hash的原理

          一致性Hash算法将整个哈希值空间组织成一个虚拟的圆环,将各个服务器使用Hash进行一个哈希,可以对服务器的IP或主机名等参数进行hash,确定每台机器在哈希环上的位置。

          接下来把访问的请求定义到相应的圆环上,圆环顺时针转动找到的第一个node便是定位到的服务器。如果前面的服务器不可用,则会继续向前寻找。增加node节点原理也类似。

    四、虚拟节点

           如果node节点太少时,可能会出现节点分布不均衡,此时肯定会有服务器压力大,其他服务器压力小的情况,为了避免这种情况,引入了虚拟节点的概念。

     例如上面的情况,可以为每个节点加几个虚拟节点,解决了服务器请求倾斜的问题。

    五、Nginx通过模块实现一致性hash

    Nginx使用ngx_http_upstream_consistent_hash模块来实现,需要重新进行编译安装。

    文件名:ngx_http_consistent_hash-master.zip

    github下载:https://github.com/replay/ngx_http_consistent_hash

    unzip ngx_http_consistent_hash-master
    #进入到nginx的源码安装目录
    #注需要加入之前的参数,可以nginx -v
     ./configure --"你之前的配置***"    --add-module=/home/guowenyan/ngx_http_consistent_hash-master
    make

    注:不要使用make install 

    make完成之后进入nginx的objs目录下可以看到新编译nginx文件

    执行nginx -t;如果没有报错,则可以执行下面操作

    service nginx stop
    cp /usr/bin/nginx /usr/bin/nginx_bak
    cp ./nginx /usr/bin/nginx
    service nginx start
    

      注意路径。。

    示例nginx.conf配置

    upstream hash {
            consistent_hash $request_uri;
            server 192.168.11.1:8080;
            server 192.168.11.1:8080;
            server 192.168.11.1:8080;
    }
    

      

    参考博客:

    https://zhuanlan.zhihu.com/p/34985026

    https://www.mokeyjay.com/archives/1524

    https://yikun.github.io/2016/06/09/%E4%B8%80%E8%87%B4%E6%80%A7%E5%93%88%E5%B8%8C%E7%AE%97%E6%B3%95%E7%9A%84%E7%90%86%E8%A7%A3%E4%B8%8E%E5%AE%9E%E8%B7%B5/

  • 相关阅读:
    树的直径、重心、中心
    DP优化--四边形不等式
    P5569 【SDOI2008】 石子合并(黑科技)
    P3147 262144游戏
    P3205 【HNOI2010】合唱队
    Windows Server 2012 虚拟化实战:网络(一)
    Windows Server 2012 虚拟化实战:存储(二)
    Android使用最小宽度限定符时最小宽度的计算
    Eclipse调试Android App若选择“Use same device for future launches”就再也无法选择其他设备的问题
    Python的模块引用和查找路径
  • 原文地址:https://www.cnblogs.com/feng0919/p/12014184.html
走看看 - 开发者的网上家园