RabbitMQ--扩展--11--均衡负载

2023-11-08

RabbitMQ–扩展–11–均衡负载


1、场景

面对大量业务访问、高并发请求,可以使用高性能的服务器来提升RabbitMQ服务的负载能力。当单机容量达到极限时,可以采取集群的策略来对负载能力做进一步的提升,但这里还存在一个负载不均衡的问题。

举例:如果一个集群中有3个节点,那么所有的客户端都与其中的某个节点nodel1建立TCP连接,那么nodel1的网络负载必然会大大增加而显得难以承受,其他节点又由于没有那么多的负载而造成硬件资源的浪费,所以负载均衡显得尤为重要。

对于RabbitMQ而言,客户端与集群建立的TCP连接不是与集群中所有的节点建立连接,而是挑选其中一个节点建立连接。如下图所示,在引入了负载均衡之后,各个客户端的连接可以分摊到集群的各个节点之中,进而避免了前面所讨论的缺陷。

在这里插入图片描述

2、负载均衡

2.1、定义

负载均衡是一种计算机网络技术,用于在多个计算机(计算机集群)、网络连接、CPU、磁盘驱动器或其他资源中分配负载,以达到最佳资源使用、最大化吞吐率、最小响应时间及避免过载的目的。

使用带有负载均衡的多个服务器组件,取代单一的组件,可以通过冗余提高可靠性。

2.2、负载均衡分类

  1. 软件负载均衡
    1. 服务端负载
    2. 客户端负载
  2. 硬件负载均

2.2.1、软件负载均衡

  1. 是指在一个或者多个交互的网络系统中的多台服务器上安装一个或多个相应的负载均衡软件来实现的一种均衡负载技术。
  2. 负载均衡软件 可以很方便地安装在服务器上,并且实现一定的均衡负载功能。
  3. 负载均衡软件 配置简单、操作也方便,最重要的是成本很低。

2.2.2、硬件负载均

  1. 是指在多台服务器间安装相应的负载均衡设备,也就是负载均衡器(如F5)来完成均衡负载技术
  2. 与软件负载均衡技术相比,能达到更好的负载均衡效果。
  3. 由于硬件负载均衡技术需要额外增加负载均衡器,成本比较高,所以适用于流量高的大型网站系统。

2.3、负载均衡算法

对于RabbitMQ 而言可以在客户端连接时简单地使用负载均衡算法来实现负载均衡。
负载均衡算法有很多种,主流的有以下几种。

2.3.1、轮训算法

将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载。

2.3.2、加权轮询法

不同的后端服务器的配置可能和当前系统的负载并不相同,因此它们的抗压能力也不相同。

  1. 给配置高、负载低的机器,配置更高的权重,让其处理更多的请求
  2. 给配置低、负载高的机器,配置较低的权重,降低其系统负载

加权轮询能很好地处理这一问题,并将请求顺序和权重分配到后端。

2.3.3、随机法

通过随机算法,根据后端服务器的列表大小值来随机选取其中的一台服务器进行访问。
由概率统计理论可以得知,随着客户端调用服务端的次数增多,其实际效果越来越接近于平均分配调用情况,也就是轮询的结果。

2.3.4、加权随机法

与加权轮询法一样,加权随机法也根据后端机器的配置、系统的负载分配不同权重。
不同的是,它按照权重随机请求后端服务器,而非顺序。

2.3.5、源地址后希法

源地址哈希的思想是根据获取的客户端IP 地址,通过啥希函数计算得到面一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是客户端要访问服务器的序号。

采用源地址哈希法进行负载均衡,同一IP 地址的客户端,当后端服务器列表不变时,它每次都会映射到同一台后端服务器进行访问。

2.3.6、最小连接数法

最小连接数算法比较灵活和智能,由于后端服务器的配置不尽相同,对于请求的处理有快有慢,它根据后端服务器当前的连接情况,动态地选取其中当前积压连接数最少的一台服务器来处理当前的请求,尽可能地提高后端服务的利用效率,将负载合理地分流到每一台服务器。

3、实现方式

3.1、使用HAProxy 实现负载均衡

HAProxy资料

https://blog.csdn.net/zhou920786312/category_11584732.html

在这里插入图片描述
在这里插入图片描述

3.2、使用Keepalived实现高可靠负载均衡

Keepalived资料

https://blog.csdn.net/zhou920786312/category_11276453.html

3.2.1、介绍

试想如果前面配置的HAProxy主机192.168.0.9突然宕机或者网卡失效,那么虽然RabbitMQ集群没有任何故障,但是对于外界的客户端来说所有的连接都会被断开,结果将是灾难性的。确保负载均衡服务的可靠性同样显得十分重要。这里就需要引入Keepalived 工具,它能够通过自身健康检查、资源接管功能做高可用(双机热备),实现故障转移。

