当前位置: 首页 > article >正文

Web 架构之负载均衡全解析

文章目录

    • 一、引言
    • 二、思维导图
    • 三、负载均衡的定义与作用
      • 定义
      • 作用
        • 1. 提高可用性
        • 2. 增强性能
        • 3. 实现扩展性
    • 四、负载均衡类型
      • 硬件负载均衡
        • 代表设备
        • 优缺点
      • 软件负载均衡
        • 应用层负载均衡
          • 代表软件
          • 优缺点
        • 网络层负载均衡
          • 代表软件
          • 优缺点
    • 五、负载均衡算法
      • 轮询算法(Round Robin)
      • 加权轮询算法(Weighted Round Robin)
      • 最少连接算法(Least Connections)
      • 加权最少连接算法(Weighted Least Connections)
      • IP 哈希算法(IP Hash)
    • 六、常见问题及解决方法
      • 会话保持问题
        • 问题描述
        • 解决方法
      • 健康检查问题
        • 问题描述
        • 解决方法
    • 七、实践案例:基于 Nginx 的负载均衡配置
      • 安装 Nginx
      • 配置负载均衡
      • 测试与验证
    • 八、总结

一、引言

在当今的互联网世界中,随着用户数量的不断增长和业务流量的急剧增加,单一的服务器往往难以承受巨大的访问压力。为了确保系统的高可用性、高性能和可扩展性,负载均衡技术应运而生。负载均衡就像是一个智能的交通指挥员,将用户的请求均匀地分配到多个服务器上,避免了某一台服务器因过载而崩溃,从而提升整个系统的处理能力。

二、思维导图

Web架构之负载均衡
定义与作用
定义
作用
提高可用性
增强性能
实现扩展性
负载均衡类型
硬件负载均衡
代表设备
优缺点
软件负载均衡
应用层负载均衡
代表软件
优缺点
网络层负载均衡
代表软件
优缺点
负载均衡算法
轮询算法
加权轮询算法
最少连接算法
加权最少连接算法
IP 哈希算法
常见问题及解决方法
会话保持问题
问题描述
解决方法
健康检查问题
问题描述
解决方法
实践案例
基于 Nginx 的负载均衡配置
安装 Nginx
配置负载均衡
测试与验证

三、负载均衡的定义与作用

定义

负载均衡(Load Balancing)是一种将工作负载分布到多个计算资源上的技术,这些计算资源可以是服务器、虚拟机、容器等。通过负载均衡器(Load Balancer),将客户端的请求按照一定的算法和规则分配到后端的多个服务器上,以达到优化资源利用、提高系统性能和可靠性的目的。

作用

1. 提高可用性

当某一台服务器出现故障时,负载均衡器可以自动将请求转发到其他正常运行的服务器上,从而保证系统的不间断服务。例如,在一个电商网站中,如果某一台商品详情页服务器出现故障,负载均衡器会将用户的请求分配到其他可用的服务器上,用户仍然可以正常浏览商品信息。

2. 增强性能

负载均衡器可以将请求均匀地分配到多个服务器上,避免了某一台服务器因过载而导致响应缓慢。同时,多个服务器可以并行处理请求,大大提高了系统的整体处理能力。例如,在一个高并发的在线游戏中,负载均衡器可以将玩家的登录请求分配到多个登录服务器上,减少玩家的等待时间。

3. 实现扩展性

随着业务的发展和用户数量的增加,可以通过添加新的服务器来扩展系统的处理能力。负载均衡器可以自动识别新加入的服务器,并将请求分配到这些服务器上,实现系统的无缝扩展。例如,一个社交媒体平台在举办大型活动时,可以临时增加服务器来应对高流量。

四、负载均衡类型

硬件负载均衡

代表设备

常见的硬件负载均衡设备有 F5 Big-IP、Cisco ACE 等。这些设备通常是专门设计的硬件设备,具有高性能、高可靠性和强大的功能。

优缺点
  • 优点:性能高,能够处理大量的并发请求;稳定性好,经过严格的测试和优化,适合对可靠性要求较高的企业级应用;功能丰富,支持多种负载均衡算法和高级特性,如 SSL 卸载、应用层防火墙等。
  • 缺点:价格昂贵,购买和维护成本较高;扩展性相对较差,增加新的功能和性能提升需要更换硬件设备;部署和配置复杂,需要专业的技术人员进行操作。

