Skip to content

负载均衡

负载均衡是什么?

我们之前使用 proxy_pass 的方式实现了 nginx 代理请求到后端的效果,随着我们的网站访问量越来越多,一个后端就不现实了,那么接下来我们应该如果在访问量日渐增大的情况下,满足线上业务的稳定呢?

解决方法就是:负载均衡

负载均衡简单说来人多力量大,打群架。

在 nginx 中的负载均衡主要有两种:四层负载(IP:Port)、七层负载

nginx upstream 模块

官方介绍

官方资料:http://www.nginx.cn/doc/standard/httpupstream.html

官方的代理属性很多,我们主要介绍 upstream 和 ip_hash 属性

官方代码示例

nginx
upstream backend  {
    server backend1.example.com weight=5;
    server backend2.example.com:8080;
    server unix:/tmp/backend3;
}

server {
    location / {
        proxy_pass  http://backend;
    }
}

属性详解:

upstream 主要是定义一个后端服务地址的集合列表,每个后端服务使用一个 server 命令表示

upstream {} 和 Server {} 两部分内容属于平级关系。

后端服务状态

在 upstream 模块中,可以使用 server 命令指定后端服务器的地址,同时还可以设置后端服务器在负载均衡调度中的状态,常用的状态有以下几种:

  • down: 表示当前 server 主机暂时不参与负载均衡。
  • backup:后备主机,当所有非 backup 机器出现故障或者繁忙的时候,才会请求 backup 机器。
  • max_fails:允许请求的最大失败数,默认为 1,配合 fail_timeout 一起使用
  • fail_timeout:经历max_fails次失败后,暂停服务的时间,默认为 10s。

nginx负载均衡实践

负载均衡配置文件

shell
vim /etc/nginx/conf.d/upstream.conf
nginx
upstream backends {
    server 192.168.8.14:10086;
    server 192.168.8.14:10087;
    server 192.168.8.14:10088;
}

server {
    listen 80;
    server_name localhost;
    location / {
        proxy_pass http://backends;
    }
}

后端代理配置文件

shell
vim /etc/nginx/conf.d/backend.conf
nginx
server {
    listen 192.168.8.14:10086;
    location / {
        root /var/www/html/hello/;
        try_files $uri $uri/ =404;
    }
}

server {
    listen 192.168.8.14:10087;
    location / {
        root /var/www/html/nihao/;
        try_files $uri $uri/ =404;
    }
}

server {
    listen 192.168.8.14:10088;
    location / {
        root /var/www/html/huanying/;
        try_files $uri $uri/ =404;
    }
}

准备后端服务文件

shell
mkdir -p /var/www/html/hello/

echo '<h1>backend_hello</h1>' > /var/www/html/hello/index.html

mkdir -p /var/www/html/nihao/

echo '<h1>backend_nihao</h1>' > /var/www/html/nihao/index.html

mkdir -p /var/www/html/huanying/

echo '<h1>backend_huanying</h1>' > /var/www/html/huanying/index.html

检查 nginx 配置后重载服务

shell
/usr/sbin/nginx -t

systemctl reload nginx

netstat -tnulp | grep nginx

注意:

因为课堂演示配置文件过多,而且重载次数过多,所以推荐每次进行新实践的时候,pkill nginx 后再来启动,使用新的内存环境。

查看效果

shell
for i in {1..100};do curl http://192.168.8.14;done

<h1>backend_hello</h1>

<h1>backend_nihao</h1>

<h1>backend_huanying</h1>

...

<h1>backend_hello</h1>

<h1>backend_nihao</h1>

<h1>backend_huanying</h1>

负载均衡调度算法

官方资料:http://nginx.org/en/docs/http/ngx_http_upstream_module.html#example

Nginx 提供的负载均衡策略有两种:

内置策略:nginx 自带的算法

雨露均沾型:轮训、加权轮训、哈希

定向服务型:ip_hash、least_conn、cookie、route、lean、

商业类型:ntlm、least_time、queue、stick

扩展策略:各种结合业务场景自定义的算法或者第三方算法

自定义算法

第三方算法:fair、url_hash

常用算法简介:

txt
轮询(默认):请求按顺序逐一分配到不同的后端服务器。
weight:指定轮询权重,值越大,分配到的几率就越高,适用于后端服务器性能不均衡情况。
ip_hash:按访问IP的哈希结果分配请求,分配后访客访问固定后端服务器,有效的解决动态网页会话共享问题。
fair:基于后端服务器的响应时间来分配请求,响应时间短的优先分配。
url_hash:按访问URL的哈希结果分配请求,使同URL定向到同一台后端服务器,可提高后端缓存服务器的效率。

加权轮训实践

修改负载均衡配置文件

shell
vim /etc/nginx/conf.d/upstream.conf
shell
upstream backends {
 server 192.168.8.14:10086 backup;
 server 192.168.8.14:10087 weight=1;
 server 192.168.8.14:10088 weight=2;
}

...

检查 nginx 配置后重载服务

shell
/usr/sbin/nginx -t

systemctl reload nginx

netstat -tnulp | grep nginx

查看效果

shell
for i in {1..100};do curl http://192.168.8.14;done

<h1>backend_nihao</h1>

<h1>backend_huanying</h1>

<h1>backend_huanying</h1>

...

<h1>backend_nihao</h1>

<h1>backend_huanying</h1>

<h1>backend_huanying</h1>

ip_hash 实践

修改负载均衡配置文件

shell
vim /etc/nginx/conf.d/upstream.conf
nginx
upstream backends {
 ip_hash;
 server 192.168.8.14:10086 ;
 ...
}

...

检查 nginx 配置后重载服务

shell
/usr/sbin/nginx -t

systemctl reload nginx

netstat -tnulp | grep nginx

查看效果

shell
for i in {1..100};do curl http://192.168.8.14;done

<h1>backend_huanying</h1>

...

<h1>backend_huanying</h1>

基于反向代理的负载均衡

upstream httpd {
    server 192.168.44.102:80;
    server 192.168.43.103:80;
}

负载均衡策略

轮询

默认情况下使用轮询方式,逐一转发,这种方式适用于无状态请求。

weight(权重)

指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。

nginx
upstream httpd {
    server 127.0.0.1:8050 weight=10 down;
    server 127.0.0.1:8060 weight=1;
    server 127.0.0.1:8060 weight=1 backup;
}
  • down:表示当前的 server 暂时不参与负载
  • weight:默认为 1 . weight 越大,负载的权重就越大。
  • backup: 其它所有的非 backup 机器 down 或者忙的时候,请求 backup 机器。

ip_hash

根据客户端的 ip 地址转发同一台服务器,可以保持回话。

least_conn

最少连接访问

url_hash

根据用户访问的url定向转发请求

fair

根据后端服务器响应时间转发请求