web群集--nginx常见的几种负载均衡调度算法的配置过程和效果展示

文章目录


前言

Nginx 作为一款广泛使用的开源 HTTP 和反向代理服务器,不仅以其高性能和灵活性著称,还因其强大的负载均衡能力受到青睐。负载均衡是 Nginx 的核心功能之一,通过将客户端请求分发到多个后端服务器上,优化资源使用、提升应用性能。本文将深入探讨 Nginx 支持的几种主要调度算法,帮助您更好地理解如何利用这些算法实现高效的负载均衡。

nginx相关博客,感兴趣的可以看看

链接: web群集--rocky9.2源码部署nginx1.24的详细过程

链接: nginx的基本使用示例(负载均衡,虚拟主机,动静分离)的详细配置过程

环境

系统 ip 应用 web页面内容
rocky9.2 192.168.10.11 nginx1.24
rocky9.2 192.168.10.12 httpd web1
rocky 9.2 192.168.10.13 tomcat web2

前置配置

nginx源码安装请看

链接: web群集--rocky9.2源码部署nginx1.24的详细过程

httpd主机

安装httpd

yum -y install httpd
systemctl enable httpd
systemctl start httpd

配置访问页面

使用yum安装的httpd默认页面目录为/var/www/html/

echo "httpd is running" > /var/www/html/index.html

随后能访问到即可

tomcat主机

使用yum安装并启动tomcat

yum -y install tomcat 
systemctl enable tomcat
systemctl start tomcat

使用yum安装的tomcat默认没有web页面,如果想要获取默认的web页面,可以执行以下操作

yum -y install tomcat-webapps tomcat-admin-webapps

这里我们自己创建页面文件即可

mkdir /usr/share/tomcat/webapps/ROOT
echo "tomcat is running" > /usr/share/tomcat/webapps/ROOT/index.html

最后能访问到即可

负载均衡调度算法

1.轮询

轮询是最简单也是最常用的负载均衡算法。其基本原理是将请求依次分发给每一台后端服务器,直到所有服务器都处理完请求后,重新从第一台服务器开始分配。这种方法不考虑服务器的当前负载或健康状态,仅按顺序处理。

优点: 实现简单,易于配置,适用于负载均衡要求较低的环境。

缺点: 不考虑服务器的实际负载,可能导致资源使用不均。

