聊聊系统架构之负载均衡优化实践
一、写在前面
最近在进行线上监控检查时,我遇到了两个超出预期的案例。首先,网关层的监控数据与应用实际监控数据存在不一致性,尤其是max有较大的差异,详见如下图。其次在某个应用中,通过httpclient请求某域名时发现只有一台机器持续出现"Read timed out"的异常错误。
鉴于这种情况,我分析了客户端请求到应用集群之间的完整链路。用户发起域名请求时,客户端通过本地DNS(没有解析记录粥查询,如权威DNS)发起查询请求获取域名关联的VIP,接着发起到负载均衡LB的请求,LB接收到请求后,根据配置的LB策略(如轮询、最小连接、IP源hash等)决定将请求转发给后端的服务实例。后端服务器接收到请求后,应用服务器处理请求并生成响应数据,然后再逆向传递。
二、负载均衡
首先聊聊什么是负载均衡。负载均衡(LB,Load Balance)是一种技术解决方案,用来在多个资源(一般是服务器)中分配负载达到最优资源使用,避免过载。最常见的LB是四层TCP负载和7层HTTP负载。四层负载均衡是基于IP+Port实现,通过网络层的IP地址(VIP),然后加上运输层的端口号来决定哪些流量需要做负载均衡,主要工作是转发,在接收到客户端的流量以后通过修改数据包的地址信息将流量转发到应用服务吕。七层负载均衡器除了支持四层负载均衡以外,还要分析应用层的信息,如HTTP协议URI或Cookie信息,可以理解应用协议,七层负载均衡会与客户端建立一条完整的连接并将应用层的请求流量解析出来,再按照调度算法选择一个应用服务器,并与应用服务器建立另外一条连接将请求发送过去,因此它主要工作是代理 。
•四层负载均衡:在传输层(即网络层)对网络流量进行负载均衡的一种手段
以常见的TCP为例,负载均衡设备在接收到第一个来自客户端的SYN请求时,通过报文中的IP+Port根据预设的负载均衡算法(如轮询、加权轮询、最小连接等)选择一个最佳的服务器,当然在转发时会修改报文中目标IP地址直接转发给后端服务器。TCP的建连,是客户端与服务器直接建立的,LB只是起到一个类似路由器转发动作。
4层负载均衡主要通过检查传输层的相关信息来源请求流量的转发,性能较高,适应于TCP/UDP等传输协议。然而,由于不了解应用层信息,因此无法做到智能化的请求分发,只能基于基本信息进行转发决策。
•七层负载均衡:在应用层对网络流量进行负载均衡的一种方案
七层负载均衡,也称为内容交换,主要通过报文中真正有意义的应用层内容,加上负载均衡设备设置的服务器选择方式,决定最终选择的内容服务器。以常见的TCP为例,LB设备如果要根据应用层内容选择服务器,只能先代理最终的服务器和客户端建立连接后才可能接受到客户端发送的真正报文内容,然后再根据报文中的特写字段+LB设备设置的服务器选择方式(如轮询、加权轮询、最小连接等),决定最终 选择的内部服务器。由此可见,LB和客户端以及服务器会分别独立建立TCP连接,与四层模式的LB相比 处理能力必然要低一些。
从技术原理上看,它可以对客户端的请求和服务器的响应进行任何意义上的修改,极大提高了应用系统在网络层的灵活性,另一方面就是安全性,特别是常见的SYN Flood攻击,SYN攻击可以在LB设备上截止,不会影响后台服务器的正常运营;另外LB设备可以在七层层面设定多种策略,过滤特写报文,例如SQL注入等应用层面的特写攻击手段,从应用层面进一步提高系统整体安全。由于深入到应用层,对请求处理更加精细,但相应地也会增加负载均衡的处理开销。
下图是经典四层和七层架构和解析包的关系。
三、LB模式
LB模式含义有:
•fullnat 代表dpdk+keepalive实现的4层tcp集群,负载均衡软件为lvs
•nginx代表nginx实现的,可同时提供4层tcp和7层http服务,负载均衡软件为jfe(基于nginx二次开发)
•ha代表haproxy实现的,可同时提供4层tcp和7层http服务,负载均衡软件为haproxy.
这里强调一下实例冷备时,不同LB模式的影响。如果VIP的LB模式是fullnat,冷备时当前已有的链接会立刻被断开;其他模式如nginx、ha将不会转发新的请求到冷备设备,但已建立的链接不影响,直至链接正常断开为止。因此需要强调的,茵LB模式为fullnat,在冷备应用实例后立即部署对业务会有短暂的影响,相反在fullnat模式下影响几乎可以忽略不计。
四层负载均衡(DR/FULLNAT):基于DPDK的DLVS,DPDK全称Data Plane Development Kit,是Intel提供的数据平面开发工具集,专注于网络应用中数据包的高性能处理,其提供基于TCP的应用程序代理。
七层负载均衡(HA): 基于HAProxy 二次开发,支持配置热加载生效、单机QPS可达5w,其提供基于TCP和HTTP的应用程序代理。
七层负载均衡(Nginx):基于Nginx 二次开发,支持单元化、物理网关隔离、实例变更热加载等功能,单机QPS可达3w,其提供基于TCP和HTTP的应用程序代理。
对比项 | 四层负载均衡(FULLNAT) | 七层负载均衡(HA) | 七层负载均衡(Nginx) |
产品定位 | ·强大的四层处理能力 ·聚焦TCP协议 ·面向网络层交付 | ·强大的七层处理能力 ·聚焦HTTP应用层协议 ·面向应用层交付 | ·强大的七层处理能力 ·聚焦HTTP、HTTPS应用层协议 ·面向应用层交付 |
业务场景 | ·低延迟(10ms)、高并发(1Wqps)、高带宽(1Gbps)各类型业务 | ·基于HTTP协议接口类业务(不适合需要HTTPS的WEB网页类业务) | ·基于HTTP协议的WEB网页类业务、尤其需要支持HTTPS访问的业务 |
四、解决方案与调优实践
在之前的讨论中,我已经探讨了负载均衡的核心概念、四层与七层LB的差异,以及LB模式。基于这些讨论,本节重点关注如何通过具体的解决方案和调优实践来应对线上监控检查中遇到的问题,包括风关层与应用层监控数据不一致以及"Read timed out"异常。
•场景一:网关层的监控数据与应用实际监控数据存在不一致性
前面已经详细分析了四层LB与七层LB的差异。对于不同的协议,在性能上TCP比HTTP快,毕竟7层监听经过LVS后,还需要更长的链路,但不会达到max1kms的影响。那影响性能的另一个因素就是:运营商到集群的跨机房调用。跨机房调用会导致网络延迟和稳定性,由于物理距离的增加,数据在传输过程中经过路由器和交换机数量增多,网络RTT会显著增加。上图中的经色箭头就是调整同机房调用后的时刻,可以看到max性能显著提升。
•场景二:单台机器HTTP请求域名时Read Timed Out异常
在线上应用环境中,通过HttpClient请求某个域名时,发现只有一台机器持续出现“Read Timed Out”的异常错误。这种情况首先让人疑惑的是,为什么只有一台机器会遇到这个问题,而其他机器却能正常工作?
经过详细的排查和分析,我发现了几个关键因素导致了这个问题的出现:
1) 、网络问题:首先,出现timeout的原因是因为请求的域名下的某台机器网络存在问题。
2)、长连接机制:HttpClient默认使用长连接(Keep-Alive)的方式进行通信。这种方式在大多数情况下可以提高性能,因为它减少了频繁建立和断开连接的开销。然而,当目标服务器存在网络问题时,这种长连接机制可能会导致持续的超时问题。
3)、源地址Hash策略:根本原因在于集群负载均衡算法采用了源地址Hash策略。这种策略根据请求的源地址来分配请求到后端服务器,旨在保持客户端与特定服务器的会话连续性。因此,如果某台后端机器遇到了网络问题,那么所有被路由到这台机器的请求都会受到影响。(业务ip的数量小于或接近域名对应的ip数量)
当然解决方案很简单。一方面设置合理的超时时间,调整负载均衡策略如轮询最小连接等。
五、写在最后
线上监控当发现问题解决问题后,追根溯源也是非常重要的。不能忽视线上的任何问题,无论它们是多少微小。每一个异常都有可能是更深层次问题的征兆。通过建立一套完善的监控体系,实时捕捉异常数据,结合深入的技术分析和理解,就能够及时定位问题并采取相应措施。这不仅仅是为了解决眼前的问题,更是为了系统的长期健康和可持续发展。追踪溯源的过程,虽然可能耗时费力,但它是确保我们服务可靠、稳定和高效的基石。
相关文章:

聊聊系统架构之负载均衡优化实践
一、写在前面 最近在进行线上监控检查时,我遇到了两个超出预期的案例。首先,网关层的监控数据与应用实际监控数据存在不一致性,尤其是max有较大的差异,详见如下图。其次在某个应用中,通过httpclient请求某域名时发现只…...
代码规范性思考
表命名和设计 业务模块前缀;下划线分隔,体现业务含义;数据库字符集、字段名、类型、长度、默认值;一对一、一对多、多对多建表;注释清晰;良好的索引; 接口文档 swagger增强工具swagger-boots…...

TestProject Python SDK入门
2024软件测试面试刷题,这个小程序(永久刷题),靠它快速找到工作了!(刷题APP的天花板)-CSDN博客跳槽涨薪的朋友们有福了,今天给大家推荐一个软件测试面试的刷题小程序。编辑https://…...

服务器数据恢复—EMC Isilon存储中被误删的虚拟机数据恢复案例
服务器存储数据恢复环境: EMC Isilon S200集群存储,共三个节点,每节点配置12块SATA硬盘。 服务器存储故障: 工作人员误操作删除虚拟机,虚拟机中数据包括数据库、MP4、AS、TS类型的视频文件等。需要恢复数据的虚拟机通…...
华为安全Security认证,你了解多少?
华为安全Security 认证包含HCIA-Security, HCIP-Security,HCIE-Security。HCIA-Security 掌握中小型网络信息安全基础知识与相关技术(华为防火墙技术、加解密技术、PKI 证书体系等),具备搭建小型企业信息安全网络的能力,实现中小企…...

