zoukankan      html  css  js  c++  java
  • 一致性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/

  • 相关阅读:
    asp.net :使用jquery 的ajax +WebService+json 实现无刷新去后台值
    如何清理数据库缓存
    如何在虚拟机中Linux+Oracle10gRAC安装
    ORA01031 权限不足存储过程中DBA 角色用户无法执行DDL
    如何查看存储过程执行计划
    如何查看执行计划
    如何使用tkprof
    C#位运算讲解与示例[转]
    C#中Invalidate() 方法
    如何创建强命名程序集, 如何查看强命名程序集的PublicKeyToken
  • 原文地址:https://www.cnblogs.com/feng0919/p/12014184.html
Copyright © 2011-2022 走看看