分布式系统架构:技术栈详解与快速进阶
上QQ阅读APP看书,第一时间看更新

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所示。

080-1

图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所示。

081-1

图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所示。

082-1

图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所示。

082-2

图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所示。

083-1

图4-11 Nginx/upstream ip_hash代理图