软件负载均衡

应用层负载均衡
代表软件

Nginx、HAProxy 等是常见的应用层负载均衡软件。它们工作在 OSI 模型的第七层(应用层),可以根据应用层协议(如 HTTP、HTTPS)的内容进行请求分发。

优缺点
  • 优点:成本低,开源软件可以免费使用,降低了企业的采购成本;灵活性高,可以根据业务需求进行定制化配置;易于部署和维护,不需要额外的硬件设备。
  • 缺点:性能相对硬件负载均衡较低,处理大量并发请求时可能会成为瓶颈;对服务器资源有一定的消耗,需要占用一定的 CPU 和内存资源。
网络层负载均衡
代表软件

LVS(Linux Virtual Server)是一种典型的网络层负载均衡软件。它工作在 OSI 模型的第四层(传输层),根据 IP 地址和端口号进行请求分发。

优缺点
  • 优点:性能高,基于内核级的转发,处理速度快,能够处理大量的并发请求;对服务器资源消耗小,只负责请求的转发,不处理应用层的内容。
  • 缺点:功能相对单一,主要用于 IP 层的负载均衡,缺乏应用层的高级特性;配置和管理相对复杂,需要对网络和 Linux 系统有较深入的了解。

五、负载均衡算法

轮询算法(Round Robin)

轮询算法是最简单的负载均衡算法之一。它按照顺序依次将请求分配到后端的服务器上,当所有服务器都分配过一次后,再从头开始分配。例如,有三台服务器 A、B、C,请求 1 分配到服务器 A,请求 2 分配到服务器 B,请求 3 分配到服务器 C,请求 4 又分配到服务器 A,以此类推。

# 简单的轮询算法示例
servers = ['server1', 'server2', 'server3']
index = 0def round_robin():global indexserver = servers[index]index = (index + 1) % len(servers)return server# 模拟请求
for i in range(5):print(f"Request {i+1} is sent to {round_robin()}")

加权轮询算法(Weighted Round Robin)

加权轮询算法是在轮询算法的基础上,为每台服务器分配一个权重值。权重值越高,服务器被分配到请求的概率就越大。例如,服务器 A 的权重为 2,服务器 B 的权重为 1,服务器 C 的权重为 1,那么在分配请求时,服务器 A 会被分配到更多的请求。

# 简单的加权轮询算法示例
servers = [('server1', 2), ('server2', 1), ('server3', 1)]
current_index = 0
current_weight = 0
gcd = 1  # 最大公约数,这里简化处理
max_weight = max([weight for _, weight in servers])def weighted_round_robin():global current_index, current_weightwhile True:current_index = (current_index + 1) % len(servers)if current_index == 0:current_weight = current_weight - gcdif current_weight <= 0:current_weight = max_weightif current_weight == 0:return Noneserver, weight = servers[current_index]if weight >= current_weight:return server# 模拟请求
for i in range(5):print(f"Request {i+1} is sent to {weighted_round_robin()}")

最少连接算法(Least Connections)

最少连接算法会将请求分配到当前连接数最少的服务器上。这种算法可以保证服务器的负载相对均衡,避免某些服务器因为连接数过多而导致性能下降。例如,服务器 A 有 10 个连接,服务器 B 有 5 个连接,服务器 C 有 8 个连接,那么新的请求会被分配到服务器 B 上。

加权最少连接算法(Weighted Least Connections)

加权最少连接算法是在最少连接算法的基础上,为每台服务器分配一个权重值。在选择服务器时,会综合考虑服务器的连接数和权重值,选择连接数与权重值比值最小的服务器。例如,服务器 A 的权重为 2,连接数为 10;服务器 B 的权重为 1,连接数为 5;服务器 C 的权重为 1,连接数为 8。计算比值:服务器 A 为 10/2 = 5,服务器 B 为 5/1 = 5,服务器 C 为 8/1 = 8,那么新的请求会在服务器 A 和服务器 B 中随机选择。

