如何一步步优化负载均衡策略

发展到一定阶段后,Web 应用程序就会增长到单服务器部署无法承受的地步。这时候企业要么提升可用性,要么提升可扩展性,甚至两者兼而有之。为此,他们会将应用程序部署在多台服务器上,并在服务器之前使用负载均衡器来分配传入的请求。大公司可能需要数千台运行其 Web 应用程序的服务器来处理负载。

在这篇文章中,我们将重点关注单个负载均衡器将 HTTP 请求分发到一组服务器的各种可行方式。我们将从底层开始,逐步引出现代负载均衡算法。

一、问题可视化

我们先从头开始:单个负载均衡器将请求发送到单台服务器,请求以每秒 1 个请求(RPS)的速率发送,并且每个请求在服务器处理时都会逐渐缩小。对于很多网站来说,这种设置挺好用。现代服务器性能强大,可以处理大量请求。但是当它们的性能跟不上时会发生什么事情?

从上面的模拟中我们可以看到,3RPS 的速率导致一些请求被丢弃了。如果在处理一个请求时,另一个请求到达了服务器,服务器将丢弃后者。这将导致向用户显示的错误,这是我们要避免的事情。我们可以将另一台服务器添加到负载均衡器来解决这个问题。

现在不再有丢弃的请求了!我们的负载均衡器在这里起到了作用,依次向每台服务器发送请求,这称为“循环法”负载均衡。它是最简单的负载均衡形式之一,当你的服务器都同样强大并且你的请求都同样昂贵时,这个机制很合适。

二、当循环法不好用的时候

在现实世界中,服务器同样强大而请求同样昂贵的情况很少见。即使你使用完全相同的服务器硬件,它们的性能也可能不同。应用程序可能必须为许多不同类型的请求提供服务,并且这些请求可能具有不同的性能特征。

我们看看当我们改变请求成本时会发生什么事情。在以下模拟中,请求的成本并不相同。你可以看到一些请求比其他请求花费了更长的时间。

虽然大多数请求都得到了成功处理,但我们确实放弃了其中一些请求。缓解这种情况的方法之一是引入一个“请求队列”。

请求队列帮助我们应对不确定性,但这是一种权衡。我们将丢弃更少的请求,但代价是某些请求具有更高的延迟。如果你观看上面的模拟足够长的时间,你可能会注意到请求的颜色发生了微妙的变化。请求没有被送达的时间越长,它们的颜色变化的就越多。你还会注意到,由于请求成本差异,服务器开始表现出不均衡情况。队列会在运气不好的,必须连续服务多个昂贵请求的服务器上备份下来。如果队列已满,我们将丢弃请求。

上述情况同样适用于性能不一样的服务器组。在下一个模拟中,我们还改变了每台服务器的性能,在视觉上用较深的灰色阴影表示。

服务器被赋予一个随机的性能值,但很可能有些服务器的性能低于其他服务器,并且它们很快就会开始丢弃请求。与此同时,性能更强大的服务器大部分时间都处于闲置状态。这个场景展示了循环法的主要弱点:方差。

然而,尽管存在缺陷,循环法仍然是 nginx 的默认 HTTP 负载均衡方法。

三、改进循环法

我们可以改进循环法来更好地应对方差。有一种称为“加权循环法”的算法,其中用一个权重来标记每台服务器,该权重决定了向每台服务器发送多少请求。

在这个模拟中,我们使用每台服务器的已知性能值作为其权重,并在循环遍历它们时向更强大的服务器提供更多请求。

虽然这种机制能比普通循环法更好地处理服务器性能的差异,但我们仍然需要应对请求方差。在实践中,让人类手动设定权重的做法很快就会失败的。将服务器性能用某个数字来表示是很难的事情,并且需要对真实工作负载进行仔细的负载测试。实践中很少这样做,因此加权循环法的另一种变体会使用一个代理指标动态计算权重:它就是延迟。

按理说,如果一台服务器处理请求的性能是另一台服务器的 3 倍,那么它的速度可能就是另一台服务器的 3 倍,并且应该接收相当于另一台服务器 3 倍的请求数量。

这次我向每台服务器添加了文本,显示最后 3 个请求的平均延迟。然后我们根据延迟的相对差异决定是否向每台服务器发送 1、2 或 3 个请求。结果与初始的加权循环模拟非常相似,但无需预先指定每台服务器的权重。该算法还能适应服务器性能随时间的变化。这称为“动态加权循环法”。

我们来看看它如何处理服务器性能和请求成本都存在很大方差的复杂情况。以下模拟使用随机值,因此请随意刷新页面几次,查看它是否适应了新的情况。

四、循环法以外的选项

