6.5 KiB
在服务器集群中,Nginx 起到一个反向代理服务器的作用。为了避免单独一个服务器压力过大导致服务器奔溃,就需要将不同用户的请求转发给不同给不同的服务器,保证集群中的每一台服务器都能正常运作,这种机制就叫做负载均衡。
下面说一下 Nginx 支持的 6 种负载均衡策略。
轮询(默认)
轮询是 Nginx 支持的默认负载均衡策略,轮询策略就是指每个请求会按时间顺序逐一分配到不同的后台服务器上。比如说一个集群中只有服务器 A 和服务器 B,第一次访问是服务器 A,第二次访问就是服务器 B,第三次访问就是服务器 A... 以此类推。
upstream balanceServer {
server localhost:8081;
server localhost:8082;
server localhost:8083;
server localhost:8084;
}
轮询策略提供如下参数:
fail_timeout | 与 max_fails 结合使用,表示 max_fails 次失败后服务器暂停的时间。 |
max_fails | 设置在 fail_timeout 参数设置的时间内最大失败次数,默认是 1,如果在这个时间内,所有针对该服务器的请求都失败了,那么认为该服务器会被认为是停机了,返回 proxy_next_upstream 模块定义的错误。 |
fail_time | 服务器会被认为停机的时间长度, 默认为 10s。 |
backup | 标记该服务器为备用服务器。当主服务器停止时,请求会被发送到它这里,当其他所有的非 backup 机器 down 掉或者繁忙的时候才会请求 backup 服务器,因此这台机器压力会最低。 |
down | 标记服务器永久停机了,表示当前的 server 暂时不参与负载。 |
weight | 负载的权重,默认为 1。weight 越大,表示这台服务器被访问的几率就越大。 |
在轮询策略下,如果集群中的某个服务器挂掉了,就会自动剔除该服务器。
轮询策略适合服务器配置相当,无状态且短平快的服务使用。
权重(weight,加权轮询)
权重策略是在轮询策略的基础上,另外指定了轮询的几率。
upstream balanceServer {
server localhost:8081;
server localhost:8082 backup;
server localhost:8083 max_fails=3 fail_timeout=20s;
server localhost:8084 weight=2;
}
在上面的例子中,weight 参数用来指定轮询的几率,weight 的默认值为 1,weight 的数值与访问比率成正比,比如 8084 端口的服务器被访问的几率是其他服务器的两倍。
权重越高,分配到需要处理的请求就越多。
权重策略可以与 least_conn 和 ip_hash 结合使用。
权重策略比较适合服务器的硬件配置差别较大的情况。
根据 IP 分配(ip_hash)
这种策略是按照客户端的 IP 去分配服务器,使同一个客户端的请求都转发到同一个后台服务器,保证了 Session 的统一性,可以用来解决 Session 的跨域问题。
upstream balanceServer {
ip_hash; # 指定负载均衡策略为ip_hash
server localhost:8081;
server localhost:8082 backup;
server localhost:8083 max_fails=3 fail_timeout=20s;
server localhost:8084 weight=2;
}
在 Nginx 的 1.3.1 版本之前,不能在这种策略种使用权重(weight)。
ip_hash 不能和 backup 参数同时使用。
这个策略适用于有状态服务,比如说 Session 会话。
当有服务器需要剔除的时候,必须手动 down 掉。
最少连接(least_conn)
这个策略是把请求转发给连接数较少的后端服务器。前面的轮询策略是把请求平均地转发给集群中的每个后台服务器,使得它们的负载大致相同,但是有些请求可能占用的时间会很长,可能导致所在的后端负载过高。这种情况下选用 least_conn 策略就能达到更好的负载均衡效果。
upstream balanceServer {
least_conn; # 指定负载均衡策略为least_conn
server localhost:8081;
server localhost:8082 backup;
server localhost:8083 max_fails=3 fail_timeout=20s;
server localhost:8084 weight=2;
}
这个策略适合用在请求处理时间长短不一造成服务器过载的场景。
响应时间(fair)
这种策略是按照服务器的响应时间来分配请求,响应时间短的优先分配。
upstream balanceServer {
fair; # 指定负载均衡策略为fair
server localhost:8081;
server localhost:8082;
server localhost:8083;
server localhost:8084;
}
fair 策略是一种第三方策略,需要安装第三方插件。
根据 URL 分配(url_hash)
这种策略是按照访问 url 的 hash 结果来分配请求,使得每个 url 定向到同一个后端服务器,要配合缓存命中来使用。同一个资源多次请求,可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。而使用 url_hash 的话,就可以使得同一个 url(也就是同一个资源请求)到达同一台服务器,一旦缓存住了资源,再次收到请求,就可以从缓存中读取。
upstream balanceServer {
url_hash; # 指定负载均衡策略为url_hash
server localhost:8081;
server localhost:8082;
server localhost:8083;
server localhost:8084;
}
url_hash 策略是一种第三方策略,需要安装第三方插件。
配置实例
# user yanggb;
worker_processes 4;
events {
# 最大并发数
worker_connections 1024;
}
http {
# 待选服务器列表
upstream balanceServer {
server 10.1.40.129:8099 fail_timeout=60s;
server 10.1.40.23:9088;
server 10.1.40.77:7086;
}
server {
# 监听端口
listen 80;
# 根目录下
location / {
# 选择哪个服务器列表
proxy_pass http://balanceServer;
}
}
}
总结
Nginx 的负载均衡其实也可以看作是 5 种,因为其中的权重轮询其实可以归类到轮询策略中。除了轮询策略(包括权重轮询)外的其他负载均衡策略都是使用不同的算法实现的,在实际的运用中,需要根据不同的场景有针对性地去选择不同的负载均衡策略(可以多种策略组合使用),来响应实际的需求。