IP 哈希算法(IP Hash)

IP 哈希算法根据客户端的 IP 地址进行哈希计算,将计算结果映射到后端的服务器上。这样,同一个客户端的请求会始终被分配到同一台服务器上,适合需要保持会话状态的应用。例如,在一个电商网站中,用户登录后,后续的请求会一直分配到同一台服务器上,保证用户的购物车信息和登录状态不会丢失。

# 简单的 IP 哈希算法示例
servers = ['server1', 'server2', 'server3']def ip_hash(ip):hash_value = hash(ip)index = hash_value % len(servers)return servers[index]# 模拟请求
client_ips = ['192.168.1.1', '192.168.1.2', '192.168.1.1']
for ip in client_ips:print(f"Request from {ip} is sent to {ip_hash(ip)}")

六、常见问题及解决方法

会话保持问题

问题描述

在一些应用中,用户的请求需要保持会话状态,例如用户登录后,后续的请求需要在同一台服务器上处理,以保证用户的登录信息和购物车信息不会丢失。但是,负载均衡器默认的分配算法可能会将用户的请求分配到不同的服务器上,导致会话丢失。

解决方法
  • IP 哈希算法:如前面所述,通过客户端的 IP 地址进行哈希计算,将同一客户端的请求始终分配到同一台服务器上。
  • 会话粘滞(Session Affinity):负载均衡器记录用户的会话信息,当用户发起新的请求时,将请求定向到之前处理该用户会话的服务器上。例如,Nginx 可以通过 ip_hashsticky 模块实现会话粘滞。
  • 分布式会话管理:使用分布式缓存(如 Redis)来存储用户的会话信息,无论请求被分配到哪台服务器上,服务器都可以从分布式缓存中获取用户的会话信息。

健康检查问题

问题描述

负载均衡器需要实时监测后端服务器的健康状态,当某一台服务器出现故障时,能够及时将其从负载均衡池中移除,避免将请求分配到故障服务器上。但是,如果健康检查机制不完善,可能会出现误判或漏判的情况。

解决方法
  • 定期心跳检测:负载均衡器定期向后端服务器发送心跳包,根据服务器的响应情况判断其健康状态。例如,Nginx 可以通过 health_check 模块实现定期心跳检测。
  • 多维度健康检查:除了基本的网络连通性检查外,还可以进行应用层的健康检查,如检查服务器的 HTTP 响应状态码、数据库连接状态等。
  • 动态调整健康检查参数:根据服务器的实际运行情况,动态调整健康检查的频率和阈值,避免误判和漏判。

七、实践案例:基于 Nginx 的负载均衡配置

安装 Nginx

以 Ubuntu 系统为例,使用以下命令安装 Nginx:

sudo apt update
sudo apt install nginx

配置负载均衡

编辑 Nginx 的配置文件 /etc/nginx/nginx.conf 或在 /etc/nginx/conf.d 目录下创建一个新的配置文件,例如 load_balancer.conf

