负载均衡
负载均衡是什么?
我们之前使用proxy_pass的方式实现了nginx代理请求到后端的效果,随着我们的网站访问量越来越多,一个后端就不现实了,那么接下来我们应该如果在访问量日渐增大的情况下,满足线上业务的稳定呢?
解决方法就是:负载均衡
负载均衡简单说来人多力量大,打群架。
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 10.211.55.26:10086;
server 10.211.55.26:10087;
server 10.211.55.26:10088;
}
server {
listen 10.211.55.26:80;
server_name localhost;
location / {
proxy_pass http://backends;
}
}
后端代理配置文件:
#vim /etc/nginx/conf.d/backend.conf
server {
listen 10.211.55.26:10086;
location / {
root /var/www/html/hello/;
try_files $uri $uri/ =404;
}
}
server {
listen 10.211.55.26:10087;
location / {
root /var/www/html/nihao/;
try_files $uri $uri/ =404;
}
}
server {
listen 10.211.55.26:10088;
location / {
root /var/www/html/huanying/;
try_files $uri $uri/ =404;
}
}
负载均衡调度算法
官方资料网址: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
第三方算法:fair、url_hash
常用算法简介
轮询(默认):请求按顺序逐一分配到不同的后端服务器。
weight:指定轮询权重,值越大,分配到的几率就越高,适用于后端服务器性能不均衡情况。
ip_hash:按访问IP的哈希结果分配请求,分配后访客访问固定后端服务器,有效的解决动态网页会话共享问题。
加权轮训使用
upstream meiduo {
# weight设定权重,权重数越大,服务被访问的几率越大
server 10.211.55.30:8001 weight=1;
server 10.211.55.30:8002 weight=3;
server 10.211.55.30:8003 weight=6;
}
server {
listen 10.211.55.30:8080;
location / {
proxy_pass http://meiduo;
}
}
server {
listen 10.211.55.30:8001;
location / {
root /etc/nginx/html;
index 8001.html;
}
}
server {
listen 10.211.55.30:8002;
location / {
root /etc/nginx/html;
index 8002.html;
}
}
server {
listen 10.211.55.30:8003;
location / {
root /etc/nginx/html;
index 8003.html;
}
}
ip_hash使用
upstream meiduo {
# 使用ip_hash属性
ip_hash;
server 10.211.55.30:8001;
server 10.211.55.30:8002;
server 10.211.55.30:8003;
}
server {
listen 10.211.55.30:8080;
location / {
proxy_pass http://meiduo;
}
}
server {
listen 10.211.55.30:8001;
location / {
root /etc/nginx/html;
index 8001.html;
}
}
server {
listen 10.211.55.30:8002;
location / {
root /etc/nginx/html;
index 8002.html;
}
}
server {
listen 10.211.55.30:8003;
location / {
root /etc/nginx/html;
index 8003.html;
}
}