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

聊聊系统架构之负载均衡优化实践

一、写在前面

最近在进行线上监控检查时,我遇到了两个超出预期的案例。首先,网关层的监控数据与应用实际监控数据存在不一致性,尤其是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)门控训练网络 什么是门控机制?就是对当前的输入进行一个筛选。门打开&…...

Linux网络-HttpServer的实现

文章目录 前言一、请求报文的解析URL的解析 二、响应报文的发送Content-LenthConten-TypeCookie和Set-CookieCookie的风险 三、尝试发送一个HTML网页404网页Location 重定向 四、浏览器的多次请求行为总结 前言 之前我们简单理解了一下Http协议,本章我们将在LInux下…...

GPT-4o的综合评估与前景展望

如何评价GPT-4o? GPT-4o作为OpenAI推出的最新一代大型语言模型,其性能、功能和应用前景都备受关注。以下是对GPT-4o的综合评估与前景展望: 一、技术性能评估 响应速度:GPT-4o在响应速度上有了显著提升,能够在极短的时间内对输入…...

私人云盘(自动云同步)

一、项目简介 模仿小米的云服务,实现一个通过TCP实现的私人云盘,因为能力有限,所以只实现自动云同步这一个功能,具体可以分为三个小功能,即保持云端和终端数据一致、实现文件的上传与下载以及手动同步 二、涉及到的知…...

【CMake】Linux 下权限丢失与软链接失效问题

【CMake】Linux 下权限丢失与软链接失效问题 文章目录 【CMake】Linux 下权限丢失与软链接失效问题问题概述解决方法1 - 安装目录2 - 安装文件3 - 手动指定 使用 Linux 下原生命令行注意事项参考链接 问题概述 一般使用 CMake 安装,在 Windows 平台不会出问题&…...

内部类介绍

内部类(Inner Class)是在另一个类的内部定义的类。它可以访问外部类的所有成员,包括私有成员。内部类有两种主要形式:局部内部类(定义在方法内部)和成员内部类(定义在类的内部,但不在…...

【CVPR2021】LoFTR:基于Transformers的无探测器的局部特征匹配方法

LoFTR:基于Transformers的局部检测器 0. 摘要 我们提出了一种新的局部图像特征匹配方法。我们建议先在粗略级别建立像素级密集匹配,然后再在精细级别细化良好匹配,而不是按顺序进行图像特征检测、描述和匹配。与使用成本体积搜索对应关系的密…...

总结一下 C# 如何自定义特性 Attribute 并进行应用

前言 Attribute(特性)是一种用于为程序元素(如类、方法、属性等)提供元数据信息的方法。 特性是一种声明式的信息,附加到程序元素上,提供额外的数据用于描述和控制这些元素的行为。 在编译和运行时&…...

三种暴露方法和引入方式

1.分别暴露 export ...export...用于按需导出一个或多个模块,在导入时需要使用花括号指定导入的模块名称,例如import { a, b } from module module.js中 export let a 1 export function b(){console.log(hello,vue) } 2.统一暴露 export { ...}用于统…...

“Git之道:掌握常用命令,轻松管理代码“

目录 1. 初始化和配置 2. 提交和更新 3. 分支和合并 4. 查看和比较 5. 远程仓库 6. 文件操作命令 1. 初始化和配置 git init:在当前目录初始化一个新的Git仓库git config:配置Git的全局或局部选项git clone:从远程仓库克隆一个本地副本…...

Linux vim 文本编辑 操作文本 三种模式

介绍 vi 是一个经典的行编辑器,支持模式编辑(包括普通模式、插入模式和命令模式)。 vim 保留vi核心功能的基础上,增加了多级撤销、语法高亮、插件支持等高级功能。 两者的最大区别,简单的来说vim就是vi的增强版 三…...

北京网站设计公司济南兴田德润团队怎么样/引擎seo如何优化

Go语言channel实现等待所有任务完成package main//通过channel实现等待所有任务完成​import ("fmt""runtime""strconv""time")​func runTask2(i int) string {time.Sleep(time.Second*1)return strconv.Itoa(i)"返回的结果&quo…...

扁平风格网站欣赏/聚名网官网登录

全文检索 全文检索不同于特定字段的模糊查询,使用全文检索的效率更高,并且能够对于中文进行分词处理。 haystack:全文检索的框架,支持whoosh、solr、Xapian、Elasticsearc四种全文检索引擎,点击查看官方网站(Haystack…...

常用的电子商务网站开发技术/建网站找谁

1.菱苦土不得与()复合使用 A.木质材料 B.聚乙烯材料 C.铁合金 D.铝合金 2.生产石灰的主要原料是() A.CaSO4•2H2O B.CaO C.CaCO3 D.Ca(OH)2 3.砌筑砂浆的流动性指标用()表示 A.坍落度 B.维勃稠度 C.分…...

中国建设招标网是什么网站/抖音seo搜索引擎优化

appium目前最新的windows版本是1.4.16,在android8.0.0真机上测试脚本时会报错:command failed shell “ps ‘uiautomator’”。 刚开始以为错误原因是模拟器系统和真机系统版本没对应上(小菜,所以在猜原因)&#xff0…...

企业做网站需要什么/宁波 seo整体优化

有时候,我们需要将两张图片融合在一起。 比如我们要把下面这两张合并为一张: 最后得到这两种效果图: 这些操作也不是很难。 在这之前我们需要了解一个函数 CV_EXPORTS_W void addWeighted(InputArray src1, double alpha, InputArray src2,d…...

wordpress 主题腾讯cdc/温州seo优化公司

目录版本整形数组浮点型数组嵌套列表构成的多维数组,内层的列表被当作二维数组的行创建一个长度为10的数组,数组的值都是0创建一个长度为10的数组,数组的值都是1创建一个35的浮点型数组,数组的值都是3.14创建一个数组,…...