负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
负载均衡的功能:
- 转发
- 故障移除
- 恢复添加
- 高可用 HA
目前,要实现负载均衡的办法很多,主要有以下两种:
- 一种是通过硬件来进行解决,常见的硬件有NetScaler、F5、Radware和Array等商用的负载均衡器,但是它们是比较昂贵的
- 一种是通过软件来进行解决的,常见的软件有LVS、Nginx、apache等,它们是基于Linux系统并且开源的负载均衡策略.
今天,我们要说的就是使用NGINX实现低成本的高可用性负载均衡。
nginx的负载均衡
如同上图,nginx的作用,用户再上网的时候访问网站,nginx会根据各种条件将请求发送带后台的条件匹配的服务器上,而转发的条件有6种:
- 轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器;
- weight:指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的
- ip_hash:每个请求按访问IP的hash结果分配,同一个IP客户端固定访问一个后端服务器。可以保证来自同一ip的请求被打到固定的机器上,可以解决session问题。
- url_hash:按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器。后台服务器为缓存的时候效率。
- fair:这是比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持 fair的,如果需要使用这种调度算法,必须下载Nginx的 upstream_fair模块。
- 最少连接负载均衡:least-connected/最少连接。当某些请求需要更长时间来完成时,最少连接可以更公平的控制应用实例上的负载。
6种负载均衡算法
1、默认轮训
默认轮询, 如果你是直接复制上面的upstream的话你使用的就是默认轮询方式,请求会随机派发到你配置的服务器上。
轮训配置
#设定负载均衡服务器列表
upstream www.zabbx.cn {
#后端服务器访问规则
server 192.168.10.100:8000 #server1
server 192.168.10.101:8001 #server2
server 192.168.10.102:8002 #server3
}
server {
listen 80;
server_name 192.168.10.10;
location / {
proxy_pass http://www.zabbx.cn;
}
}
在上面的例子中, 同一个应用有3个实例分别运行在srvver1-srvver3。当没有特别指定负载均衡方法时, 默认为round-robin/轮询。所有请求被代理到服务器集群www.zabbx.cn, 然后nginx实现HTTP负载均衡来分发请求。
proxy_pass http://www.zabbx.cn :表示将所有请求转发到www.zabbx.cn服务器组中配置的某一台服务器上。
upstream模块:配置反向代理服务器组,Nginx会根据配置,将请求分发给组里的某一台服务器。tomcats是服务器组的名称。
upstream模块下的server指令:配置处理请求的服务器IP或域名,端口可选,不配置默认使用80端口。通过上面的配置,Nginx默认将请求依次分配给100,101,102来处理,可以通过修改下面这些参数来改变默认的分配策略:
max_fails
默认为1。某台Server允许请求失败的次数,超过最大次数后,在fail_timeout时间内,新的请求将不会分配给这台机器。如果设置为0,Nginx会将这台Server置为永久无效状态,然后将请求发给定义了proxy_next_upstream, fastcgi_next_upstream, uwsgi_next_upstream, scgi_next_upstream, and memcached_next_upstream指令来处理这次错误的请求。
fail_timeout
默认为10秒。某台Server达到max_fails次失败请求后,在fail_timeout期间内,nginx会认为这台Server暂时不可用,不会将请求分配给它
upstream tomcats {
server 192.168.0.100:8080 weight=2 max_fails=3
fail_timeout=15;
server 192.168.0.101:8080 weight=3;
server 192.168.0.102:8080 weight=1;
}
192.168.0.100这台机器,如果有3次请求失败,nginx在15秒内,不会将新的请求分配给它。
max_conns
限制分配给某台Server处理的最大连接数量,超过这个数量,将不会分配新的连接给它。默认为0,表示不限制。注意:1.5.9之后的版本才有这个配置
upstream tomcats {
server 192.168.0.100:8080 max_conns=1000;
}
表示最多给100这台Server分配1000个请求,如果这台Server正在处理1000个请求,nginx将不会分配新的请求给到它。假如有一个请求处理完了,还剩下999个请求在处理,这时nginx也会将新的请求分配给它。
配置完成后
//检查 nginx 配置是否正确
nginx -t
//重新加载 nginx 配置
service nginx reload
2、weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
upstream backserver {
server 192.168.10.10 weight=4;
server 192.168.10.11 weight=6;
}
权重越高,在被访问的概率越大,如上例,分别是40%,60%。
3、ip_hash
上述方式存在一个问题就是说,在负载均衡系统中,假如用户在某台服务器上登录了,那么该用户第二次请求的时候,因为我们是负载均衡系统,每次请求都会重新定位到服务器集群中的某一个,那么已经登录某一个服务器的用户再重新定位到另一个服务器,其登录信息将会丢失,这样显然是不妥的。 我们可以采用ip_hash指令解决这个问题,如果客户已经访问了某个服务器,当用户再次访问时,会将该请求通过哈希算法,自动定位到该服务器。 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
upstream backserver {
ip_hash;
server 192.168.10.13:81;
server 192.168.10.14:82;
}
4、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream backserver {
server server1;
server server2;
fair;
}
5、url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个(对应的)后端服务器,后端服务器为缓存时比较有效。
upstream backserver {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
在需要使用负载均衡的server中增加
proxy_pass http://backserver/;
upstream backserver{
ip_hash;
server 127.0.0.1:9090 down; (down 表示单前的server暂时不参与负载)
server 127.0.0.1:8080 weight=2; (weight 默认为1.weight越大,负载的权重就越大)
server 127.0.0.1:6060 ;
server 127.0.0.1:7070 backup; (其它所有的非backup机器down或者忙的时候,请求backup机器)
}
设置后端负载均衡服务器的状态
- down,表示当前的server暂时不参与负载均衡。
- backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因 此这台机器的压力最轻。
注意:backup不能和ip_hash同时配置。因为ip_hash只能访问同一台服务器,而backup是在只有所有参与 负载均衡的服务器出现故障时,才会请求备份机。当所有负载均衡的服务器出现故障了,ip_hash的将无法 请求了。
6.最少连接负载均衡
使用最少连接负载均衡时,nginx试图尽量不给已经很忙的应用服务器增加过度的请求, 而是分配新请求到不是那么忙的服务器实例。
nginx中通过在服务器集群配置中使用least_conn指令来激活最少连接负载均衡方法:
upstream www.zabbx.cn {
least_conn;
server 192.168.101.60:81;
server 192.168.101.77:80;
}
原理:根据上添加的服务器判断哪台服务器分的连接最少就把请求给谁。
注意:
- nginx支持同时设置多组的负载均衡,用来给不用的server来使用。
- client_body_in_file_only设置为On 可以讲client post过来的数据记录到文件中用来做debug
- client_body_temp_path设置记录文件的目录 可以设置最多3层目录
- location对URL进行匹配.可以进行重定向或者进行新的代理 负载均衡
配置实例:
#user nobody;
worker_processes 4;
events {
# 最大并发数
worker_connections 1024;
}
http{
# 待选服务器列表
upstream www.zabbx.cn{
# ip_hash指令,将同一用户引入同一服务器。
ip_hash;
server 192.168.10.1 fail_timeout=60s;
server 192.168.10.2;
}
server{
# 监听端口
listen 80;
# 根目录下
location / {
# 选择哪个服务器列表
proxy_pass http://www.zabbx.cn;
}
}
评论区