负载均衡
负载均衡是什么?
我们之前使用 proxy_pass 的方式实现了 nginx 代理请求到后端的效果,随着我们的网站访问量越来越多,一个后端就不现实了,那么接下来我们应该如果在访问量日渐增大的情况下,满足线上业务的稳定呢?
解决方法就是:负载均衡
负载均衡简单说来人多力量大,打群架。
在 nginx 中的负载均衡主要有两种:四层负载(IP:Port)、七层负载
nginx upstream 模块
官方介绍
官方资料:http://www.nginx.cn/doc/standard/httpupstream.html
官方的代理属性很多,我们主要介绍 upstream 和 ip_hash 属性
官方代码示例
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负载均衡实践
负载均衡配置文件
vim /etc/nginx/conf.d/upstream.conf
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;
}
}
后端代理配置文件
vim /etc/nginx/conf.d/backend.conf
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;
}
}
准备后端服务文件
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 配置后重载服务
/usr/sbin/nginx -t
systemctl reload nginx
netstat -tnulp | grep nginx
注意:
因为课堂演示配置文件过多,而且重载次数过多,所以推荐每次进行新实践的时候,pkill nginx 后再来启动,使用新的内存环境。
查看效果
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
常用算法简介:
轮询(默认):请求按顺序逐一分配到不同的后端服务器。
weight:指定轮询权重,值越大,分配到的几率就越高,适用于后端服务器性能不均衡情况。
ip_hash:按访问IP的哈希结果分配请求,分配后访客访问固定后端服务器,有效的解决动态网页会话共享问题。
fair:基于后端服务器的响应时间来分配请求,响应时间短的优先分配。
url_hash:按访问URL的哈希结果分配请求,使同URL定向到同一台后端服务器,可提高后端缓存服务器的效率。
加权轮训实践
修改负载均衡配置文件
vim /etc/nginx/conf.d/upstream.conf
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 配置后重载服务
/usr/sbin/nginx -t
systemctl reload nginx
netstat -tnulp | grep nginx
查看效果
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 实践
修改负载均衡配置文件
vim /etc/nginx/conf.d/upstream.conf
upstream backends {
ip_hash;
server 192.168.8.14:10086 ;
...
}
...
检查 nginx 配置后重载服务
/usr/sbin/nginx -t
systemctl reload nginx
netstat -tnulp | grep nginx
查看效果
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 和访问比率成正比,用于后端服务器性能不均的情况。
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
根据后端服务器响应时间转发请求