动态加权循环似乎能很好地处理服务器性能和请求成本的方差。但我们有没有更好、更简单的算法呢?答案是肯定的。

这称为“最少连接”负载均衡法。

因为负载均衡器位于服务器和用户之间,所以它可以准确地跟踪每台服务器有多少未完成的请求。然后当一个新的请求进来并且该确定将它发送到哪里时,负载均衡器已经知道哪些服务器要做的工作是最少的,并且会优先考虑这些服务器。

无论存在多少方差,该算法都表现得非常好。它能准确掌握每台服务器正在做什么的信息,从而消除了不确定性。而且它的另一个好处是实施起来非常简单。由于这些原因,你会发现这个算法是 AWS 负载均衡器的默认 HTTP 负载均衡方法。它也是 nginx 中的一个选项,如果你从未更改过它的默认设置,这个算法非常值得一试。

我们来看看这个算法在类似的复杂模拟中的实际效果。这里用的参数同上面为动态加权循环算法提供的参数是一样的。同样,这些参数在给定范围内是随机的,因此请刷新页面以查看新情况。

虽然这个算法在简单性和性能之间取得了很好的均衡,但它无法避免丢弃请求的情况。但是你会注意到,这个算法只有在实际上没有更多可用队列空间的状况下才会丢弃请求。它能确保所有可用资源都被用上,这让它成为了大多数工作负载的绝佳默认选项。

五、延迟优化

到目前为止,我一直在回避讨论的一个关键部分:我们要优化什么指标。我之前一直把放弃请求当作是很糟糕的结果,并试图避免它们。这是一个不错的目标,但它并不是我们在 HTTP 负载均衡器中最想优化的指标。

我们更关心的指标一般是延迟。这是从创建请求到处理请求的时间,以毫秒为单位。当我们讨论延迟时,通常会谈论不同的“百分位数”。例如,第 50 个百分位数(也称为“中位数”)定义为 50%的请求低于该值(单位为毫秒),50%的请求高于该值。

我用相同的参数运行了 3 次模拟,持续 60 秒,每秒都会进行各种测量。3 次模拟的差异仅来源于所使用的负载均衡算法。我们来对比 3 个模拟的中值:

image.png

你可能没想到的是,循环法的延迟中值是最好的。如果我们不看其他数据点,得出的结论就会有问题。我们来看看第 95 个和第 99 个百分位数。

image.png
注意:每种负载均衡算法的不同百分位数之间没有颜色差异。更高的百分位数在图表上总是更高的。

我们看到循环法在较高的百分位数中表现不佳。可是为什么循环法的中位数表现很好,但第 95 个和第 99 个百分位数很差呢?

在循环法中不考虑每台服务器的状态,因此会有相当多的请求转到空闲服务器,于是第 50 个百分位的延迟就很低。另一方面,算法也很乐意将请求发送到过载的服务器上,因此第 95 和 99 个百分位数很差。

我们可以看看直方图形式的完整数据:

image.png

我为这些模拟调整了参数以避免丢弃任何请求,这样 3 种算法的数据点数量就是一样的。我们再次运行模拟,这次增加 RPS 值,目的是将所有算法推到它们可以处理的范围之外。以下是丢弃请求随时间积累的图表。

image.png
最少连接算法可以更好地处理过载,但这样做的代价是 95%和 99%的延迟略高。根据你的用例情况,这可能是一个值得接纳的权衡。

六、最后一个算法

如果我们真的想针对延迟做优化,我们需要一种将延迟考虑在内的算法。如果我们可以将动态加权循环算法与最少连接算法结合起来,那不是很好吗?我们可以得到加权循环法的延迟优势和最少连接法的弹性优势。

事实证明,在我们之前就有人有了这样的想法。下面是对称为“峰值指数加权移动平均值”(或 PEWMA)的算法的模拟。这是一个又长又复杂的名字,但坚持住,我稍后会详细解释它的工作原理。

我为这个模拟设置了特定的参数,保证它表现出预期的行为。如果你仔细观察,你会注意到算法会在一段时间后停止向最左边的服务器发送请求。它这样做是因为它发现其他服务器都更快,并且不需要向最慢的服务器发送请求——这只会导致请求有更高的延迟。

那么它是如何做到的呢?它将动态加权循环与最少连接法结合了起来,并加上了一点独创的魔法。

对于每台服务器,该算法会跟踪最近 N 个请求的延迟。算法不是用这个数据来计算平均值,而是对值求和,但比例因子呈指数下降。这会产生一个值,其中延迟时间越长,它对总和的贡献就越小。最近的请求相比老的请求对计算的影响更大。

然后将该值乘以服务器的开启连接数,我们用得出来的结果值来选择将下一个请求发送到哪台服务器上。这个值越低越好。

