Nginx 负载均衡

334 阅读3分钟

「这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战

负载均衡介绍

Nginx 是优秀的 Web 服务器,具有高并发高负载能力。因此,我们一般将 Nginx 作为前端的服务器直接向客户端提供静态文件服务,但一些复杂的业务不适合放到 Nginx,适合放到 Tomcat、Jetty 等服务器来处理。所以,Nginx 通常会被配置为既是静态资源服务器同时也是反向代理服务器,将后端请求转发到上游服务器处理。

作为代理服务器,Nginx 向上游的服务器集群转发请求时,需要根据负载均衡策略和上游服务器集群列表计算得到某一台服务器的地址,尽量把请求平均地分到每一台服务器上。

负载均衡策略

轮询

基于轮询的负载均衡策略是指所有请求会依次分发到每台服务器上,适合于所有服务器硬件相同的情况。

加权轮询

如果上游应用服务器性能有高有低,可以给服务器增加一个权重配置,根据服务器性能情况配置,性能越高,权重越大,分配的请求更多。

最少连接

基于最少连接的负载均衡策略是从所有上游服务器中,找出当前并发连接数最少的一个,将请求转发到它。如果有多个服务器连接数最少,则使用轮询算法进行选择。

ip_hash、hash

ip_hash 策略是以客户端的 IP 地址作为 hash 算法的关键字,映射到特定的上游服务器中。

hash 策略和 ip_hash 类似,但我们可以通过指定关键字作为 hash key。

一致性哈希算法

当使用 ip_hash 和 hash 策略时,如果上游服务器宕机或者扩容,hash 算法会引起大量的路由变更,可能导致缓存大范围失效。一致性 hash 算法可以解决这个问题。

一致性 hash 算法构造了一个长度为2^32的整数环,根据节点名称的 hash 值将服务器节点放置在这个 hash 环上,然后根据数据的 key 值计算得到其 hash 值,接着在 hash 环上顺时针查找距离其 hash 值最近的服务器节点,完成 key 到服务器的映射查找。

一致性 hash 扩容前

image-20220127000418737.png

一致性 hash 扩容后

image-20220127000230177.png

可以看到,扩容后,只有下面两台服务器结点之间的部分节点才有可能会路由变更。

负载均衡基本配置

upstream 块

语法: upstream name {...}

配置块:http

upstream 块定义了一个上游服务器的集群。

server

语法:server name [parameters];

配置块:upstream

server 配置项指定了一台上游服务器的名字,这个名字可以是域名、IP 地址、UNIX 句柄等,在其后可以跟参数。如下:

upstream backend {
   server backend1.com;
   server backend2.com;
}

配置了一个 name 为 backend 的 upstream 块,有两台上游服务器。不配置负载均衡策略时默认使用的是轮询策略。若要添加权重,则在上游服务器后加上对应的权重参数 weight,不配置默认权重是1。如下:

upstream backend {
   server backend1.com   weight = 2;
   server backend2.com;
}

least_conn

语法:least_conn;

配置块:upstream

upstream backend {
   least_conn;
   server backend1.com;
   server backend2.com;
}

ip_hash

语法:ip_hash;

配置块:upstream

upstream backend {
   ip_hash;
   server backend1.com;
   server backend2.com;
}