文章目录
前言
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):
加权最少连接算法结合了服务器的权重和当前连接数,以更智能的方式分配请求。这种算法在考虑服务器性能差异的同时,也平衡了当前的负载。
每种算法都有其优点和适用场景,选择合适的负载均衡算法可以显著提高系统的性能和稳定性。在实际应用中,除了选择合适的负载均衡算法,还需要综合考虑服务器性能、网络延迟以及请求的特性等因素。