4.4.4 负载均衡策略
upstream机制提供了负载均衡的功能,可以将请求负载分担到集群服务器的某个服务器上面。它的工作流程如下:
1)分析客户端请求报文,构建发往上游服务器的请求报文;
2)调用ngx_http_upstream_init开始与上游服务器建立TCP连接;
3)发送在第一步中组建的请求报文;
4)接收来自上游服务器的响应头并进行解析,之后往下游转发;
5)接收来自上游服务器的相应体,并进行转发。
注意
upstream机制允许开发人员自己设定相应的处理方式,来达到自己的目的。
upstream支持6种负载分配方式,前三种为Nginx原生支持的分配方式,后三种为第三方支持的分配方式。
1. Nginx轮询
轮询是upstream的默认分配方式,即每个请求按照时间顺序轮流分配到不同的后端服务器,如果某个后端服务器宕掉后,则能自动将其剔除,剩下的继续轮询。Niginx轮询实现如代码清单4-7所示。
代码清单4-7 Nginx轮询
upstream zachary.sh.cn { server 192.168.1.10:8081; server 192.168.1.11:8081; }
Nginx轮询代理示意如图4-7所示。
图4-7 Nginx/upstream轮询代理图
2. Nginx权重
权重是轮询的加强版,即在轮询的基础上还可以指定轮询比率,weight和访问概率成正比,主要应用于应用服务器性能不均的情况。Nginx权重实现如代码清单4-8所示,这里192.168.1.11的访问比例是192.168.1.10的两倍。
代码清单4-8 Nginx权重
upstream zachary.sh.cn { server 192.168.1.10:8081 weight=1; server 192.168.1.11:8081 weight=2; }
Nginx权重代理示意如图4-8所示。
图4-8 Nginx/upstream权重代理图
3. Nginx ip_hash
ip_hash即每个请求会按照访问IP的hash值分配,这样同一客户端连续的Web请求都会被分发到同一服务器进行处理,可以解决session的问题。如果服务器宕掉,则能自动将其剔除,如代码清单4-9所示。
代码清单4-9 Nginx ip_hash
upstream zachary.sh.cn { ip_hash server 192.168.1.10:8081; server 192.168.1.11:8081; }
Nginx ip_hash的代理示意如图4-9所示。
图4-9 Nginx/upstream ip_hash代理图
4. Nginx fair
fair即按后端服务器的响应时间来分配请求,响应时间短的优先分配,如代码清单4-10所示。
代码清单4-10 Nginx fair
upstream zachary.sh.cn { server 192.168.1.10:8081; server 192.168.1.11:8081; fair; }
Nginx fair的代理示意如图4-10所示。
图4-10 Nginx/upstream fair代理图
5. Nginx url_hash
url_hash与ip_hash类似,但是其按照访问URL的hash结果来分配请求,使得每个URL定向到同一个后端服务器,主要应用于后端服务器为缓存时的场景中,如代码清单4-11所示。
代码清单4-11 Nginx url_hash
upstream zachary.sh.cn { server 192.168.1.10:8081; server 192.168.1.11:8081; hash $request_uri; hash_method crc32; }
6. Nginx least_conn
least_conn把请求转发给连接数较少的后端服务器,如代码清单4-12所示。
代码清单4-12 Nginx least_conn
upstream zachary.sh.cn { least_conn; #把请求转发给连接数较少的后端服务器 server 192.168.1.10:8081; server 192.168.1.11:8081; }
Nginx least_conn的代理示意如图4-11所示。
图4-11 Nginx/upstream ip_hash代理图