相关推荐recommended
nginx 多种负载均衡
作者:mmseoamin日期:2023-12-18

一、概念

Nginx 负载均衡技术是一种在分布式应用系统中广泛使用的技术,通过实现请求的平衡分发,能够提高应用程序的可用性和性能,保障系统的稳定性和可靠性。

Nginx 负载均衡是一种将请求集中到多个服务器上的技术。通过负载均衡,可以实现请求在不同的服务器间分发,从而避免单个服务器出现过载,提高应用程序的可用性和性能。

Nginx 负载均衡通过将一台服务器作为代理服务器,将请求转发到多个后端服务器,从而实现负载均衡。负载均衡时,代理服务器根据一定的负载均衡算法,将客户端请求转发到不同的后端服务器上,然后将响应返回给客户端。这样可以避免某个服务器的负载过重,使整个应用程序的负载更加均衡,提高了应用程序的可用性和性能。

Nginx 支持多种负载均衡算法,如轮询、IP 哈希、最少连接、加权轮询等。每种算法都有其特定的应用场景和优缺点,系统管理员可以根据不同的需求选择适当的算法。

二、多种策略

Nginx 负载均衡有以下几种类型:

  1. 轮询(Round Robin):这是最简单的一种负载均衡方式,循环将请求依次分发至每个被代理的服务器。Nginx 默认使用轮询方式。

  2. IP 哈希(IP Hash):这种方式根据请求客户端的 IP 地址来计算 hash,然后用 hash 值对服务器总数取模得到分配的服务器地址,如果客户端的 IP 地址不变,那么它的请求都将被分配到同一台服务器上。

  3. 最少连接(Least Connections):这种方式基于后端服务器连接数的统计数据,将新的请求分配到连接数最少的服务器上,这种方式能够确保每个后端服务器的负载尽量平衡。

  4. 加权轮询(Weighted Round Robin):这种方式通过为每个被代理的服务器分配不同的权重值,从而使得高权重服务器有更多的请求机会。

  5. 加权最少连接(Weighted Least Connections):这种方式将前两种负载均衡方式的优点相结合,不仅考虑到了每个服务器的负载情况,还能使高权重的服务器拥有更多的连接机会。

  6. URL Hash:这种方式是根据访问 URL 的 hash 值来进行分配,通常用于后端服务器不能共享 session 的情况,使得每次请求都能够访问到之前的数据。

以上这些方式都可以通过 Nginx 配置文件的 upstream 模块进行配置。根据不同的请求资源、后端服务器负载情况,以及业务需求,选择合适的负载均衡方式非常重要。

三、实例

3.1 1. 轮询(Round Robin)

假设我们有三台服务器,分别为 Server A、Server B 和 Server C,在 Nginx 配置文件中,配置如下:

http {
    upstream backend {
        server serverA.example.com;
        server serverB.example.com;
        server serverC.example.com;
    }
    server {
        listen 80;
        server_name example.com;
        location / {
            proxy_pass http://backend;
        }
    }
}

当请求到达服务的时候,Nginx 将会将其分发给 Server A、Server B、Server C 三台服务器,每次循环会将请求依次分发到每一台服务器上,这就是轮询(Round Robin)负载均衡方式的实现方式。

3.2 2. IP 哈希(IP Hash)

我们假设有三台服务器,分别为 Server1(IP 地址为 192.168.1.1)、Server2(IP 地址为 192.168.1.2)和 Server3(IP 地址为 192.168.1.3),并且我们希望客户端 IP 地址相同的请求,始终访问同一台服务器。在 Nginx 配置文件中,我们可以这样配置:

http {
    upstream backend {
        ip_hash;
        server server1.example.com;
        server server2.example.com;
        server server3.example.com;
    }
    server {
        listen 80;
        server_name example.com;
        location / {
            proxy_pass http://backend;
        }
    }
}

这里的 ip_hash 指令是 Nginx 内置的模块指令,它将使用客户端的 IP 地址哈希计算,将哈希值与服务器的总数进行取模运算,以此来实现请求将被分配到被哈希值计算得到的服务器上。

3.3 最少连接(Least Connections)

在这种方式中,Nginx 会将请求分配到连接数最少的服务器上,以便于后端服务器的负载尽可能平衡。在 Nginx 的配置文件中,可以这样配置:

