Nginx负载均衡设置
一、负载均衡算法
实现负载均衡可有以下算法:
-
源地址哈希法:根据获取客户端的IP地址,通过哈希函数计算得到一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是客服端要访问服务器的序号。采用源地址哈希法进行负载均衡,同一IP地址的客户端,当后端服务器列表不变时,它每次都会映射到同一台后端服务器进行访问。
-
轮询法:将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载。
-
随机法:通过系统的随机算法,根据后端服务器的列表大小值来随机选取其中的一台服务器进行访问。
-
加权轮询法:不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不相同。给配置高、负载低的机器配置更高的权重,让其处理更多的请;而配置低、负载高的机器,给其分配较低的权重,降低其系统负载,加权轮询能很好地处理这一问题,并将请求顺序且按照权重分配到后端。
-
加权随机法:与加权轮询法一样,加权随机法也根据后端机器的配置,系统的负载分配不同的权重。不同的是,它是按照权重随机请求后端服务器,而非顺序。
-
最小连接数法:由于后端服务器的配置不尽相同,对于请求的处理有快有慢,最小连接数法根据后端服务器当前的连接情况,动态地选取其中当前积压连接数最少的一台服务器来处理当前的请求,尽可能地提高后端服务的利用效率,将负责合理地分流到每一台服务器。
二、Nginx实现负载均衡
Nginx实现负载均衡的原理是利用Http重定向实现负载均衡
1)配置文件在哪?
rpm 安装方式nginx配置文件地址 /etc/nginx/conf.d 目录下面,配置文件内容结构如下:
upstream upstream_name {
server 127.0.0.1:8081;
server 192.168.0.137:8081;
}
server {
listen 8000;
server_name localhost;
location / {
proxy_pass http://upstream_name;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
修改完配置文件以后,还需要输入重新加载配置命令:
//重新加载配置
nginx -s reload
//或者重启nginx
systemctl restart nginx
2)如何配置负载均衡?
我们从官网上面看一下负载均衡配置案例,然后根据案例配置去对每项参数进行解释,案例如下(注意:以下模块内容必须放在http模块下):
resolver 10.0.0.1;
upstream dynamic {
zone upstream_dynamic 64k;
server backend1.example.com weight=5;
server backend2.example.com:8080 fail_timeout=5s slow_start=30s;
server 192.0.2.1 max_fails=3;
server backend3.example.com resolve;
server backend4.example.com service=http resolve;
server backup1.example.com:8080 backup;
server backup2.example.com:8080 backup;
}
server {
location / {
proxy_pass http://dynamic;
health_check;
}
}
从上面这个案例Nginx会作如下执行,默认情况下,请求使用 加权循环平衡法。 在上面的示例中,每 7 个请求将按如下方式分配: 5个请求去 backend1.example.com
向第二台和第三台服务器分别发送一个请求。 如果在与服务器通信过程中发生错误,请求将 被传递到下一个服务器,依此类推,直到所有的功能 服务器将被尝试。 如果无法从任何服务器获得成功的响应, 客户端将收到与最后一个服务器通信的结果。
server命令解析
语法:
句法: server address [parameters];
默认: —
语境: upstream
parameters类别:
参数名 | 类型 | 说明 |
---|---|---|
weight | number | 服务器权重,默认为 1 |
max_conns | number | 限制最大值 number同时活跃的 与代理服务器的连接 (1.11.5)。 默认值为零,表示没有限制。 |
max_fails | number | 设置与服务器通信失败的尝试次数。默认情况下,不成功的尝试次数设置为 1。 |
fail_timeout | time | 指定尝试失败的超时时间,默认情况下,该参数设置为 10 秒。(10s) |
backup | 无 | 将服务器标记为备份服务器。 当主服务器不可用时,它将被传递请求 |
down | 无 | 将服务器标记为永久不可用 |
商业版本需要付费的其他属性这里就不阐述了
Nginx负载均衡策略
1)轮训策略:
upstream模块默认的负载均衡策略是轮训策略,它会依次在服务列表进行分发
2)加权策略:
容器会根据server设置的权重进行请求分配,例如server1 weight=5 ,server2 weight=2 将会使得每 7 个请求将按如下方式分配server1 5个请求,server2两个请求。
3)Ip哈希策略:
其中请求 根据客户端 IP 地址在服务器之间分布,确保来自同一客户端的请求将始终 传递到同一服务器。使用方法是在upstream模块下面添加ip_hash;
upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com down;
server backend4.example.com;
}
4)最少连接数策略(least_conn):
指定组应使用负载平衡方法,其中请求 传递给活动连接数最少的服务器, 考虑到服务器的权重。 如果有多个这样的服务器,它们会依次尝试使用 加权循环平衡法。
upstream backend {
least_conn;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com down;
server backend4.example.com;
}
5)扩展策略(需要安装插件):
- fair:响应时间方式,按照服务器端的响应时间来分配请求,响应时间短的优先分配。upstream模块配置模板如下:
upstream backend {
fair;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com down;
server backend4.example.com;
}
- url_hash:url分配方式,按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,要配合缓存命中来使用。同一个资源多次请求可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。而使用url_hash,可以使得同一个url(也就是同一个资源请求)会到达同一台服务器,一旦缓存住了资源,再次收到请求,就可以在缓存中读取。upstream模块配置模板如下:
upstream backend {
hash $request_uri;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com down;
server backend4.example.com;
}
还有一些其他需要付费的策略这里就不进行阐述了,比如:最少时间策略( least_time)、随机策略等。
网友评论