Nginx系列(一)——HTTP/TCP/UDP负载均衡

本文最近更新于2020.06.04

本文内容总结自Nginx Cookbook 2019
该电子书下载链接:
链接:https://pan.baidu.com/s/1Sob4JSjNKe77wMACmDZHig
提取码:rhc6

(一)HTTP负载均衡

Nginx经常用在一些HTTP服务的负载均衡上.
只需要在http模块内定义upstream模块.
先来看一下简单示例(主要是以下两个有注释的地方)

复制代码
[root@129-node conf]# cat nginx.conf|grep -v '#'|grep -v ^$
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    upstream backup{    #定义一个名为backup的upstream模块
        server 192.168.2.130:80;
        server 192.168.2.133:80;
    }
    server {
        listen       80;
        server_name  localhost;
        location / {
            proxy_pass http://backup;  #这里做相应的修改,使其转向upstream
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}
复制代码

假设我们的Nginx服务器为192.168.2.129,同时130和133的内容不同
那么当我们做了以上配置后,在浏览器中访问192.168.2.129,每次刷新页面都会轮流显示130和133的页面内容

upstream的调度算法主要有五种

1.轮询算法

轮询算法是默认的调度算法.所谓的轮询,即轮流调用后台服务器对外服务.
按照以下配置,则client会轮流访问130和133服务器内容

upstream backup{
    server 192.168.2.130:80;
    server 192.168.2.133:80;
}

2.权重算法

权重算法是在轮询算法上增加一个权重,使轮询时优先权重大的后台服务器.当后台服务器性能差异较大时,可以考虑将性能好的那台服务器权重加大.
按照以下配置,则client进行三次访问时,有1次会访问到130,另外2次会访问到133

upstream backup{
    server 192.168.2.130:80 weight=1;
    server 192.168.2.133:80 weight=2;
}

3.ip_hash算法
根据client的IP进行hash,根据hash结果分配后台服务器,从而使得该client每次访问的后台服务器都是同一台.该调度算法可以很好解决会话session问题.
安装以下配置,同一个client(也就是同一个IP)每次访问时都是访问到同一台后台服务器

upstream backup{
    ip_hash;
    server 192.168.2.130:80;
    server 192.168.2.133:80;
}

ps:ip_hash不能和weight权重算法搭配使用
4.fair算法(第三方)
fair顾名思义,公平地按照后端服务器的响应时间(rt)来分配请求,响应时间短即rt小的后端服务器优先分配请求。如果需要使用这种调度算法,必须下载Nginx的upstr_fair模块。

upstream backend {
    server 192.168.1.101;
    server 192.168.1.102;
    server 192.168.1.103;
    fair;
}

5.url_hash算法(第三方)
与ip_hash类似,但是按照访问url的hash结果来分配请求,使得每个url定向到同一个后端服务器,主要应用于后端服务器为缓存时的场景下。

upstream backend {
    server 192.168.1.101;
    server 192.168.1.102;
    server 192.168.1.103;
    hash $request_uri;
    hash_method crc32;
}

注意:url_hash算法的server语句中不能加weight等参数。
upstream中server指令语法如下:server address [parameters]
parameters:可选参数,可选参数如下:
1.down:表示当前server已停用
2.backup:表示当前server是备用服务器,只有其它非backup后端服务器都挂掉了或者很忙才会分配到请求。
3.weight:表示当前server负载权重,权重越大被请求几率越大。默认是1.
4.max_fails和fail_timeout一般会关联使用,如果某台server在fail_timeout时间内出现了max_fails次连接失败,那么Nginx会认为其已经挂掉了,从而在fail_timeout时间内不再去请求它,fail_timeout默认是10s,max_fails默认是1,即默认情况是只要发生错误就认为服务器挂掉了,如果将max_fails设置为0,则表示取消这项检查
5.slow_start:在服务故障重启时,让服务器逐步增加接收请求,避免大量请求短时间内再次搞垮服务器.对热点数据进行缓存,初始化数据库连接等等进行升温

(二)TCP Load Balancing
使用于mysql等tcp服务。不能放入默认配置文件中,因为该配置不能加入到http{}中。stream{}类似于http{},允许定义upstream{}。upstream里的服务器可设置三种模式,分别是Active,down,backup

1.添加stream模块

默认nginx没有安装stream模块,需要重新编译,编辑时指定--with-stream

./configure --prefix=/usr/local/nginx --with-stream     #重新编译,添加--with-stream模块   
make
mv /usr/local/nginx/sbin/nginx  /usr/local/nginx/sbin/nginx.bak    #移除原nginx可执行文件
cp objs/nginx /usr/local/nginx/sbin/nginx    #使用新编译后得到的nginx可执行文件代替原可执行文件
/usr/local/nginx/sbin/nginx -t    #测试配置文件是否正常
make upgrade    #执行最后的平滑升级,不影响业务

2.查看stream模块

如下带--with-stream即为安装成功

[root@129-node conf]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.19.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) 
configure arguments: --prefix=/usr/local/nginx --with-stream

3.配置nginx文件

和平时配置http负载均衡略有不同.该配置不能放在http{}模块中
以下配置实现通过3306端口对两台mysql服务器进行负载均衡

复制代码
[root@129-node conf]# cat nginx.conf|grep -v ^#|grep -v ^$
worker_processes  1;
events {
    worker_connections  1024;
}
stream{
    upstream mysql{
        server 192.168.2.130:3306;
        server 192.168.2.133:3306;
    }   
    server {
        listen 3306;
        proxy_pass mysql;
    }   
}
[root@129-node conf]# /usr/local/nginx/sbin/nginx -s reload  #平滑重启
[root@129-node conf]# netstat -tlnp  #可以看到我们的nginx监听了3306端口
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1085/master         
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      1279/nginx: master  
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      961/sshd            
tcp6       0      0 ::1:25                  :::*                    LISTEN      1085/master         
tcp6       0      0 :::22                   :::*                    LISTEN      961/sshd            
复制代码

PS:有一个问题暂时还没确定,那就是nginx是否可以同时支持http和tcp负载均衡,后续有时间再查询一下相关资料验证一下.理论上,好像是可以通过同时使用多个配置文件实现

4.验证TCP负载均衡

提前在130上创建bp130数据库,133上创建bp133数据库.效果如下:
可以看到同样的连接命令,分别返回了两个后台数据库的数据

复制代码
[root@134 ~]# mysql -uroot -h 192.168.2.129 --port 3306 -p123456 -e "show databases;"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| bp130              |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
[root@134 ~]# mysql -uroot -h 192.168.2.129 --port 3306 -p123456 -e "show databases;"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| bp133              |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
[root@134 ~]# 
复制代码

(三)UDP Load Balancing
例如ntp服务

复制代码
stream{
    upstream ntp {
        server ip1:123 weight=1;
        server ip2:123 weight=2;
    }
    server{
        listen 123 udp;    #需要明确指出是udp协议。添加reuseport值还可适用于vpn等client和server持续性连接服务
        proxy_pass ntp;
    }
}
复制代码

这个没实际使用过..

posted on   标配的小号  阅读(811)  评论(0编辑  收藏  举报

努力加载评论中...

导航

点击右上角即可分享
微信分享提示