介绍
负载均衡是 跨多个应用程序实例优化资源利用率,最大限度地提高吞吐量,降低延迟,并确保容错配置的一个常用的技术。
nginx支持 以下三种算法:
round-robin:请求循环发放到每台机器
Least connected :下一个请求将发送给最少活跃连接数的服务器
Session persistence: 散列函数被用于确定应该为下一请求(基于客户端的IP地址)来选择什么样的服务器。
1. **默认负载算法 round-robin**
http { …… upstream web1 { server 192.168.1.128:9200; server 192.168.1.128:3000; } server { listen 80; server_name localhost; location / { proxy_pass http://web1; } }}
在下面面实例中有两个应用,分别是9200端口和3000端口,如果没指定权重默认轮询。将所有的http请求代理到web1
nginx的反向代理包括:http负载均衡,https,fastcgi,uwsgi,SCGI,memcached
假如要给https做负载均衡和代理的话,只要使用“HTTPS”作为协议就可以了。
举例子:
proxy_pass https://web1;
当设置FastCGI,uwsgi,SCGI或memcached的负载均衡时,也需要分别使用fastcgi_pass,uwsgi_pass,scgi_pass和memcached_pass指令。
2. **最少连接数算法 Least connected **
如果想要更加平衡各个应用程序的负载,最少连接算法应该应用在连接和请求时间更长的场合。
使用最少连接数负载算法,nginx将尝试避免单个应用过多的请求导致负载,发送新的请求到请求更少的机器。
要想使用最少连接数负载算法可进行以下配置:
upstream web1 { least_conn; server 192.168.1.128:9200; server 192.168.1.128:3000; }
3. **会话保持 Session persistence**
大家会发现“round-robin”和“ Least connected ”两种算法之后的请求都可能分布到不通的节点,因此不能保证用户的一直请求到指定服务器。假如你现在每个用户访问都会在nginx服务保存一个session,这样你就需要这个用户之后的访问一直到保存session的机器,这样这个客户端就需要对这个服务器产生“粘性”和“持久性”,在这里我们需要使用 ip hash的算法实现负载。
使用ip-hash,客户端的IP地址被用作散列键来确定应客户的要求进行选择什么样的服务器。此方法确保来自同一客户端的请求将总是被定向到在同一台服务器不可用时除外。
要想使用保持session的持久负载,需要进行一下设置:
upstream web1 { ip_hash; server 192.168.1.128:9200; server 192.168.1.128:3000; }
4. **权重**
我们也可以使用权重来影响服务器节点的负载,之前的例子没有指定,所以权重都一样,
当使用“round-robin”算法的时候应用或多或少,这样才可以提供足够请求,并且当请求以均匀的方式进行处理,并完成够快。
权重高的节点分配的请求将比低的节点多,举例子:
upstream web1 { server 192.168.1.128:9200 weight=3; server 192.168.1.128:3000; }
加入有4个请求将有三个请求到“9200”端口,1个到“3000”端口
同样也可以在最近的版本nginx使用权重在“Least connected”和“ip-hash”负载算法
5. **健康检查**
nginx的健康检查是为了一个检测失败的服务不再分到新的请求。当max_fails设置为0时候关闭健康检查
nginx支持以下健康参数:
max_fails=3 检查到失败3次,判定失败
fail_timeout=2 服务判定失败后等待2秒进行重试此期间服务视为不可用,默认为10秒
6. **拓展**
down 标记服务器为宕机
backup 标记这台服务器为备份服务器,当主服务器不可用是请求此服务器
例子:
upstream web1 { server 192.168.1.128:9200 weight=3; server 192.168.1.129:9200 backup; server 192.168.1.128:3000; keepalive 32; }
keepalive 32; 保持连接数32个
max_conns=333; 限制最大连接数333个
resolver 指定DNS解析域名
http { resolver 10.0.0.1; upstream u { zone ...; ... server example.com resolve; } }
slow_start=10 设置服务将在规定的10秒内权重0恢复到正常
nginx的upstream模块
http://nginx.org/en/docs/http/ngx_http_upstream_module.html#server
[第一章 nginx安装基本引导和进程信号]
[02-nginx IO模型]
[03-nginx负载均衡]