# 定义后端服务器组
upstream backend_servers {# 轮询算法server 192.168.1.100:80;server 192.168.1.101:80;# 加权轮询算法示例# server 192.168.1.100:80 weight=2;# server 192.168.1.101:80 weight=1;
}server {listen 80;server_name example.com;location / {# 将请求转发到后端服务器组proxy_pass http://backend_servers;# 会话保持配置# ip_hash;}
}

保存配置文件后,重启 Nginx 服务:

sudo systemctl restart nginx

测试与验证

使用浏览器或工具(如 curl)访问 example.com,观察请求是否被正确分配到后端服务器上。可以在后端服务器上查看访问日志,确认请求的来源和处理情况。

八、总结

负载均衡是 Web 架构中不可或缺的一部分,它可以提高系统的可用性、性能和扩展性。通过了解不同类型的负载均衡、负载均衡算法以及常见问题的解决方法,我们可以根据实际业务需求选择合适的负载均衡方案。在实践中,我们可以使用 Nginx 等软件负载均衡器来实现简单而高效的负载均衡配置。随着技术的不断发展,负载均衡技术也在不断创新和完善,未来将为 Web 应用的发展提供更强大的支持。

希望这篇博客能够帮助你更好地理解 Web 架构中的负载均衡技术,如果你有任何问题或建议,欢迎在评论区留言。

相关文章:

Web 架构之负载均衡全解析

文章目录 一、引言二、思维导图三、负载均衡的定义与作用定义作用1. 提高可用性2. 增强性能3. 实现扩展性 四、负载均衡类型硬件负载均衡代表设备优缺点 软件负载均衡应用层负载均衡代表软件优缺点 网络层负载均衡代表软件优缺点 五、负载均衡算法轮询算法&#xff08;Round Ro…...

Linux系统管理与编程16:PXE自动化安装部署centos7.9操作系统

兰生幽谷&#xff0c;不为莫服而不芳&#xff1b; 君子行义&#xff0c;不为莫知而止休。 0.准备 1&#xff09;防火墙和SELinux systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i s/^SELINUX.*/SELINUXdisabled/ /etc/selinux/config (很不好的…...

金丝雀/灰度/蓝绿发布的详解

以下是 金丝雀发布、灰度发布 和 蓝绿发布 的详细解析&#xff0c;涵盖核心原理、技术实现、适用场景及实际案例&#xff1a; 1. 金丝雀发布 (Canary Release) 核心原理 渐进式流量切换&#xff1a;将新版本部署到生产环境后&#xff0c;逐步将用户流量从旧版本迁移到新版本&…...

如何通过ABAP获取SAP生产订单的目标成本

SAP存储生产订单成本的主要底表包括&#xff1a; COBK: CO凭证表头COEP: CO凭证行项目COSS: 来自CO内部的汇总数据COSP: 来自CO外部部的汇总数据 先说结论&#xff1a;SAP 对生产订单的目标成本是没有保存到底表的。那么如何通过代码的方式获取呢&#xff1f; K_KKB_KKBCS_O…...

git 多个提交记录合并为一个

1.场景 有时候用devops等平台测试问题&#xff0c;需要多次修改小的记录提交&#xff0c;但是最终我们在合并主干的时候不想留那么多乱七八糟的记录&#xff0c;就需要在此分支合并这些提交记录&#xff0c;再合并到主干。 2.交互式变基 2.1 确定要合并的提交范围 # 查看最近…...

深入理解栈数据结构(Java实现):从原理到实战应用

在计算机科学的世界里&#xff0c;数据结构是构建高效程序的基石&#xff0c;而栈作为其中最基础且应用广泛的一种数据结构&#xff0c;其独特的 “后进先出&#xff08;LIFO&#xff09;” 特性&#xff0c;使其在众多领域发挥着关键作用。从算法设计到编译器实现&#xff0c;…...

支付宝 SEO 优化:提升小程序曝光与流量的完整指南

在拥有庞大用户基数的支付宝平台上&#xff0c;小程序已成为商家触达用户、提供服务的重要渠道。然而&#xff0c;随着平台上小程序数量的快速增长&#xff0c;如何在激烈的竞争中脱颖而出&#xff0c;获得更多的曝光和流量&#xff0c;成为每个开发者和运营者必须面对的关键挑…...

【leetcode100】最长重复子数组

1、题目描述 给两个整数数组 nums1 和 nums2 &#xff0c;返回 两个数组中 公共的 、长度最长的子数组的长度 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,3,2,1], nums2 [3,2,1,4,7] 输出&#xff1a;3 解释&#xff1a;长度最长的公共子数组是 [3,2,1] 。示例 2&…...

代码随想录算法训练营第五十六天| 图论2—卡码网99. 岛屿数量(dfs bfs)

假期归来继续刷题&#xff0c;图论第二天&#xff0c;主要是进一步熟悉dfs 和 bfs 的运用。 99. 岛屿数量&#xff08;dfs&#xff09; 99. 岛屿数量 ACM模式还是需要练&#xff0c;不过现在输入输出的感觉已经比较熟悉了。首先是要按照输入搭建一个grid&#xff0c;然后有一…...

源码示例:使用SpringBoot+Vue+ElementUI+UniAPP技术组合开发一套小微企业ERP系统

目录 一、系统架构设计 1、技术分层 2、开发环境 二、快速开发实践 1、后端搭建&#xff08;Spring Boot&#xff09; 2、前端管理端&#xff08;VueElementUI&#xff09; 3、移动端开发&#xff08;UniAPP&#xff09; 三、关键集成方案 1、统一接口处理 2、跨平台…...

基于Django框架的股票分红数据爬虫和展示系统

项目截图 一、项目简介 本项目是一个基于 Django 框架的股票分红数据爬虫和展示系统。它可以从东方财富网站爬取股票分红数据&#xff0c;并将数据存储到 Django 数据库中&#xff0c;同时提供数据查询、导出和图表展示功能。该系统为用户提供了一个方便的平台&#xff0c;用于…...

QT高级(1)QTableView自定义委托集合,一个类实现若干委托

自定义委托集合 1同系列文章2 功能3 源码 1同系列文章 QT中级&#xff08;1&#xff09;QTableView自定义委托&#xff08;一&#xff09;实现QSpinBox、QDoubleSpinBox委托 QT中级&#xff08;2&#xff09;QTableView自定义委托&#xff08;二&#xff09;实现QProgressBar委…...

kubectl系列(十一):top 查询pod连接数

在 Kubernetes 中&#xff0c;kubectl top 命令默认仅支持查看 Pod 或节点的 CPU/内存资源使用情况&#xff0c;并不直接提供 TCP 连接数的统计功能。若要获取 Pod 的 TCP 连接数&#xff0c;需结合其他工具和方法。以下是具体实现方案&#xff1a; 1. 直接进入容器查看 TCP 连…...

关于Spring

目录 事务篇 事务篇 先说结论 Spring事务实际上依赖的是Transactional接口和数据库的事务实现。 举个例子说&#xff0c;比如我们现在有一个**Service1类&#xff0c;这个类的方法MethodA执行一个向表A中插入数据&#xff1b;还有一个**Service2类&#xff0c;这个类的方法M…...

小家电专用WD5201 非隔离AC-DC稳压器|宽压80-305V|三档输出2.7/3.3/5V|多重安全保护

小家电专用WD5201 AC-DC稳压器&#xff5c;宽压80-305V&#xff5c;三档输出2.7/3.3/5V&#xff5c;多重安全保护 &#x1f4a5; WD5201&#xff0c;小家电电源的智能“稳压卫士”&#xff01; ✨ 核心卖点&#xff1a; ✅ 宽压兼容&#xff1a;输入 80-305V AC&#xff0c;电网…...

Docker 核心目录结构

1. Docker 核心目录结构 数据存储目录 默认根目录&#xff1a;/var/lib/docker Docker 所有运行时数据&#xff08;镜像、容器、卷、网络配置等&#xff09;的默认存储位置。 bash 复制 下载 # 查看 Docker 数据根目录 docker info | grep "Docker Root Dir" # 输出…...

源码分析之Leaflet中的LayerGroup

概述 LayerGroup是一个图层组&#xff0c;通过继承Layer基类&#xff0c;提供了一种管理多个图层&#xff08;如标记、多边形等&#xff09;的容器机制&#xff0c;比如地图的添加/移除操作等。 源码分析 源码实现 LayerGroup的源码实现如下&#xff1a; export var Layer…...

小芯片大战略:Chiplet技术如何重构全球半导体竞争格局?

在科技飞速发展的今天&#xff0c;半导体行业作为信息技术的核心领域之一&#xff0c;其发展速度和创新水平对全球经济的发展具有举足轻重的影响。然而&#xff0c;随着芯片制造工艺的不断进步&#xff0c;传统的单片集成方式逐渐遇到了技术瓶颈&#xff0c;如摩尔定律逐渐逼近…...

普通IT的股票交易成长史--股价起伏的真相-缺口(2)

声明&#xff1a;本文章的内容只是自己学习的总结&#xff0c;不构成投资建议。价格行为理论学习可参考简介中的几位&#xff0c;感谢他们的无私奉献。 送给自己的话&#xff1a; 仓位就是生命&#xff0c;绝对不能满仓&#xff01;&#xff01;&#xff01;&#xff01;&…...

MindSpore框架学习项目-ResNet药物分类-模型优化

目录 5.模型优化 5.1模型优化 6.结语 参考内容&#xff1a; 昇思MindSpore | 全场景AI框架 | 昇思MindSpore社区官网 华为自研的国产AI框架&#xff0c;训推一体&#xff0c;支持动态图、静态图&#xff0c;全场景适用&#xff0c;有着不错的生态 本项目可以在华为云modelar…...

基于阿里云DataWorks的物流履约时效离线分析

基于阿里云DataWorks的物流履约时效离线分析2. 数仓模型构建 ORC和Parquet区别&#xff1a; 压缩率与查询性能 压缩率 ORC通常压缩率更高&#xff0c;文件体积更小&#xff0c;适合存储成本敏感的场景。 Parquet因支持更灵活的嵌套结构&#xff0c;压缩率略…...

Kubernetes(k8s)学习笔记(八)--KubeSphere定制化安装

1执行下面的命令修改上一篇中yaml文件来实现定制化安装devops kubectl edit cm -n kubesphere-system ks-installer 主要是将devops几个配置由False改为True 然后使用下面的命令查看安装日志 kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l …...

养生:为健康生活筑牢根基

养生并非遥不可及的目标&#xff0c;而是贯穿于日常生活的点滴之中。从饮食、运动到心态调节&#xff0c;每一个环节都对我们的健康有着重要意义。以下为你详细介绍养生的实用策略&#xff0c;助力你开启健康生活模式。 饮食养生&#xff1a;科学搭配&#xff0c;滋养生命 合…...

Linux510 ssh服务 ssh连接

arning: Permanently added ‘11.1.1.100’ (ECDSA) to the list of known hosts. rooot11.1.1.100’s password: Permission denied, please try again. rooot11.1.1.100’s password: Permission denied, please try again 还没生效 登不上了 失效了 sshcaozx26成功登录 …...

关键点检测--使用YOLOv8对Leeds Sports Pose(LSP)关键点检测

目录 1. Leeds Sports Pose数据集下载2. 数据集处理2.1 获取标签2.2 将图像文件和标签文件处理成YOLO能使用的格式 3. 用YOLOv8进行训练3.1 训练3.2 预测 1. Leeds Sports Pose数据集下载 从kaggle官网下载这个数据集&#xff0c;地址为link&#xff0c;下载好的数据集文件如下…...

Elasticsearch内存管理与JVM优化:原理剖析与最佳实践

#作者&#xff1a;孙德新 文章目录 一、Elasticsearch缓存分类1、Node Query Cache&#xff1a;2、Shard Request Cache&#xff1a;3、Fielddata Cache&#xff1a; 三、内存常见的问题案例一案例二案例三案例四 四、内参分配最佳实践1、jvm heap分配2、将机器上少于一半的内…...

独立按键控制LED

目录 1.独立按键介绍 2.原理图 3.C51数据运输 解释&#xff1a;<< >> ​编辑 解释&#xff1a;& | 解释&#xff1a;^ ~ ​编辑 4.C51基本语句 5.按键的跳动 6.独立按键控制LED亮灭代码 第一步&#xff1a; 第二步&#xff1a; 第三步&#xff1…...

计算机科技笔记: 容错计算机设计03 系统可信性的度量 偶发故障期 浴盆曲线 韦布尔分布

可靠性 简化表达式 偶发故障期&#xff0c;系统发生故障概率趋近于一个常数 浴盆曲线 MTTF和计算 韦布尔分布 马尔可夫链 可靠度...

爬虫准备前工作

1.Pycham的下载 网址&#xff1a;PyCharm: The only Python IDE you need 2.Python的下载 网址&#xff1a;python.org&#xff08;python3.9版本之后都可以&#xff09; 3.node.js的下载 网址&#xff1a;Node.js — 在任何地方运行 JavaScript&#xff08;版本使用18就可…...

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】7.1 主流可视化工具对比(Tableau/Matplotlib/Python库)

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 第七章 可视化工具集成&#xff1a;Tableau、Matplotlib与Python库深度对比7.1 主流可视化工具对比&#xff1a;技术选型的决策框架7.1.1 工具定位与核心能力矩阵7.1.2 数据…...