负载均衡常用调度算法介绍和选择

这篇具有很好参考价值的文章主要介绍了负载均衡常用调度算法介绍和选择。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

为什么要有调度算法?

所有服务器,都有一个能处理请求的qps上限,超过这个上限就会有丢包的风险,这个时候我们必须对服务器进行扩容。
扩容有两种方法,一种是增加服务器的硬件资源(scale up纵向扩容),这种方法比较简单,插块卡就行了,但是如果要增加计算网络资源的话,可能需要重启服务器,而且卡槽总有插满的一天。另一种方法是增加服务器的个数(scale out横向扩容),目的是为了让请求均匀的分配到多台服务器上,减少单台服务器的压力,并且结合健康监测可以避免单机故障。scale out的扩展能力明显要比scale up要好,理论上可以无限往上扩展。
那怎么让请求可以均分到每一台服务器上呢,就得靠我们熟知的负载均衡器了。我们比较常见的负载均衡器有lvs、nginx等,作为服务器的前端,流量首先经过负载均衡器,然后负载均衡器的调度器根据对应的调度算法,将请求转发给合适的服务器。

常用负载均衡算法

rr-轮询算法

轮询调度算法,顾名思义,就是将请求轮训的调度到每一台服务器上,是最简单的一种调度算法。这个算法的目的就是想做到一个“绝对的公平”。

wrr-加权轮询算法

轮询算法把请求平均分配给后端服务器,所以每个服务器的负载都是一样的,如果后端服务器的性能不一样,就有可能出现性能比较差的服务器挂掉的情况。所以就出现了加权轮询算法,权重值其实就是服务器的处理能力,权重值越高的机器处理的请求就越多。

wlc-加权最小连接算法

前面的加权轮询算法是一种无状态的算法,它不会去管服务器的真实负载情况。最小连接算法会记录所有服务器的连接建立情况,调度器总是把请求调度给连接数最少的服务器上。wlc尽可能让服务器的已有连接数和权重值成比例。

hash-哈希算法

hash算法首先对每台服务器的ip+port进行hash,然后根据请求的一个特定元组来计算出请求的hash值,最后将这个请求发送给hash值更接近的服务器。这个特定的元组可以自己设定,可以是源地址、源端口、目的地址、目的端口、协议中的任意几项。哈希算法可以保证同一个客户端或者同一个四元组(会话)的请求永远只被同一台服务器处理,如果四元组足够散列,那请求理论上也是均分到各个服务器上的。

一致性hash算法

在实际运维过程中,服务器变更(增删服务器)的操作十分频繁,对普通的hash算法来说,每次变更服务器,调度器都会重新计算服务器的hash值,这样即使是同一个四元组(会话),在变更前后,也会调度到不通的服务器上。一致性hash就是为了在服务器变更后,也尽可能的让同一个会话调度到同一个rs上,保持连接的一致性。比较常用的一致性hash算法有hash环和maglev hash,具体内容可以查看这篇文章:https://writings.sh/post/consistent-hashing-algorithms-part-4-maglev-consistent-hash。

为什么会出现调度不均的情况?

可以看到调度算法本质上的目的都是为了让请求均匀的分配到每台服务器上,但是算法都是有缺陷的,在实际生产过程中,经常会遇到调度不均的情况。主要有以下几个原因:

  1. wrr-原生wrr算法算法有一个bug。调度算法每次出现健康检查抖动的时候,都会重置调度器,重新从头开始调度。rr算法加入了一个随机因子,每次重置后会随机选择一个服务器,而wrr算法没有加入这个随机因子,所以如果健康检查抖动非常频繁的话,有可能排在前面的服务器上的请求比后面的服务器多很多。
  2. rr wrr-客户端使用长连接。如果客户端使用了很多长连接请求,某个服务器挂掉重启或者新添加了服务器,其他服务器上的长连接依然存在,在分配新连接的时候,调度器仍然根据权重来分配,这样机会导致重启的服务器或者新添加的服务器上的连接比其他服务器上的少很多。
  3. wrr wlc-多核调度。我们现在的负载均衡器往往是采用的一个多核的架构,每个核的调度算法都是独立的,而且所有 worker 以相同的方式初始化,所以每个 worker 会以相同的顺序选取 RS。比如,对于轮询(rr)调度,所有 worker 上的第一个连接都会选择 RS 列表中的第一台服务器。下图给出了 8 个 worker, 5 个 RS 的调度情况:假设 RSS HASH 算法是平衡的,则很可能前 8 个用户连接分别哈希到 8 个不同 worker 上,而 8 个 worker 独立调度,将 8 个用户流量全都转发到第一个 RS 上,而其余 4 个 RS 没有用户连接,使得负载在 RS 上分布很不均衡。
    负载均衡常用调度算法介绍和选择
  4. wlc-并发创建连接。假设短时间内有一批syn冲过来(同时并发创建一批连接),必然有一个服务器先建立第一个active的连接,在第二个服务器也建立第一个active连接之前,后面的连接都会发给第二个服务器,那么最终会看到第二个服务器的连接远大于第一个服务器,这样就导致了最终连接数的负载不均衡。服务器到负载均衡器之间的时延差异会放大这个不均衡。
  5. hash-客户端ip+port不够散列。这个很好理解,毕竟是hash算法,如果客户端的ip+port不够散列,就更容易出现hash碰撞。

怎么选择合适的调度算法

