Nginx负载均衡原理详解(图文全面总结)

负载均衡是大型架构的必经之路,也是各分布式中间件的核心组件,下面我就全面来详解Nginx负载均衡原理@mikechen

Nginx负载均衡

负载均衡是一种在多个服务器、或资源之间,分配客户端请求的方法,以优化资源使用、以及提升系统性能。

负载均衡可以水平扩展,即通过增加更多的服务器,来处理更多的请求,如下图所示:

Nginx负载均衡原理详解(图文全面总结)-mikechen

上面的负载均衡器,可以采用目前主流的:Nginx、LVS…等负载均衡器来实现。

当流量增加时,可以轻松添加新的服务器,到负载均衡中,以应对不断增长的需求。

并且,当某台服务器出现故障时,负载均衡器,会自动将流量重新分配到其他可用服务器上,从而避免系统停机、或服务中断。

所以,负载均衡不仅可以提升性能,还可以更好的解决系统可用性的问题。

 

Nginx负载均衡原理

负载均衡器(Load Balancer),一般位于客户端、和服务器之间。

如下图所示:

Nginx负载均衡原理详解(图文全面总结)-mikechen

负载均衡器,作为中介接受客户端请求,然后,根据预定的“负载均衡策略”,将请求分发给后端服务器进行处理。

常见的策略,包含:轮询 (Round Robin)、最少连接 (Least Connections)、加权………等等。

1.轮询

轮询 (Round Robin):按顺序将请求,分配给每个后端服务器,循环往复。

如下图所示:

Nginx负载均衡原理详解(图文全面总结)-mikechen

在 Nginx 的负载均衡配置中,轮询 (Round Robin) 是一种默认且常用的策略,即请求按顺序依次分配给每个后端服务器。

假设我们有四台后端服务器,命名为 backend1backend2backend3backend4,轮询策略,将依次将请求分配给这些服务器。

如下所示:

http {
    upstream backend {
        server backend1.example.com;
        server backend2.example.com;
        server backend3.example.com;
        server backend4.example.com;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://backend;
        }
    }
}

在这个配置中,Nginx 将请求依次分配给 backend1backend2backend3backend4,然后再从 backend1 开始循环。

 

2、加权轮询 (Weighted Round Robin)

加权轮询:在轮询的基础上,多增加一个权重,比如:为每个服务器分配权重,权重越高的服务器接收到的请求越多。

如下图所示:

Nginx负载均衡原理详解(图文全面总结)-mikechen

配置如下:

http {
    upstream backend {
        server backend1.example.com weight=3;
        server backend2.example.com weight=2;
        server backend3.example.com weight=1;
        server backend4.example.com weight=4;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://backend;
        }
    }
}

还是举一个例子,假如:我们有10个客户端,按照上面的3、2、1、4的权重。

在这个配置中,最终:backend1 将接收 3 份请求,backend2 接收 2 份,backend3 接收 1 份,backend4 接收 4 份请求。

所以,可以很直观的就可以看出:加权轮询,使得一些服务器在轮询过程中接收更多的请求,从而可以更好地利用资源。

如果你的服务器配置不一致,就可以采用加权轮询的策略。

 

3、最少连接 (Least Connections)

最少连接:就是将请求,分配给当前活动连接数最少的服务器。

如下图所示:

Nginx负载均衡原理详解(图文全面总结)-mikechen

假设我们有四台后端服务器,命名为 backend1backend2backend3 、和 backend4

http {
    upstream backend {
        least_conn;
        server backend1.example.com;
        server backend2.example.com;
        server backend3.example.com;
        server backend4.example.com;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://backend;
        }
    }
}

在这个配置中,least_conn 指令指定了最少连接策略,Nginx 会将新请求分配给当前活动连接数最少的服务器。

还是举一个例子,比如:当前的状态连接是这样:

backend1 活动连接数:2
backend2 活动连接数:3
backend3 活动连接数:1
backend4 活动连接数:4

当有一个新请求到达时,Nginx 会选择 backend3,因为它的活动连接数最少(1)。

后续,就依此类推,Nginx 会继续将新请求,分配给当前活动连接数最少的服务器。

 

4、IP 哈希 (IP Hash)

IP哈希:就是根据客户端 IP 地址的哈希值,将请求分配到固定的服务器,确保会话保持。

如下图所示:

Nginx负载均衡原理详解(图文全面总结)-mikechen

配置如下:

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

为了更好地理解 IP 哈希策略的工作过程,假设我们有以下四个客户端 IP 地址:

  1. 192.168.1.1
  2. 192.168.1.2
  3. 192.168.1.3
  4. 192.168.1.4

Nginx 将通过哈希函数,计算每个 IP 地址的哈希值,并将请求分配给相应的服务器。

比如:

客户端 192.168.1.1 发送请求:Nginx 计算哈希值并分配给 backend1;

客户端 192.168.1.2 发送请求:Nginx 计算哈希值并分配给 backend2;

这种方法,确保了来自同一 IP 地址的请求,总是被路由到同一台服务器。

非常适合需要会话保持的应用,比如:购物车、用户会话…….等场景。

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法