配置过程
\ 复制代码
        upstream web {
        server 192.168.10.12:80;
        server 192.168.10.13:8080;
}

    server {
        listen       80;
        server_name  localhost;
        location / {
                proxy_pass http://web;
        

注: 配置在http块里

我这里是更改了默认server块的配置,如果新加server块,注意不要重叠

重启nginx

systemctl restart nginx
效果展示



2.加权轮询

加权轮询算法在轮询的基础上引入了权重的概念。每台服务器根据其权重值接收请求,权重较高的服务器会处理更多的请求。这种方法适用于服务器性能不均的情况,通过设置不同的权重来实现负载的合理分配。

优点: 允许根据服务器的性能调整请求分配,灵活性较高。

缺点: 需要为每台服务器配置合适的权重,权重设置不准确可能导致负载不均。

配置过程
\ 复制代码
        upstream web {
        server 192.168.10.12:80 weight=2;
        server 192.168.10.13:8080 weight=1;
}

    server {
        listen       80;
        server_name  localhost;
        location / {
                proxy_pass http://web;
        
效果展示

3. IP哈希(IP Hash)

IP哈希算法通过计算客户端 IP 地址的哈希值,将请求分配给特定的服务器。这样,相同 IP 地址的请求将始终被分配到同一台服务器上,确保会话的粘性(session persistence)。

优点: 适用于需要保持用户会话的一致性场景,如需要会话粘性的应用。

缺点: 当服务器发生变化时,可能会导致请求的分布不均。

配置过程
\ 复制代码
        upstream web {
        ip_hash;
        server 192.168.10.12:80;
        server 192.168.10.13:8080;
}

    server {
        listen       80;
        server_name  localhost;
        location / {
                proxy_pass http://web;
        
效果展示

效果不太明显,简单来说就是有会话保持的特点

4. 最少连接(Least Connections)

最少连接算法将请求分配给当前连接数最少的服务器。这种方法动态地调整请求分配,适合负载波动较大的场景。它有助于平衡负载,并最大化服务器资源的利用。

优点: 更动态地处理负载,有助于避免服务器过载。

缺点: 如果服务器性能差异很大,可能会导致负载分配不均。

配置过程
\ 复制代码
        upstream web {
        least_conn;
        server 192.168.10.12:80;
        server 192.168.10.13:8080;
}

    server {
        listen       80;
        server_name  localhost;
        location / {
                proxy_pass http://web;
效果展示

这个效果也不太明显,这里我是两台同时访问的,可以看看这个效果

5.加权最小连接

这个在这里详细说明一下

加权最少连接(Weighted Least Connections)算法是一种结合了服务器权重和当前连接数的负载均衡策略。它通过考虑服务器的性能权重来决定请求的分配,旨在优化资源使用和提高系统性能。具体而言,这种算法优先将请求分配给连接数较少且权重较高的服务器,从而实现更智能和均衡的负载分配。

需要注意的是,Nginx 本身不直接支持加权最少连接算法,但可以通过结合权重和最小连接数的配置来实现类似的效果。

加权最少连接的工作原理

加权最少连接算法的工作原理可以概括为以下步骤:

计算加权连接数:对于每台服务器,计算其当前连接数和权重的比值。公式为:
加权连接数 = 当前连接数 / 权重

选择最小值:将请求分配给加权连接数最小的服务器。即,选择具有最少加权连接数的服务器来处理请求。

让我们来举个例子
假设有三个服务器,它们的当前连接数和权重分别如下:

服务器 A: 当前连接数 = 10, 权重 = 5

服务器 B: 当前连接数 = 20, 权重 = 10

服务器 C: 当前连接数 = 15, 权重 = 2

我们可以计算它们的加权连接数:

服务器 A: 加权连接数 = 10 / 5 = 2

服务器 B: 加权连接数 = 20 / 10 = 2

服务器 C: 加权连接数 = 15 / 2 = 7.5

根据这些加权连接数,负载均衡系统会选择加权连接数最小的服务器来处理新的请求。在这个例子中,服务器 A 和服务器 B 的加权连接数相同,但服务器 A 的连接数较少,因此它可能会被优先选择。

配置过程
\ 复制代码
        upstream web {
        least_conn;
        server 192.168.10.12:80 weight=2;
        server 192.168.10.13:8080 weight=1;
}

    server {
        listen       80;
        server_name  localhost;
        location / {
                proxy_pass http://web;
效果展示

这个效果也不太明显,这里我是三台同时访问的,可以看看这个效果


总结

总结

在本文中,讲述了Nginx 常见的几种负载均衡调度算法,包括:

轮询(Round Robin):

轮询是一种简单且常见的负载均衡算法,它会依次将请求分配给每台服务器。适用于负载相对均衡的场景,但对于连接数或处理能力不均衡的服务器,可能会导致负载不均衡。

加权轮询(Weighted Round Robin):

加权轮询算法通过为每台服务器分配权重来进行负载均衡。服务器的权重决定了其接收请求的比例,适用于服务器性能差异较大的场景,但不考虑服务器当前的负载。

IP Hash:

根据客户端的 IP 地址将请求固定分配到特定的服务器。适用于需要会话保持的场景,例如用户需要始终与同一台服务器交互的应用场景。它可以提供更一致的用户体验,但可能导致负载不均衡。

最少连接(Least Connections):

最少连接算法将请求分配给当前连接数最少的服务器。这种算法适用于连接数变化较大的场景,可以有效地防止单台服务器过载,但可能不考虑服务器性能差异。

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

加权最少连接算法结合了服务器的权重和当前连接数,以更智能的方式分配请求。这种算法在考虑服务器性能差异的同时,也平衡了当前的负载。

每种算法都有其优点和适用场景,选择合适的负载均衡算法可以显著提高系统的性能和稳定性。在实际应用中,除了选择合适的负载均衡算法,还需要综合考虑服务器性能、网络延迟以及请求的特性等因素。

相关推荐
_feivirus_26 分钟前
神经网络_使用TensorFlow预测气温
人工智能·神经网络·算法·tensorflow·预测气温
大柏怎么被偷了36 分钟前
【C++算法】位运算
开发语言·c++·算法
程序猿方梓燚38 分钟前
C/C++实现植物大战僵尸(PVZ)(打地鼠版)
c语言·开发语言·c++·算法·游戏
CPP_ZhouXuyang38 分钟前
C语言——模拟实现strcpy
c语言·开发语言·数据结构·算法·程序员创富
闻缺陷则喜何志丹38 分钟前
【C++前后缀分解 动态规划】2100. 适合野炊的日子|1702
c++·算法·动态规划·力扣·前后缀分解·日子·适合
逝去的秋风1 小时前
【代码随想录训练营第42期 Day57打卡 - 图论Part7 - Prim算法与Kruskal算法
算法·图论·prim算法
QXH2000001 小时前
数据结构—双向链表
c语言·数据结构·算法·链表
大鹅同志1 小时前
在服务器上开Juypter Lab教程(远程访问)
运维·服务器·pytorch·jupyter·cuda·云服务器
旺小仔.1 小时前
【数据结构篇】~排序(1)之插入排序
c语言·数据结构·算法·链表·性能优化·排序算法
文牧之1 小时前
PostgreSQL的walsender和walreceiver进程介绍
运维·数据库·postgresql