Nginx负载均衡策略
轮询策略
1
2
3
4
5
upstream myapp1 {
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
Nginx将请求平均分发至每个正常的下游服务器,同时该策略具有基本的容灾功能,当下游服务器C发生故障,Nginx中的Health checks
机制将会把C标记为failed,并在fail_timeout
时间内避免将请求转发至下游服务器C,经过fail_timeout
后,Nginx将通过客户端请求探测下游服务器C是否正常,如果正常,则C将被重新标记为live。
Nginx是一个多进程的应用,由master管理worker,当worker数量不为1时,进程间需要通过shm来确保当前的轮询状态是互通的
带权策略
1
2
3
4
5
upstream myapp1 {
server srv1.example.com weight=3;
server srv2.example.com;
server srv3.example.com;
}
实际上轮询策略是一种特殊的带权策略,轮询策略中,每个下游服务器的权值都为1,在一般的带权策略中,Nginx将会将请求按权值大小进行分配。例如,在当前情况下,每5个请求就有3个分发至srv1,1个分发至srv2,1个分发至srv3。
最少连接策略
1
2
3
4
5
6
upstream myapp1 {
least_conn;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
使用最少连接的负载平衡,nginx 将尽量不让繁忙的应用程序服务器因过多的请求而过载,而是将新请求分配给不太繁忙的服务器。
IP_HASH策略
1
2
3
4
5
6
upstream myapp1 {
ip_hash;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
通过对客户端的IP进行哈希,并通过哈希值mod的方式来决定将请求转发至具体的哪台下游服务器。
哈希策略
1
2
3
4
5
6
upstream myapp1 {
hash $cookie_jsessionid;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
通过对客户端的Cookie
中的jsessionid
进行哈希,并通过哈希值mod的方式来决定将请求转发至具体的哪台下游服务器。
$cookie_{key}为访问http请求头中cookie的某个键的方式
$http_{key}为访问http请求头headers中某个键的方式
fair策略(第三方)
1
2
3
4
5
6
upstream myapp1 {
fair;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
根据下游服务器的响应时间来决定请求转发,源码在这里
一致性哈希策略(第三方)
1
2
3
4
5
6
upstream myapp1 {
consistent_hash $cookie_jsessionid;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
通过对客户端的Cookie
中的jsessionid
进行哈希,并通过哈希环的方式来决定将请求转发至具体的哪台下游服务器。
推荐阅读:
This post is licensed under CC BY 4.0 by the author.