http {
    upstream backend {
        least_conn;
        server server1.example.com;
        server server2.example.com;
        server server3.example.com;
    }
    server {
        listen 80;
        server_name example.com;
        location / {
            proxy_pass http://backend;
        }
    }
}

在这个例子中,least_conn 指令将会启用最少连接负载均衡策略。

3.4 加权轮询(Weighted Round Robin)

这种方式可以通过给不同的服务器配置不同的权重,从而让高权重的服务器有更多的请求机会。在 Nginx 的配置文件中可以这样配置:

http {
    upstream backend {
        server server1.example.com weight=3;
        server server2.example.com weight=2;
        server server3.example.com weight=1;
    }
    server {
        listen 80;
        server_name example.com;
        location / {
            proxy_pass http://backend;
        }
    }
}

在这个例子中,我们给 server1 权重为 3,server2 权重为 2,server3 权重为 1。这实际上意味着,将有 3/6 的请求会被路由到 Server1,有 2/6 的请求会被路由到 Server2,有 1/6 的请求会被路由到 Server3。

3.5 加权最少连接(Weighted Least Connections)

与最少连接不同的是,加权最少连接还将考虑每个服务器的权重,将新的请求分配到连接数最少且权重最大的服务器上。在 Nginx 的配置文件中,可以这样配置:

http {
    upstream backend {
        least_conn;
        server server1.example.com weight=3;
        server server2.example.com weight=2;
        server server3.example.com weight=1;
    }
    server {
        listen 80;
        server_name example.com;
        location / {
            proxy_pass http://backend;
        }
    }
}

在这个例子中,least_conn 指令将会启用最少连接负载均衡策略,并且将 server1 的权重设置为 3, server2 的权重设置为 2,将 server3 的权重设置为 1。这种方式将会将新的请求分配到连接数最少且权重最大的服务器上。

3.6 6. URL 哈希(URL Hash)

这种方式根据请求 URL 的 hash 值来计算,以此来决定将请求路由到哪个后端服务器。特别适用于后端服务器不能共享 session 的情况,让每次请求都能够访问到之前的数据。在 Nginx 的配置文件中,可以这样配置:

http {
    upstream backend {
        hash $request_uri;
        server server1.example.com;
        server server2.example.com;
        server server3.example.com;
    }
    server {
        listen 80;
        server_name example.com;
        location / {
            proxy_pass http://backend;
        }
    }
}

在这个例子中,配置了 hash 指令,并以 $request_uri 作为哈希算法,将请求路由到哈希值对应的服务器上。每个请求的路由结果都是固定的,因此能够保证同一个 URL 的请求能够被分配到同一个后端服务器来处理。

四、TCP 负载

Nginx TCP 负载均衡是针对 TCP 层面的请求(如 FTP、SMTP、MySQL 等应用层协议)进行负载均衡的一种技术。与 HTTP 负载均衡类似,Nginx TCP 负载均衡同样是将客户端的请求分发到多个后端服务器上,达到负载均衡的目的。

Nginx TCP 负载均衡可以分为两种类型:

  1. 4 层负载均衡:4 层负载均衡是指在传输层 (Layer 4) 完成负载均衡,此时 Nginx 只负责将单个请求转发到后端服务器,而不会解析请求的内容。

  2. 7 层负载均衡:7 层负载均衡是指在应用层 (Layer 7) 完成负载均衡,此时 Nginx 拥有更高级别的请求解析和处理能力,能够实现更精确的负载均衡,例如根据请求的 URL 进行负载均衡。

下面是一个 Nginx TCP 负载均衡的例子:

stream {    
    upstream backend {    
        server server1.example.com:3306;
        server server2.example.com:3306;
        server server3.example.com:3306;
    }
    server {
        listen 3306;
        proxy_pass backend;
    }
}

在这个例子中,我们指定了一个名为 backend 的 upstream,其中包含了三个后端服务器的地址和端口号。在 server 段中,我们定义了监听的端口号为 3306,将请求路由到了 backend 这个 upstream 中。这样,客户端的请求就会被平均转发到三个后端服务器中,达到负载均衡的目的。

需要注意的是,在 TCP 负载均衡中,Nginx 只能转发 TCP 的请求,而不能转发 UDP 的请求。