Nginx集群和负载均衡
集群
#三台服务器集群
upstream jinsh {
server 192.168.10.125:8080;
server 192.168.10.126:8080;
server 192.168.10.127:8080;
}
#当浏览器每次访问 http://www.jinsh.com 时,将会以轮询的形式访问上面的三台服务器
server {
listen 80;
server_name www.jinsh.com;
location / {
proxy_pass http://jinsh;
}
}
- 负载均衡 轮询与加权
#使用weight来配置权重,weight值越大该台服务器接受请求会越多
#不加weight,默认是按轮询的方式挨个接收请求的
upstream jinsh {
server 192.168.10.125:8080 weight=5;
server 192.168.10.126:8080 weight=2;
server 192.168.10.127:8080 weight=1;
}
- 负载均衡 ip_hash
算法:hash(ip) % node_counts = index
ip_hash 可以保证用户访问可以请求到上游服务中的固定的服务器,前提是用户ip没有发生更改。
使用ip_hash的注意点:不能把后台服务器直接移除,只能标记down
upstream tomcats {
ip_hash;
server 192.168.1.173:8080;
server 192.168.1.174:8080 down;
server 192.168.1.175:8080;
}
参考:http://nginx.org/en/docs/http/ngx_http_upstream_module.html#ip_hash
-
哈希算法与一致性哈希算法
- 哈希算法:hash(ip) % node_counts = index
ip_hash会取IP地址的前三段进行计算,所以同一内网下的计算机将会请求到同一个节点。
哈希算法的问题:当服务器节点数发生变动时,算计的计算将发生改变。
- 一致性哈希算法:
当服务器节点数发生变动时,只会影响到变动节点上的用户请求。
- 哈希算法:hash(ip) % node_counts = index
-
负载均衡 url_hash
算法:hash(url) % node_counts = index
根据请求的 url 来分配响应节点
upstream tomcats {
# url hash
hash $request_uri;
server 192.168.1.173:8080;
server 192.168.1.174:8080 down;
server 192.168.1.175:8080;
}
- 负载均衡 least_conn
根据最少连接数去分配,哪个节点连接数最少就分配给哪个节点
upstream tomcats {
least_conn;
server 192.168.1.173:8080;
server 192.168.1.174:8080;
server 192.168.1.175:8080;
}
upstream指令参数
- max_conns:限制每台server的连接数,用于保护避免过载,可起到限流作用。
#如果此时worker进程数配置的是1,那么该集群同一时刻就只能处理6个请求
upstream jinsh {
server 192.168.10.125:8080 max_conns=2;
server 192.168.10.126:8080 max_conns=2;
server 192.168.10.127:8080 max_conns=2;
}
- slow_start:让服务器缓慢加入到集群中来
upstream tomcats {
server 192.168.1.173:8080 weight=6 slow_start=60s;
server 192.168.1.174:8080 weight=2;
server 192.168.1.175:8080 weight=2;
}
#该参数不能使用在hash和random load balancing中
#如果在upstream中只有一台server,则该参数失效
- down:标识某台服务器不可用
upstream tomcats {
server 192.168.1.173:8080 down; #这台服务器将无法访问
server 192.168.1.174:8080 weight=2;
server 192.168.1.175:8080 weight=2;
}
- backup:标识某台服务器为备用机
upstream tomcats {
server 192.168.1.173:8080 backup; #当下面两台服务器都无法访问时,请求才会访问到这一台备用服务器
server 192.168.1.174:8080 weight=2;
server 192.168.1.175:8080 weight=2;
}
#backup参数不能使用在hash和random load balancing中。
- max_fails和fail_timeout
#max_fails:表示失败几次,则标记server已宕机,剔除上游服务。
#fail_timeout:表示失败的重试时间。
upstream tomcats {
server 192.168.1.173:8080 max_fails=2 fail_timeout=15s;
server 192.168.1.174:8080 weight=2;
server 192.168.1.175:8080 weight=2;
}
#则表示在15秒内请求某一server失败达到2次后,则认为该server已经挂了或者宕机了,随后15秒内不会有新的请求到达刚刚挂掉的节点上,而是会请求到正常运作的server,15秒后会再有新请求尝试连接挂掉的server,如果还是失败,重复上一过程,直到恢复
Keepalived 提高吞吐量
- Keepalived :设置长连接处理的数量
- proxy_http_version:设置长连接http版本为1.1
- proxy_set_header:清除connection header 信息
upstream tomcats {
server 192.168.1.190:8080;
keepalive 32;
}
server {
listen 80;
server_name www.tomcats.com;
location / {
proxy_pass http://tomcats;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}