基于Nginx的负载均衡概述与实现(2)

$request_uri是内置提供的变量,就是请求的uri咯,consistent是一致性哈希算法,这个倒是可以说道说道。我们知道哈希就是无论输入什么值,都会得到一个固定长度的散列值,我们对不同的uri求散列值,如果后端服务器有6台服务器,然后给他们进行编号0-6,然后用求的散列值对6做取余运算,就一定会得到0-6中的一个值,然后把这个分配给对应编号的服务器。不过,这个算法有个问题,如果某个服务器挂掉,我们就得重新以5来做取余运算,然后重新把所有过程从来一遍。所以就出现了上面的一致性哈希算法,我们现在先不关注后端有几台服务器,我们把0到2的32次方减一这个多个数字分布在一个圆环上,就上钟表上的0-12一样,0的地方就是12.然后我们对后端每个服务器的ip地址做哈希计算,得到的值在和2的32次方做取余运算,那么后端的这些服务器一定会分布在这个圆环上的某个点处,然后我们在对hash选项指定的内容,此处是uri做hash计算,得到的值在和2的32次方取余,所以这些uri也会分布在这个圆环上。然后我们规定,在这个圆环上分布的服务器,负责响应它到它下一个服务器的区间上分布的请求。此时当后端的某台服务器挂掉时,只会影响这台服务器后面的URI请求,而不会影响其他服务器,只用把属于这台服务器的请求,给它上一台就好,我们画个图说明下。

基于Nginx的负载均衡概述与实现

我们用方块表示后端服务器经过哈希计算的分布情况,用红色的线表示不同uri请求的分布情况,服务器1只用负责1到2之间的uri请求,以此类推,5只用负责5到1之间的uri请求,如右图所示,假如2号服务器挂掉了,我们就把所有属于2号服务器的请求分配给1号服务器~好啦~这就是一致性哈希算法~~~很重要哟,许多地方都有用到。

除了支持web服务的负载均衡,nginx还支持其他服务的负载均衡,此时我们就得用到另外d的模块stream和stream_proxy_module。不过这两个模块必须得是1.9.13以上的版本~并且默认stream并没有加载。得在编译时加入--with-stream选项,不过如果我们用的是预编译的rpm包安装的话,默认是有这个的~以下是/etc/nginx/nginx.conf

user  nginx;
worker_processes  1;
 
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
 
 
events {
    worker_connections  1024;
}
stream {
        upstream sshsrvs {
                server 192.168.10.130:22;
                server 192.168.10.131:22;
        }
 
        server {
                listen 172.16.100.6:22202;
                proxy_pass sshsrvs;
                proxy_timeout 60s;
                proxy_connect_timeout 10s;
        }
 
}

我们启动或者重启nginx,然后我们就可以通过22202 访问后端的ssh服务了,MySQL服务也类似~当然是轮询访问啦~和上面的web服务类似。

下面关于Nginx的文章您也可能喜欢,不妨参考下:

CentOS 7.2下编译安装PHP7.0.10+MySQL5.7.14+Nginx1.10.1 

Nginx实现集群的负载均衡配置过程详解

Nginx高级应用--负载均衡与rewrite规则 

CentOS 6.4安装配置Nginx+Pcre+php-fpm

Nginx安装配置使用详细笔记

Nginx日志过滤 使用ngx_log_if不记录特定日志

Nginx的500,502,504错误解决方法

CentOS 7 编译安装Nginx1.10.2 脚本启动失败解决思路

Nginx简单实现网站的负载均衡 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/168de32d9c575928fed8d77e525cfb48.html