自动驾驶规划-RTT* 算法 【免费获取Matlab代码】
目录 1.算法原理3.结果展示4.参考文献5.代码获取 1.算法原理 RRT(Rapidly-Exploring Random Trees) 快速随机扩展树,是一种单一查询路径规划算法。RRT 将根节点作为搜索的起点,然后通过随机撒点采样增加叶子节点的方式,生成一个随机扩展树&a…...

shell编程中的运算符的讲解
在Linux操作系统中也可以使用expr来进行一些数值的运算,expr接受表达式作为参数,并打印计算结果。 对于某些复杂的表达式或早期不支持内嵌算术表达式的Shell环境,expr 仍然是一个可行的选择。 如上图所示,是使用变量sum来承接加和…...
yudao-ui-admin-vue3 nginx配置
本文记录一个yudao-ui-admin-vue3 nginx配置信息 一、安装依赖 npm install 二、编译打包 npm run build:prod三、修改.env.prod文件 # 请求路径 VITE_BASE_URL=http://IP地址/admin-api四、 nginx配置 server {listen 80;server_name localhost...

vue3第四十节(pinia的用法注意事项解构store)
pinia 主要包括以下五部分,经常用到的是 store、state、getters、actions 以下使用说明,注意事项,仅限于 vue3 setup 语法糖中使用,若使用选项式 API 请直接查看官方文档: 一、前言: pinia 是为了探索 vu…...
PostgreSQL源码分析——索引扫描
这里,我们分析一下索引扫描的过程,以最简单的select * from t1 where a 100;语句为例,分析一下查询的过程。 postgrespostgres# \d t1;Table "public.t1"Column | Type | Collation | Nullable | Default ------------------…...