那么它是如何做比较的呢?首先,我们来看一下第 50、95 和 99 个百分位数与之前的最少连接法数据的对比。

image.png

我们看到结果有了全方位的显著改善!新算法在较高的百分位数上优势更为明显,但中位数也一直有优势。下面我们来看直方图形式的相同数据。

image.png

请求丢弃的情况如何?

image.png

它开始表现得更好,但随着时间的推移开始差于最少连接法,这是有道理的。PEWMA 是机会主义的,因为它试图获得最佳延迟,这意味着它有时可能会让服务器负载不足。

我想在这里补充一点,PEWMA 有很多可以调整的参数。我为这篇文章编写的实现使用的配置似乎比较适合我的测试场景,但进一步调整参数可以获得比最少连接法更好的结果。这是 PEWMA 与最少连接法相比的一项劣势:额外的复杂性。

七、总结

我在这篇文章上花了很长时间。我们很难在现实主义与简单易懂之间取得平衡,但我对最终成文还是很满意的。我希望读者能够通过本文理解这些复杂系统在理想和不太理想的情况下,实践的行为方式,这样可以帮助大家直观地了解它们在什么情况下最适用于你的工作负载。

免责声明:你一定要牢记自己的负载才是永远的基准,不要把网上看来的建议视为福音。我在这里的模拟忽略了一些现实场景中的限制(服务器启动慢、网络延迟之类),而且为了展示每个算法的特定属性做了参数调整。它们并不是反映现实情况的基准测试。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为云云耀云服务器L实例评测|SpringCloud相关组件——nacos和sentinel的安装和配置 运行内存情况 服务器被非法登陆尝试的解决

前言 最近华为云云耀云服务器L实例上新,也搞了一台来玩,期间遇到各种问题,在解决问题的过程中学到不少和运维相关的知识。 本篇博客介绍SpringCloud相关组件——nacos和sentinel的安装和配置,并分析了运行内存情况,此…

数据在内存中的存储(1)

文章目录 目录1. 数据类型介绍1.1 类型的基本归类 2. 整形在内存中的存储2.1 原码、反码、补码2.2 大小端介绍2.3 练习 附: 目录 数据类型介绍整形在内存中的存储大小端字节序介绍及判断浮点型在内存中的存储 1. 数据类型介绍 前面我们已经学习了基本的内置类型以…

Ubuntu20配置Mysql常用操作

文章目录 版权声明ubuntu更换软件源Ubuntu设置静态ipUbuntu防火墙ubuntu安装ssh服务Ubuntu安装vmtoolsUbuntu安装mysql5.7Ubuntu安装mysql8.0Ubuntu卸载mysql 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明,所有版权属于黑马程…

回归预测 | MATLAB实现PSO-SVR粒子群优化支持向量机回归多输入单输出预测

回归预测 | MATLAB实现PSO-SVR粒子群优化支持向量机回归多输入单输出预测 目录 回归预测 | MATLAB实现PSO-SVR粒子群优化支持向量机回归多输入单输出预测预测效果基本介绍模型描述程序设计预测效果 <

lv7 嵌入式开发-网络编程开发 11 TCP管理与UDP协议

目录 1 TCP管理 1.1 三次握手 1.2 四次挥手 1.3 保活计时器 2 wireshark安装及实验 3.1 icmp协议抓包演示 3.2 tcp协议抓包演示 3 UDP协议 3.1 UDP 的主要特点&#xff1a; 4 练习 1 TCP管理 1.1 三次握手 TCP 建立连接的过程叫做握手。 采用三报文握手&#xff1…

Fiddler抓取手机https包的步骤

做接口测试时&#xff0c;有时我们需要使用fiddler进行抓包分析&#xff0c;那么如何抓取https包。主要分为以下七步&#xff1a; 1.设置fiddler选项&#xff1a;Tools->Options,按如下图勾选 2.下载并安装Fiddler证书生成器 下载地址&#xff1a;http://www.telerik.com/…

C/C++——内存管理

1.为什么存在动态内存分配 灵活性 静态内存分配是在编译时确定的&#xff0c;程序执行过程中无法改变所分配的内存大小&#xff1b;动态内存分配可以根本程序的运行环境来动态分配和释放空间&#xff0c;提供了更大的灵活性 动态数据结构 有些数据结构的大小和结构在编译时…

[计算机入门] Windows附件程序介绍(工具类)

3.14 Windows附件程序介绍(工具类) 3.14.1 计算器 Windows系统中的计算器是一个内置的应用程序&#xff0c;提供了基本的数学计算功能。它被设计为一个方便、易于使用的工具&#xff0c;可以满足用户日常生活和工作中的基本计算需求。 以下是计算器程序的主要功能&#xff1a…