Keepalived 采用VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)以软件的形式实现服务的热备功能。通常情况下是将两台Linux服务器组成一个热备组(Master 和Backup),同一时间内热备组只有一台主服务器Master提供服务,同时Master会虚拟出一个公用的虚拟IP地址,简称VIP。

这个VIP只存在于Master上并对外提供服务。如果Keepalived检测到Master宿机或者服务故障,备份服务器Backup会自动接管VIP 并成为Master,Keepalived将原Master从热备组中移除。当原Master恢复后,会自动加入到热备组,默认再抢占成为Master,起到故障转移的功能。

在这里插入图片描述

3.2.2、整条调用链路

  1. 客户端通过VIP建立通信链路
  2. 通信链路通过Keeaplived 的Master 节点路由到对应的HAProxy之上
  3. HAProxy 通过负载均衡算法将负载分发到集群中的各个节点之上。
    1. 正常情况下客户端的连接通过图11-12中左侧部分进行负载分发。
    2. 当Keepalived 的Master节点挂掉或者HAProxy挂掉无法恢复时,Backup提升为Master,客户端的连接通过图11-12 中右侧部分进行负载分发。

3.3、使用Keepalived+LVS 实现负载均衡

资料

https://blog.csdn.net/zhou920786312/category_11840630.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RabbitMQ--扩展--11--均衡负载 的相关文章

  • 组在 RabbitMQ 中接收消息,最好使用 Spring AMQP?

    我正在从服务 S 接收消息 该服务将每个单独的属性更改作为单独的消息发布到实体 一个人为的例子是这样的实体 Person id 123 name Something address 如果姓名和地址在同一交易中更新 则 S 将发布两条消息 P
  • 没有连接的 AMQP/RabbitMQ 通道什么时候会死亡?

    我有一个简单的 RabbitMQ 测试程序 随机将消息排队 另一个读取它们 所有这些都使用 Spring AMQP 如果消费者死亡 例如 在没有机会关闭其连接或通道的情况下终止进程 则它尚未确认的任何消息似乎将永远保持未确认状态 我看过很多
  • 在点网核心应用程序中使用 RabbitMQ 跳过 MassTransit 中的队列

    我有三个项目 一个是Dot net core MVC 两个是API项目 MVC 正在调用一个 API 来获取用户详细信息 当询问用户详细信息时 我通过 MassTransit 向队列发送消息 我看到跳过队列 第三个项目中有消费者 即API项
  • 如何禁用 RabbitMQ 默认 tcp 监听端口 - 5672

    我已经配置了RabbitMQrabbitmq config具有新端口号的文件 即带有 SSL 的 5671 现在我想禁用默认端口 即 5672 配置文件如下 rabbit ssl listeners 5671 ssl options cac
  • Spring AMQP Java 客户端中的队列大小

    我使用 Spring amqp 1 1 版本作为我的 java 客户端 我有一个大约有 2000 条消息的队列 我想要一个服务来检查这个队列大小 如果它是空的 它会发出一条消息说 所有项目已处理 我不知道如何获取当前队列大小 请帮忙 我用谷
  • 何时使用 RabbitMQ 铲子以及何时使用 Federation 插件?

    对于我工作的公司 我们希望使用 RabbitMQ 作为我们的主要消息总线 我们的想法是 每个应用程序都使用自己的虚拟主机进行内部通信 并且通过 shovel 或联合插件 我们可以在多个虚拟主机 甚至可能是多台机器 非集群 之间共享某些类型的
  • 列出与rabbitmq java客户端API交换的绑定

    我似乎在文档中找不到任何信息 所以我想知道是否可以通过某种方式使用 java RabbitMQ API 获取与交换相关的所有绑定 我在查询 api bindings 时正在寻找类似 http api 结果的内容 api definition
  • RabbitMQ C# API:如何检查绑定是否存在?

    使用 RabbitMQ C API 我如何检查给定队列到给定交换是否存在绑定 很多 RabbitMQ 调用都是幂等的 所以有些人可能会说在这些情况下检查是不必要的 但我认为它们在测试中很有用 您可以使用他们的 REST API 来调用并查看
  • 每次发布后我应该关闭通道/连接吗?

    我在 Node js 中使用 amqplib 但我不清楚代码中的最佳实践 基本上 我当前的代码调用amqp connect 当 Node 服务器启动时 然后为每个生产者和每个消费者使用不同的通道 而不会真正关闭它们中的任何一个 我想知道这是
  • 无法在Windows上启用rabbitmq管理插件

    所以 这就是我所做的 在我的 Windows x64 位机器上安装了 Erlang 安装 RabbitMQ 启动 RabbitMQ 服务 这一步我没有任何错误 但是 当我尝试启用rabbitmq management时 我在控制台中收到一些
  • RabbitMQ 启动失败

    RabbitMQ Windows 服务将无法启动 C Program Files x86 RabbitMQ Server rabbitmq server 3 0 4 sbin gt rabbitmq service bat start C
  • Django、RabbitMQ 和 Celery - 为什么在我更新开发中的 Django 代码后,Celery 会运行旧版本的任务?

    所以我有一个 Django 应用程序 它偶尔会向 Celery 发送任务以进行异步执行 我发现 当我在开发中处理代码时 Django 开发服务器知道如何自动检测代码何时发生更改 然后重新启动服务器 以便我可以看到我的更改 然而 我的应用程序
  • 为什么需要消息队列来与 Web 套接字聊天?

    我在互联网上看到了很多使用 Web 套接字和 RabbitMQ 进行聊天的示例 https github com videlalvaro rabbitmq chat https github com videlalvaro rabbitmq
  • 死信交换 RabbitMQ 丢弃消息

    我正在尝试在 RabbitMQ 中实现 dlx 队列 场景很简单 我有 2 个队列 1 活着 2 死亡 x dead letter exchange 立即 x message ttl 5000 以及 立即 交换 这必然是 1 活着 我尝试运
  • springrabbitmq:无法将id设置为属性?

    我有一个属性文件 其中包含队列 其值为queue name 如果我在其他请使用该属性 那么它可以工作 但如果我在 id 上使用它 那么它会失败
  • 即使设置了 cookie,RabbitMQ 身份验证也会失败

    我最近在运行 lattePanda 的 Windows 10 上安装了带有 ErlanOTP 的rabbitmq 我运行rabbitmqctl status并收到以下错误 C Program Files RabbitMQ Server ra
  • MassTransit 生成我想忽略的_skipped 队列

    任何人都可以猜出问题是什么 因为我不知道如何解决这个问题 大众运输产生 skipped队列 我不知道为什么它会生成这些队列 它是在执行发布请求响应时生成的 请求客户端是使用 MassTransit RequestClientExtensio
  • RabbitMQ - 如何死信/处理过期队列中的消息?

    我有一个队列x expires放 我遇到的问题是我需要对队列中的消息进行进一步处理IF队列过期 我最初的想法是设置x dead letter exchange在队列中 但是 当队列过期时 消息就会消失而不会进入死信交换 如何处理死信或以其他
  • RabbitMQ:如何创建和恢复备份

    我是 RabbitMQ 的新手 我需要一些帮助 如何备份和恢复到RabbitMQ 以及我需要保存哪些重要数据 谢谢 如果您安装了管理插件 您可以在Overview页 在底部你会看到导入 导出定义您可以使用它来下载代理的 JSON 表示形式
  • 从 RabbitMQ 迁移到 Amazon SQS [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我们的初创公司目前正在使用RabbitMQ with Python Django 对于消息队列 现在我们计划转移到Amazon SQS其高可用性

随机推荐

  • JSP

    jsp简介 1 JSP Java Server Pages 是JavaWeb服务器端的动态资源 它与html页面的作用是相同的 显示数据和获取数据 2 jsp 作为请求发起页面 例如显示表单 超链接 作为请求结束页面 例如显示数据 3 Se
  • 【华为OD机试】跳格子2【2023 B卷

    华为OD机试 真题 点这里 华为OD机试 真题考点分类 点这里 题目描述 小明和朋友玩跳格子游戏 有 n 个连续格子组成的圆圈 每个格子有不同的分数 小朋友可以选择从任意格子起跳 但是不能跳连续的格子 不能回头跳 也不能超过一圈 给定一个代
  • go语言操作Redis详细步骤

    前言 导入开源库 操作字符串 package main import fmt github com garyburd redigo redis func main 通过 go 向 redis 写入和读取数据 1 连接到redis conn
  • TLS协议分析

    TLS协议分析 2015 09 06 本文目标 学习鉴赏TLS协议的设计 透彻理解原理和重点细节 跟进一下密码学应用领域的历史和进展 整理现代加密通信协议设计的一般思路 本文有门槛 读者需要对现代密码学有清晰而系统的理解 建议花精力补足背景
  • [github项目]基于百度地图二次开发实现的车辆监管(包含车辆定位、车辆图片和方向控制,电子围栏,图形绘制等功能)前端实现(不包含后端实现)...

    前言 基于百度地图javascript版本开发 百度地图中所用的key已承诺仅用于测试 不用于商业用途 注 本文所有代码可以到github上进行下载 github地址 http map eguid cc 已经封装好的功能 基于百度地图二次开
  • Matlab Babble噪声

    问题 我们在做语音相关实验的时候可能需要用到Babble噪声 解决 可以从该链接下载babble噪声 截取我们所需要的长度 设置信噪比 进行加噪 上代码 load babble mat 导入babble文件 voicepath M5 wav
  • 随机生成几位字母加数字的混合字符串

    日常开发中 我们可能需要一些随机字符串做测试 可能是4位 也可能是8位 如下是一个随机生成8位字符串的工具类 可根据需要 改成自己的需要的 import java util Random public class RandomGenerat
  • mysql 设置 utc_关于时间:MySQL应该将其时区设置为UTC吗?

    跟随问题HTTPS serverfault com questions 191331 should servers have their timezone set to GMT UTC 应将神秘的时间带设置到UTC 还是应设置为服务器或PH
  • 期货开户不要孤注一掷

    一 在没有稳定盈利之前 特别是新手 尽可能少入金 建议不要超过1万 每次只做一手 因为新手没有不亏的 投的多 就意味着亏的多 持续稳定盈利再多投入 才是上策 许多新手一两周就亏几万几十万的 等明白期货的凶险 已经晚了 下单后 连续三天很纠结
  • [已解决] wget命令出现Unable to establish SSL connection.错误

    文章目录 解决 从linux上下载mysql 包时 wget https downloads mysql com archives get p 23 file mysql 5 6 46 linux glibc2 12 x86 64 tar
  • qt 中 file generation failure: unable to create the directory

    原因 不能将qt的项目工程安装到qt软件的安装目录中 如 opt 的目录中 解决 应该使用当前系统的普通用户的目录中建立项目目录 如 home chenfan QT myprojects
  • 数据分析概述和理论基础

    2018 03 26 Python开发者交流平台 什么是数据分析 数据分析 是指用适当的统计分析方法对收集来的大量数据进行分析 提取有用信息和形成结论 而对数据加以详细研究和概括总结的过程 为什么会有数据分析 随着计算机技术 互联网技术 数
  • Linux---用户的权限

    专栏 Linux 个人主页 HaiFan 本章为大家带来用户的权限的讲解 用户的权限 Linux权限的概念 权限的三类对象 权限的三种类型 权限设置chmod chown chgrp 更改权限chmod chown chgrp umask
  • Atcoder Beginner Contest 164 D

    题意 给定一个只包含数字字符且不包含 0 0 0字符的字符串 S S S 问有子串组成的十位数是 2019 2019
  • QListView的使用

    一 介绍 QListView可以用来以列表的形式展示数据 在Qt中使用model View结构来管理数据与视图的关系 model负责数据的存取 数据的交互则通过delegate来实现 二 model QT提供了一些现成的models用于处理
  • drools规则引擎初探

    1 drools是什么 Drools是为Java量身定制的基于Charles Forgy的RETE算法的规则引擎的实现 具有了OO接口的RETE 使得商业规则有了更自然的表达 Rule是什么呢 一条规则是对商业知识的编码 一条规则有 att
  • Java中Set的使用

    在Java中使用Set 可以方便地将需要的类型以集合类型保存在一个变量中 主要应用在显示列表 Set是一个不包含重复元素的 collection 更确切地讲 set 不包含满足 e1 equals e2 的元素对 e1 和 e2 并且最多包
  • 如何修改桌面的存放路径?(将桌面放到D盘或E盘)

    方法1 使用超级兔子 依次选择 魔法设置 系统 系统文件夹 桌面 就可以自定义桌面项的路径了 方法2 首先要在 开始 运行 内输入 regedit 打开注册表编辑器 然后要在 文件 下拉菜单中 的 导出 功能备份好注册表 以防万一 接着在左
  • 学习笔记——Java入门第二季

    1 1 介绍类与对象 类和对象的关系 时间万物皆对象 对象是具体的事物 是类的具体事例 类是抽象的概念 是对象的模板 new关键字是创建实例对象最重要的标志 Dog duoduo new Dog Dog lucky new Dog 这样就创
  • RabbitMQ--扩展--11--均衡负载

    RabbitMQ 扩展 11 均衡负载 1 场景 面对大量业务访问 高并发请求 可以使用高性能的服务器来提升RabbitMQ服务的负载能力 当单机容量达到极限时 可以采取集群的策略来对负载能力做进一步的提升 但这里还存在一个负载不均衡的问题