零基础入门学用Arduino 第四部分(一)
重要的内容写在前面: 该系列是以up主太极创客的零基础入门学用Arduino教程为基础制作的学习笔记。个人把这个教程学完之后,整体感觉是很好的,如果有条件的可以先学习一些相关课程,学起来会更加轻松,相关课程有数字电路…...

x-anylabelimg如何标识人脸
软件地址,下载CPU版本就好 https://github.com/CVHub520/X-AnyLabeling/releases/tag/v2.0.0 一、打开软件选择的一个按钮,选择文件夹 二、选择模型运行 未下载的模型需要安全上网下载 选用Yolov6Lite_l-Face MeiTuan生成的文件格式,略作调…...

Element-ui中Table表格无法显示
Element-ui中Table表格无法显示 在使用过程中发现样式正常显示但是table就是不显示,研究了一段时间后,发现问题是项目结构的问题 当你创建vue和安装el的时候,一定要注意进入到正确的项目文件夹,如果在外面也出现一个package.jso…...

电信网关配置管理系统 del_file.php 前台RCE漏洞复现
0x01 产品简介 中国电信集团有限公司(英文名称“China Telecom”、简称“中国电信”)成立于2000年9月,是中国特大型国有通信企业、上海世博会全球合作伙伴。电信网关配置管理系统是一个用于管理和配置电信网络中网关设备的软件系统。它可以帮助网络管理员实现对网关设备的远…...
游戏心理学Day18
游戏玩家心理 在游戏世界中,设计师的工作总是围绕尽可能留住玩家要展开。在游戏创作时,设计师会假设目标诉讼的特点并激励迎合他们的需求,如果这种假设是经过实际调研之后做出的,那么就会比较接近实际情况而。如果这种假设是设计…...
发文章不违规的5种解决方案,非常适用,记得收藏!
之前以为使用AI写出来的文章,只要检测通过就不会违规,结果却还是让我有些失望。最近测试几款AI工具,测试结果都还是会存在违规情况,无法全文发布。 AI是听从人的指令,只能说是如何下指令,这个非常重要。至…...
【ARMv8/ARMv9 硬件加速系列 2.2 -- ARM NEON 的加减乘除(左移右移)运算】
文章目录 NEON 加减乘除NEON 加减乘除 下面代码是使用ARMv8汇编语言对向量寄存器v0-v31执行加、减、乘以及左移和右移操作的示例。 ARMv8的SIMD指令集允许对向量寄存器中的多个数据进行并行操作。v0和v1加载数据,对它们进行加、减和乘,左移和右移操作。最后,我们会将结果存储…...

[2024-06]-[大模型]-[Ollama]- WebUI
主要涉及要部署的前端webui是来源于:https://github.com/open-webui/open-webui 正常就使用: docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-web…...

AI智能盒子助力中钢天源设备工厂升级安全防护
中钢集团安徽天源科技股份有限公司成立于2002年3月27日,是中央企业中国中钢股份有限公司控股的上市公司,主导产品为永磁铁氧体器件、钕铁硼器件、四氧化三锰、锶铁氧体预烧料及各类磁选机等。 在中钢天源智能化升级过程中,采用并定制开发一系列厂区安全…...

RNN的变种们:GRULSTM双向RNN
上篇笔记记录到RNN的一个缺点:训练时会出现梯度消失,解决的办法是找到一个更优的计算单元。这里也有GRU和LSTM。 GRU(Gated Recurrent Unit)门控训练网络 什么是门控机制?就是对当前的输入进行一个筛选。门打开&…...

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...