【算法基础】基础算法(二)--(高精度、前缀和与差分)

一、高精度 当一个数很大&#xff0c;大到 int 无法存下时&#xff0c;我们可以考虑用数组来进行存储&#xff0c;即数组中一个位置存放一位数。 但是对于数组而言&#xff0c;一个数顺序存入数组后&#xff0c;对其相加减是很简单的。但是当需要进位时&#xff0c;还是很麻烦的…

华为云云耀云服务器L实例评测|部署个人音乐流媒体服务器 navidrome

华为云云耀云服务器L实例评测&#xff5c;部署个人音乐流媒体服务器 navidrome 一、云耀云服务器L实例介绍1.1 云服务器介绍1.2 产品规格1.3 产品优势1.4 支持镜像 二、云耀云服务器L实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置 三、部署 navidrome3.1 navidrome 介绍3.…

【动手学深度学习-Pytorch版】Transformer代码总结

本文是纯纯的撸代码讲解&#xff0c;没有任何Transformer的基础内容~ 是从0榨干Transformer代码系列&#xff0c;借用的是李沐老师上课时讲解的代码。 本文是根据每个模块的实现过程来进行讲解的。如果您想获取关于Transformer具体的实现细节&#xff08;不含代码&#xff09;可…

ElasticSearch - 基于 拼音分词器 和 IK分词器 模拟实现“百度”搜索框自动补全功能

目录 一、自动补全 1.1、效果说明 1.2、安装拼音分词器 1.3、自定义分词器 1.3.1、为什么要自定义分词器 1.3.2、分词器的构成 1.3.3、自定义分词器 1.3.4、面临的问题和解决办法 问题 解决方案 1.4、completion suggester 查询 1.4.1、基本概念和语法 1.4.2、示例…

Ubuntu Server CLI专业提示

基础 网络 获取所有接口的IP地址 networkctl status 显示主机的所有IP地址 hostname -I 启用/禁用接口 ip link set <interface> up ip link set <interface> down 显示路线 ip route 将使用哪条路线到达主机 ip route get <IP> 安全 显示已登录的用户 w…

PLL锁相环倍频原理

晶振8MHz&#xff0c;但是处理器输入可以达到72MHz&#xff0c;是因为PLL锁相环提供了72MHz。 锁相环由PD&#xff08;鉴相器&#xff09;、LP&#xff08;滤波器&#xff09;、VCO&#xff08;压控振荡器&#xff09;组成。 处理器获得的72MHz并非晶振提供&#xff0c;而是锁…

好工具分享:阿里云价格计算器_一键计算精准报价

阿里云服务器价格计算器&#xff0c;鼠标选择云服务器ECS实例规格、地域、系统盘、带宽及购买时长即可一键计算出精准报价&#xff0c;阿里云服务器网分享阿里云服务器价格计算器链接地址&#xff1a; 阿里云服务器价格计算器 先打开阿里云服务器ECS页面 aliyunfuwuqi.com/go…

生成Release版本的.pdb文件

软件分为Debug版本、Release版本这2种版本&#xff0c;其中Debug版本是带有.pdb调试信息文件&#xff0c;而Release版本不带.pdb调试信息文件。软件发布时&#xff0c;一般采用Release版本&#xff0c;若因内存泄漏、数组访问越界、除零错误、磁盘读写错误等异常&#xff0c;造…

计算机毕设 大数据房价预测分析与可视

文章目录 0 前言1 课题背景2 导入相关的数据 3 观察各项主要特征与房屋售价的关系4 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟…

CleanMyMac X4.14.1最新版本下载

CleanMyMac X是一个功能强大的Mac清理软件&#xff0c;它的设计理念是提供多个模块&#xff0c;包括垃圾清理、安全保护、速度优化、应用程序管理和文档管理粉碎等&#xff0c;以满足用户的不同需求。软件的界面简洁直观&#xff0c;让用户能够轻松进行日常的清理操作。 使用C…

Scala第十一章节

Scala第十一章节 1.模式匹配 2. Option 类型 3.偏函数 4.正则表达式 5.异常处理 6.提取器 7.案例&#xff1a;随机职业 scala总目录 文档资料下载

如何使用 LeiaPix 让照片动起来

在过去&#xff0c;想要让照片动起来&#xff0c;需要使用专业的软件和技巧。但是&#xff0c;随着科技的发展&#xff0c;现在只需使用一个简单的工具&#xff0c;就可以轻松地让照片动起来。 LeiaPix 是一个免费的在线工具&#xff0c;可以将静态照片转换为动画。该工具使用…