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

一、写在前面

最近在进行线上监控检查时,我遇到了两个超出预期的案例。首先,网关层的监控数据与应用实际监控数据存在不一致性,尤其是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数量)

当然解决方案很简单。一方面设置合理的超时时间,调整负载均衡策略如轮询最小连接等。

五、写在最后

线上监控当发现问题解决问题后,追根溯源也是非常重要的。不能忽视线上的任何问题,无论它们是多少微小。每一个异常都有可能是更深层次问题的征兆。通过建立一套完善的监控体系,实时捕捉异常数据,结合深入的技术分析和理解,就能够及时定位问题并采取相应措施。这不仅仅是为了解决眼前的问题,更是为了系统的长期健康和可持续发展。追踪溯源的过程,虽然可能耗时费力,但它是确保我们服务可靠、稳定和高效的基石。



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/721066.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VST3音频插件技术介绍

一.概述 1.VST3介绍 VST3(Virtual Studio Technology 3)是一种音频插件格式,由Steinberg公司开发,用于在数字音频工作站(DAW)中使用。VST3插件可以是模拟合成器、鼓机、混响器、压缩器等多种类型的音频处理…

AI在医学中神奇应用

2022年11月30日,可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT-3.5,将人工智能的发展推向了一个新的高度。2023年11月7日,OpenAI首届开发者大会被称为“科技界的春晚”,吸引了全球广大…

零基础入门学用Arduino 第四部分(一)

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

【调试笔记-20240618-Windows-pnpm 更新出现 Cannot find module 问题的解决方法】

调试笔记-系列文章目录 调试笔记-20240618-Windows-pnpm 更新出现 Cannot find module 问题的解决方法 文章目录 调试笔记-系列文章目录调试笔记-20240618-Windows-pnpm 更新出现 Cannot find module 问题的解决方法 前言一、调试环境操作系统:Windows 10 专业版调…

内部类介绍

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

echart在线图表demo下载直接运行

echart 全面的数据可视化图表解决方案 | 折线图、柱状图、饼图、散点图、水球图等各类图表展示 持续更新中 三色带下表题速度仪表盘 地图自定义图标 动态环形图饼状图 动态水波动圆形 多标题指针仪表盘 温度仪表盘带下标题 横向柱状图排名 环形饼状图 双折线趋势变化

Git的3个主要区域

一般来说,日常使用只要记住下图6个命令,就可以了。但是熟练使用,恐怕要记住60~100个命令。 下面是我整理的常用 Git 命令清单。几个专用名词的译名如下。 Workspace:工作区 Index / Stage:暂存区 Reposito…

学会这几点,轻松制作引人入胜的电子期刊

随着数字化时代的到来,电子期刊已经成为了信息传播的重要载体。它以方便快捷、形式多样、互动性强等特点,受到了广泛的欢迎。那么,如何制作一份引人入胜的电子期刊呢?下面就来为大家分享几点制作电子期刊的小技巧。 1.选择合适的制…

制造业为什么需要ERP企业管理软件?

如今,传统的制造业管理方式逐渐变得力不从心~库存积压、生产效率低下、供应链混乱…想象一下,如果你的企业仍然依赖于手工记录订单、库存和财务数据,那么每当市场发生变动时,你就需要花费大量的时间和精力去重新调整生产计划、更新…

Qt 实战(5)布局管理器 | 5.2、深入解析Qt布局管理器

文章目录 一、深入解析Qt布局管理器1、为什么要使用布局管理器?2、布局管理器类型3、布局管理器用法详解3.1、QBoxLayout(垂直与水平布局)3.2、QGridLayout(网格布局)3.3、QFormLayout(表单布局&#xff09…

LLM2Vec论文阅读笔记

这是篇LLM论文,用decoder-like的LLM去提取embedding文章认为,decoder-like的LLM在text embedding task表现不优的一大原因就是其casual attention mechanism,其实就是mask的问题。所以只要对现有的decoder-only LLM进行如下三步改进&#xff…

接口联调测试

在我们工作过程中,有时需要一些接口进行联调。接口联调测试,就是按照业务要求,把接口进行组合测试。接口组合起来才能实现完整的业务,体现更大的价值。 接口联调测试业务分析: 原因: 项目中的接口是多个…

【数据结构与算法】最小生成树

文章目录 最小生成树(MST)定义 构造最小生成树Prim算法Kruskal算法 最小生成树(MST) 连通图的生成树包含图的所有顶点,并且只含有尽可能少的边。对于生成树来说,若砍去它的一条边,则会使生成树…

DOOPRIME:日本央行7月加息与否取决于数据,购债规模调整无强烈信号

摘要 日本央行行长植田和男近日在议会发言中表示,7月份是否加息将取决于经济数据表现,而购买日本国债与加息是两个独立的问题,不会通过削减购债规模来释放强烈的政策信号。这一表态引发了市场的广泛关注,投资者和经济学家对此进行…

【elementui源码解析】如何实现自动渲染md文档-第四篇

目录 1.前言 2.md-loader - index.js 1)md.render() 2)定义变量 3)while stripTemplate stripScript genInlineComponentText 4)pageScript 5)return 6)demo-block 3.总结 所有章节&#x…

MyBatis逆向工程和MyBatisX插件的使用

文章目录 1.ORM思维2.逆向工程3.MyBatisX插件的使用 1.ORM思维 ORM(Object-Relational Mapping,对象-关系映射)是一种将数据库和面向对象编程语言中的对象之间进行转换的技术。它将对象和关系数据库的概念进行映射,最后我们就可以…

发生了什么?法国市值蒸发超1.8万亿元

KlipC报道:一周前,法国总统马克龙意外宣布提前举行国会议员选举,引发了法国政坛遭受巨震。仅仅一周内,法国股市遭受重大打击,其市值蒸发了约2580亿美元(约1.8万亿人民币)。 多家大型金融机构多…

【Go语言精进之路】构建高效Go程序:了解string实现原理并高效使用

🔥 个人主页:空白诗 🔥 热门专栏:【Go语言精进之路】 文章目录 引言一、Go语言的字符串类型1.1 字符串的定义1.2 字符串的零值可用1.3 字符串的不可变性1.4 字符串的拼接1.5 字符串的常用方法1.6 实际使用示例 二、字符串的内部表…

【Git】多人协作 -- 详解

一、多人协作(1) ⽬前,我们所完成的工作如下: 基本完成 Git 的所有本地库的相关操作,git 基本操作,分支理解,版本回退,冲突解决等等。 申请码云账号,将远端信息 clone…

【牛客面试必刷TOP101】Day33.BM70 兑换零钱(一)和BM71 最长上升子序列(一)

文章目录 前言一、BM70 兑换零钱(一)题目描述题目解析二、BM71 最长上升子序列(一)题目描述题目解析总结 前言 一、BM70 兑换零钱(一) 题目描述 描述: 给定数组arr,arr中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币…