一致性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/

原文地址:https://www.cnblogs.com/feng0919/p/12014184.html