针对上章节的第一个和第三个问题,我们可以通过修改代码或者使用hash算法的方法来解决。
比较有意思的是第二个问题,这个问题的本质原因是wrr算法是无状态的,没有记录后端连接情况,那看起来可以用wlc算法来完美解决该问题。但是wlc算法在生产环境中却很少使用,因为它有一个非常非常严重的问题:强依赖于健康检查。假设我们有一台服务器挂掉了,这台服务器上的连接全部断掉,那这台服务器就一定是连接最少的。从服务器挂掉到负载均衡器监测出异常的这段时间,所有的请求都会打到这台有问题的服务器上,那这段时间所有的请求都会是失败的。负载均衡器的健康检查是需要时间的,在几十秒内服务完全不可用是很难接受的,而且万一健康检查没检测出来异常怎么办?文章来源地址https://www.toymoban.com/news/detail-434597.html

  • 尽可能不使用wlc算法,原因如上。
  • 如果需要保证连接的一致性,那只能选择一致性hash算法。
  • 如果客户端比较固定,比如内网场景,只有一两个固定的客户端,不够散列,建议不使用hash算法,使用wrr算法。
  • hash算法会占用比较多的内存,后端服务器越多,占用的内存也就越多,hash算法支持的后端服务器数量一定有个上限值,如果超过这个上限值,负载均衡器会crash。所以如果服务器特别多,建议不使用hash算法,使用wrr算法。
  • 由于wrr的bug比较多,所以其他情况下可以使用hash算法。

到了这里,关于负载均衡常用调度算法介绍和选择的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Flink源码解析四之任务调度和负载均衡

    jobmanager scheduler :这部分与 Flink 的任务调度有关。 CoLocationConstraint :这是一个约束类,用于确保某些算子的不同子任务在同一个 TaskManager 上运行。这通常用于状态共享或算子链的情况。 CoLocationGroup CoLocationGroupImpl :这些与 CoLocationConstraint 相关,定义了一组需要在同一个

    2024年02月06日
    浏览(43)
  • Flink源码解析八之任务调度和负载均衡

    jobmanager scheduler :这部分与 Flink 的任务调度有关。 CoLocationConstraint :这是一个约束类,用于确保某些算子的不同子任务在同一个 TaskManager 上运行。这通常用于状态共享或算子链的情况。 CoLocationGroup CoLocationGroupImpl :这些与 CoLocationConstraint 相关,定义了一组需要在同一个

    2024年02月05日
    浏览(42)
  • 专家解读:如何选择负载均衡设备?

    近年来,随着云计算与大数据的爆发式增长,众多大型数据中心都在积极部署或是升级负载均衡设备,以保障数据中心更加通畅可靠的运行。然而,负载均衡作为一种集硬件设备和解决方案于一体的系统型产品,并不像服务器或是PC那样可通过配置参数来辨别。在一大堆厂商

    2024年02月07日
    浏览(41)
  • 什么是爬虫,为什么爬虫会导致服务器负载跑满

    在我们日常使用服务器的过程中,经常会有遇到各种各样的问题。今天就有遇到用户来跟德迅云安全反馈自己服务器负载跑满,给用户详细排查后也未发现异常,抓包查看也没有明显攻击特征,后续查看发现是被爬虫爬了,调整处理好了后,一切恢复正常了。我们就来简单分

    2024年02月04日
    浏览(48)
  • 为什么选择新风机?

      现如今,新风机已经是很多场地的熟客了,那大家可能疑惑为什么选择新风机呢?那就让我揭晓答案吧!新风机有很多益处,让我大致简述一下吧。 改善室内空气质量:新风机能够引入新鲜的外界空气,并排除室内的污浊空气,有效净化空气,降低颗粒物、细菌、异味等有

    2024年02月11日
    浏览(56)
  • Java Chassis 3技术解密:负载均衡选择器

    原文链接:Java Chassis 3技术解密:负载均衡选择器-云社区-华为云 负载均衡用于管理微服务实例之间的访问策略。它负责在每次请求中高效选择目标实例,并保持请求在多个目标实例中均衡。目标实例选择过程可以使用下面的示例图简单展示: AZ亲和是常见的选择器之一。它

    2024年01月16日
    浏览(43)
  • 选择正确的负载均衡器:LVS还是Nginx?

    💡一个热爱分享高性能服务器后台开发知识的博主,目标是通过理论与代码实践的结合,让世界上看似难以掌握的技术变得易于理解与掌握。技能涵盖了多个领域,包括C/C++、Linux、Nginx、MySQL、Redis、fastdfs、kafka、Docker、TCP/IP、协程、DPDK等。 👉 🎖️ CSDN实力新星,社区专家

    2024年02月13日
    浏览(50)
  • 我为什么选择在大二实习?

    本文已收录于专栏 ⭐️ 《沈七杂谈》⭐️ 时间好快,转眼已经入职一个月了,实习要比想象的忙很多,所以一直没腾出时间写篇经验贴。 恰逢五一小长假,正好总结一下为在大二能找到实习所做一切的心路历程。 先简单介绍一下楼主,目前烂本大二在读,专业是软件工程

    2024年02月03日
    浏览(47)
  • 为什么选择 Flink 做实时处理

    优质博文:IT-BLOG-CN 【1】流数据更真实地反映了我们的生活方式(实时聊天); 【2】传统的数据架构是基于有限数据集的(Spark 是基于微批次数据处理); 【3】我们的目标:低延迟、高吞吐(分布式架构,可能会出现顺序上的混乱,比如统计1个小时内,可能在1小时的时候

    2024年03月11日
    浏览(84)
  • 为什么选择 Next.js 框架?

    Next.js 框架作为一种强大而受欢迎的工具,为开发人员提供了许多优势和便利。本文将探讨 Next.js 框架的优点,并解释为什么选择 Next.js 是一个明智的决策。 文档:https://nextjs.org/docs Next.js 框架提供了先进的服务端渲染(SSR)和静态生成(SSG)能力,使得我们能够在服务器上生

    2024年02月12日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包