最近在做分布式服务,在配置nginx负载均衡时,了解了nginx负载均衡的几种模式。
如何配置负载均衡
下面是一个配置实例。
# Define which servers to include in the load balancing scheme.
# It's best to use the servers' private IPs for better performance and security.
# You can find the private IPs at your UpCloud control panel Network section.
http {
upstream backend {
server 10.1.0.101;
server 10.1.0.102;
server 10.1.0.103;
}
# This server accepts all traffic to port 80 and passes it to the upstream.
# Notice that the upstream name and the proxy_pass need to match.
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
}
配置后,重启nginx,在浏览器访问公网地址时,你的请求会被转发到负载均衡器后的其中一台服务器。
负载均衡的几种模式
默认轮询分配
nginx 默认使用轮询(round-robin)算法,nginx 会按照配置文件里服务器的顺序,轮询来转发请求,第一个请求会被转发到第一台服务器(10.1.0.101),第二个请求会被转发到第二台服务器(10.1.0.102)。
随机分配
upstream backend {
random;
server 10.1.0.101;
server 10.1.0.102;
server 10.1.0.103;
}
nginx 将请求随机分配到一台服务器上。
最少连接分配
upstream backend {
least_conn;
server 10.1.0.101;
server 10.1.0.102;
server 10.1.0.103;
}
nginx 将请求转发到当前连接数最少的服务器上。
IP 哈希分配
upstream backend {
ip_hash;
server 10.1.0.101;
server 10.1.0.102;
server 10.1.0.103;
}
轮询分配和最小连接分配的优点是公平,但是同一个客户端前后两次的请求,可能会被转发到不同的服务器,如果涉及到会话Session,处理就比较复杂。使用IP哈希分配,nginx 会使用客户端的IP地址做为key,来决定请求转到到哪台服务器。这样保证了,只要客户端的IP地址不变和服务器都可用的情况下,同一IP的请求都被转发到同一台服务器。
普通哈希分配
upstream backend {
hash $request_uri consistent;
server 10.1.0.101;
server 10.1.0.102;
server 10.1.0.103;
}
nginx 根据用户定义的key来进行哈希分配。
IP哈希分配来处理会话Session问题,APP客户端在WIFI和蜂窝网络间切换,IP会改变,请求就可能会被转发到不同服务器。我们可以使用登录凭证token作为key,使用普通哈希分配,保证请求都被转发到同一台服务器。
consistent
是可选的,使用一致性哈希算法
来决定请求被转发到哪台服务器。
权重
upstream backend {
server 10.1.0.101 weight=4;
server 10.1.0.102 weight=2;
server 10.1.0.103;
}
服务器的CPU和内存等资源经常存在差异,这种情况,我们希望 nginx 将大部分请求转发到性能高的服务器。
上面的配置,转发到第一台服务器的请求数会是第二台服务器的两倍,是第三台服务器的四倍。
参考资料
How to configure load balancing using Nginx
http://nginx.org/en/docs/stream/ngx_stream_upstream_module.html