最近在做分布式服务,在配置nginx负载均衡时,了解了nginx负载均衡的几种模式。

Yrdro8.png

如何配置负载均衡

下面是一个配置实例。

# 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

Last modification:May 16th, 2020 at 12:15 pm
如果觉得我的文章对你有用,请尽情赞赏 🐶