分布式专题——14 RabbitMQ之集群实战 - 指南

news/2025/9/26 10:59:30/文章来源:https://www.cnblogs.com/tlnshuju/p/19113088

分布式专题——14 RabbitMQ之集群实战 - 指南

2025-09-26 10:57  tlnshuju  阅读(0)  评论(0)    收藏  举报

1 RabbitMQ的性能监控

  • RabbitMQ 的管理控制台为性能监控提供了直观的界面。在控制台的**Overview(概览)**页面,能看到诸多关键信息:

    在这里插入图片描述

    • Queued messages(队列消息):可查看最近一分钟内队列中的消息数量变化,包括Ready(就绪可消费的消息数)、Unacked(已投递但未确认的消息数)以及Total(消息总数);

    • Message rates(消息速率):展示各类消息操作的速率,像Publish(消息发布速率)、Deliver(消息投递速率)、Consumer ack(消费者确认速率)等;

    • 此外,还能了解消息的生产消费频率、关键组件(如连接、通道等)的使用情况。不过,管理控制台更适合人工查看和临时监控,若要构建自动化的性能监控系统,就需要借助 RabbitMQ 提供的 HTTP API;

  • RabbitMQ 提供了丰富的 HTTP API,用于更灵活、自动化地管理和监控 RabbitMQ,这些 API 文档可在部署的管理控制台页面下方找到;

    在这里插入图片描述

    • 认证与虚拟主机

      • API 使用 HTTP 基本认证,默认用户是guest/guest,访问时需提供 RabbitMQ 的用户名和密码;
      • 很多 API 需要指定虚拟主机(virtual host),默认虚拟主机是/,在路径中需编码为%2F
    • 请求与响应

      • 支持多种 HTTP 请求方法,如 GET 用于获取信息,POST 用于创建资源(如绑定、队列等),PUT 用于修改资源,DELETE 用于删除资源等;
      • 请求体通常为 JSON 格式,创建资源时,JSON 对象需包含必填字段,缺少必填字段会报错;多余字段会被忽略;
    • 查询参数

      • sortsort_reversesort指定排序的字段,sort_reverse设为true时可反转排序顺序,还可对字段子项进行排序(如sort=name按名称排序);
      • limit:用于限制返回结果的数量,便于分页或获取部分数据;
      • columns:可指定返回结果中包含的字段,减少返回数据量,提升性能,尤其在监控场景下能降低系统资源消耗;
    • 典型 API 示例http://[server]:[port]/api/overview,这是常用的 API 接口,能获取系统的资源使用情况等大量信息,可很好地对接 Prometheus、Grafana 等监控工具,构建灵活的监控告警体系;

    • 安全性考虑:由于这些 API 能通过不同类型的 HTTP 请求管理 RabbitMQ 的各种资源,所以在实际使用时,要考虑接口的安全性,比如限制 API 的访问权限、使用安全的认证方式等,防止未授权的访问和操作。

2 RabbitMQ的备份与恢复

3 使用联邦插件(Federation 插件)进行远程消息同步

3.1 插件的作用

3.2 使用步骤

3.2.1 启用插件

3.2.2 配置 Upstream(上游)

  • Upstream 表示上游的服务节点,在 RabbitMQ 里,它可以是一个交换机(Exchange),也可以是一个队列(Queue)。配置方式是由下游服务主动配置一个与上游服务的链接,之后数据就会从上游服务主动同步到下游服务中;

    在这里插入图片描述

  • 接下来用192.168.65.112上的的 RabbitMQ 服务来模拟 DownStream 下游服务,去指向192.168.65.193服务器上搭建的 RabbitMQ 服务,搭建一个联邦交换机 Federation Exchange;

    • 联邦交换器(Federated exchange):下游(Downstream)的联邦交换器链接到上游(Upstream)的交换器,同时上游会创建队列作为缓冲,用于将消息流式传输到下游交换器;

    • 首先在下游 RabbitMQ 中声明一个交换机和交换队列,用来接收远端(上游)的数据。这里直接用客户端 API 来快速进行声明:

      • 通过客户端 API 声明交换器(fed_exchange)和队列(fed_queue),并进行绑定;
      • 同时创建消费者来处理接收到的消息,以此来接收从上游同步过来的数据;
      public class DownStreamConsumer
      {
      public static void main(String[] args) throws IOException, TimeoutException {
      ConnectionFactory factory = new ConnectionFactory();
      factory.setHost("192.168.65.112");
      factory.setPort(5672);
      factory.setUsername("admin");
      factory.setPassword("admin");
      factory.setVirtualHost("/mirror");
      Connection connection = factory.newConnection();
      Channel channel = connection.createChannel();
      channel.exchangeDeclare("fed_exchange","direct");
      channel.queueDeclare("fed_queue",true,false,false,null);
      channel.queueBind("fed_queue","fed_exchange","routKey");
      Consumer myconsumer = new DefaultConsumer(channel) {
      @Override
      public void handleDelivery(String consumerTag, Envelope envelope,
      AMQP.BasicProperties properties, byte[] body)
      throws IOException {
      System.out.println("========================");
      String routingKey = envelope.getRoutingKey();
      System.out.println("routingKey >" + routingKey);
      String contentType = properties.getContentType();
      System.out.println("contentType >" + contentType);
      long deliveryTag = envelope.getDeliveryTag();
      System.out.println("deliveryTag >" + deliveryTag);
      System.out.println("content:" + new String(body, "UTF-8"));
      }
      };
      channel.basicConsume("fed_queue", true, myconsumer);
      }
      }
    • 然后在下游 RabbitMQ 服务中配置一个上游服务:

      General parameters(通用参数)

      • Virtual host:指定虚拟主机,如下图示例中的/mirror
      • Name:上游服务的名称,下图示例中为193 - fedexchange
      • URI:上游服务的连接地址,包含认证信息等,如下图amqp://admin:admin@192.16...
      • Prefetch count:预取消息的数量
      • Reconnect delay:重连延迟时间(单位:秒)
      • Acknowledgement Mode:确认模式,下图示例中为On confirm
      • Trust User-ID:是否信任用户 ID,下图示例中为No

      Federated exchanges parameters(联邦交换器参数)

      • Exchange:指定要联邦的交换器
      • Max hops:最大跳数,即消息能经过的联邦交换器的最大次数
      • Expires:联邦交换器的过期时间(单位:毫秒)
      • Message TTL:消息的生存时间(单位:毫秒)
      • Queue Type:队列类型

      Federated queues parameter(联邦队列参数)

      • Queue:指定要联邦的队列
      • Consumer tag:消费者标签

      在这里插入图片描述

      在这里插入图片描述

  • 注意:

    • Federated exchanges parameters(联邦交换器参数,用于指定上游的交换器)和 Federated queues parameters(联邦队列参数,用于指定上游的队列)如果不指定上游的 Exchange 或 Queue:

      • 就会使用上游中和下游(DownStream)中相同名称的 Exchange 和 Queue;
      • 如果上游里没有与下游相同名称的 Exchange 或 Queue,就会在上游中新建对应的 Exchange 和 Queue;
    • 关于虚拟主机的配置,如果在配置 Upstream 时指定了Virtual Host属性,那么在 URI 中就不能再添加 Virtual Host 配置了,要避免重复配置导致问题。

3.2.3 配置 Federation 策略

  • 需要配置一个指向上游服务的 Federation 策略,配置时可以选择针对 Exchange(交换机) 或者 Queue(队列) 来生效;

  • 下表展示了一个简化的 Federation 策略配置:

    在这里插入图片描述

    • Virtual Host/mirror,指定该策略作用的虚拟主机;

    • Name193-fed-policy,策略的名称,用于标识该策略;

    • Pattern^fed_*,匹配模式,这里表示匹配名称以 fed_ 开头的 Exchange 或 Queue(具体由 Apply to 决定);

    • Apply toexchanges,表示该策略应用于交换机(也可选择应用于队列);

    • Definitionfederation-upstream-set: all,策略的定义部分

      • federation-upstream-set 参数表示以集合的方式针对多个 Upstream(上游服务节点)生效,all 表示对全部 Upstream 生效;
      • 若使用 federation-upstream 参数,则表示只对某一个 Upstream 生效;
    • Priority0,策略的优先级,数值越大优先级越高,当存在多个策略时,优先级高的策略会被优先应用;

  • 注意:每个策略的 Definition 部分,至少需要指定一个 Federation 目标,以此来确定策略作用的上游服务范围等关键信息。

3.2.4 测试

4 RabbitMQ服务的高可用机制

4.1 RabbitMQ的集群机制

4.2 搭建普通集群

  • 准备工作

    • 服务器准备:准备三台服务器,分别命名为 worker1、worker2、worker3,在每台服务器上搭建 RabbitMQ 服务;

    • 域名映射调整:在三台服务器上修改 /etc/hosts 文件,添加 IP 与域名的映射,如下面指令。同时将每个节点的集群名调整为类似 rabbit@[worker1] 的形式;

      vi /etc/hosts
      192.168.65.193 192-168-65-193
      192.168.65.112 192-168-65-112
      192.168.65.170 192-168-65-170
  • 同步集群节点的 cookie。RabbitMQ 集群依赖 .erlang.cookie 文件(默认在 /var/lib/rabbitmq/ 目录下),该文件中的字符串需在集群所有节点上一致。接下来将 worker1 加入到 worker2 的 RabbitMQ 集群中,所以将 worker2 的 .erlang.cookie 文件分发到 worker1,同步时要注意文件权限:

    • 将文件所属用户调整为 rabbitmq,执行命令 chown rabbitmq:rabbitmq .erlang.cookie

    • 确保文件只有当前用户可读,执行 chmod 400 .erlang.cookie

  • 将节点加入集群。以将 worker2 加入 worker1 的集群为例:

    • 先确保 worker1 上的 RabbitMQ 服务正常启动;

    • 在 worker2 上执行 rabbitmqctl stop_app 停止应用;

    • 执行 rabbitmqctl join_cluster --ram rabbit@worker2,以 ram 节点(后续会讲解 ram 节点特性)的方式将 worker2 加入 worker1 的集群;

    • 再执行 rabbitmqctl start_app 启动应用;

    RabbitMQ 集群节点分为 disk 节点ram 节点

    • disk 节点:会将元数据(交换机、队列等的定义)保存到硬盘,数据安全性高,但与硬盘交互多,元数据操作性能相对低;
    • ram 节点:仅在内存中保存元数据,减少了与硬盘的交互,元数据操作性能较好,但数据安全性依赖于其他节点(若集群中只有 ram 节点,元数据可能丢失,导致集群停止后无法启动);
    • 补充说明:
      • 本集群中 worker1 和 worker3 以 ram 节点身份加入 worker2 集群,存在单点故障风险(若 worker2 崩溃,元数据可能丢失),企业部署时需在性能和安全性间平衡;
      • ram 节点的性能优势仅体现在元数据管理(如修改队列、交换机、虚拟主机等),与消息的生产和消费速度无关;
      • 官方不建议全部使用 ram 节点,推荐集群中至少有一个 disk 节点,保证元数据安全;
  • 集群状态查看

    • 可在 worker2 的 Web 管理界面查看集群节点情况;

    • 也可通过命令行 rabbitmqctl cluster_status 查看集群状态;

    • 实际项目中,通常建议搭建奇数台服务器的集群,因为这样的集群对官方推荐的 Quorum 队列更友好。

4.3 搭建镜像集群

  • 注意:需先完成普通集群的搭建,在此基础上再搭建镜像集群;

  • 在生产环境中,为减少 RabbitMQ 集群间的数据传输,配置镜像策略时会针对固定的虚拟主机(virtual host)进行配置;

    • 虚拟主机的作用:RabbitMQ 中的虚拟主机类似 MySQL 中的库,可针对每个虚拟主机配置不同权限、策略等,且不同虚拟主机的数据相互隔离;

    • 具体操作步骤

      • 先创建一个名为 /mirror 的虚拟主机,执行命令 rabbitmqctl add_vhost /mirror

      • 再添加对应的镜像策略,执行 rabbitmqctl set_policy ha-all --vhost "/mirror" "^" '{"ha-mode":"all"}'。这些配置也可在 Web 控制台或通过 HTTP API 操作;

        参数:

        pattern 是队列的匹配规则,^ 表示全部匹配;

        ha-mode 是关键参数,生产通常选 all,表示队列镜像到集群中的所有节点,新节点加入集群时,队列也会镜像到该节点;

        另外还有:

        exactly:需指定镜像节点数量,若集群节点数少于该数量,队列镜像到集群内所有节点;

        nodes:将队列镜像到指定节点,若指定队列不在集群中不会报错,声明队列时指定的镜像节点都不在则会创建在声明客户端节点上

  • 镜像集群的特性与生产场景

    • 消息同步特性:搭建好的镜像集群具备集群特性,在任何一个节点上发送消息,消息都会同时同步到各个节点中

    • 生产适用性:镜像模式的集群能满足大部分生产场景,虽然对系统资源消耗较高,但生产环境会预留资源,正常使用无问题。不过在做业务集成时,要注意队列数量不宜过多,且尽量避免 RabbitMQ 产生大量消息堆积;

  • 基于镜像集群的扩展运维。在实际企业部署时,常以 RabbitMQ 镜像队列为基础,增加运维手段进一步提高集群安全性和实用性:(了解)

    • 服务保活:用 keepalived 保证每个 RabbitMQ 的稳定性,某个节点的 RabbitMQ 服务崩溃时可及时重启;

    • 节点扩展与简化使用:增加 HA-proxy 做节点负载均衡,应用可像使用单点服务一样使用整个 RabbitMQ 集群。

4.4 Haproxy+Keepalived 高可用集群部署方案(了解)

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

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

相关文章

QT与Spring Boot通信:实现HTTP请求的完整指南 - 教程

QT与Spring Boot通信:实现HTTP请求的完整指南 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&qu…

全球知名的Java Web开发平台Vaadin上线慧都网!

近日,慧都科技正式与国际知名的企业级Java Web开发平台供应商Vaadin达成合作伙伴关系。双方的合作,不仅补强了慧都在前端与应用开发领域的能力,更标志着慧都在软件工程数字化方案版图上的进一步扩展与深化,也为中国…

C#实现与欧姆龙PLC通信

C#实现与欧姆龙PLC通信,整合了FINS-TCP协议实现和主流开发框架:一、通信方案选型对比协议类型 适用场景 开发复杂度 推荐库FINS-TCP 欧姆龙设备专用通信 中等 HslCommunicationModbus TCP 多品牌设备通用通信 高 NMo…

linux docker 配置外网拉镜像

1. 先安装代理 https://github.com/nelvko/clash-for-linux-install?tab=readme-ov-file 2. sudo mkdir -p /etc/systemd/system/docker.service.d sudo nano /etc/systemd/system/docker.service.d/http-proxy.c…

棋牌网站搭建平台wordpress 地区联动

1. 引言 之前的文章ABP入门系列(7)——分页实现讲解了如何进行分页展示,但其分页展示仅适用于前台web分页,在后台管理系统中并不适用。后台管理系统中的数据展示一般都是使用一些表格插件来完成的。这一节我们就使用BootstrapTab…

什么是跨网文件摆渡系统?IT运维效率提升300%的秘密武器

很多行业和企业为了保障核心数据安全,通常会采用网络隔离策略,将内网与外网,或内部子网(如测试网、生产网、办公网、研发网等)进行物理或逻辑隔离。隔离之后,就需要跨网文件摆渡系统来支撑业务的开展。但是受到网…

深入解析:PyTorch 神经网络工具箱核心内容

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

借助Aspose.Email,在 Python中创建事件日历

Aspose.Email for Python via .NET是一款款 Outlook SDK ,是快速、安全且开发人员友好的自动日历安排解决方案。借助它,您以编程方式创建会议/活动。在本指南中,我们将演示如何借助Aspose.Email使用 Python 创建。在…

实用指南:【JavaEE初阶】多线程重点知识以及常考的面试题-多线程进阶(三)

实用指南:【JavaEE初阶】多线程重点知识以及常考的面试题-多线程进阶(三)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-fam…

C++ map 和unordered_map 的区别

C++ map 和unordered_map 的区别C++中的map和unordered_map是两种常用的关联容器, 主要区别如下: 1. ‌底层实现‌ ‌ map‌:基于红黑树(自平衡二叉搜索树)实现,元素按键值自动排序 。 ‌unordered_map‌:基于哈…

快速建设网站免费视频教程网络黄页推广软件下载

什么是ELK ELK 并不是一个技术框架的名称,它其实是一个三位一体的技术名词,ELK 的每个字母都来自一个技术组件,分别是 Elasticsearch(简称 ES)、Logstash 和 Kibana。 三个技术组件是独立的,后两个被elast…

阿里云边缘安全加速ESA

最近要网站被攻击,需要安全产品进行防护,WAF又太贵,阿里云边缘安全加速ESA是个不错的选择。 而且最近搞活动,可以免费领取每月基础套餐,领取链接: http://s.tb.cn/e6.0Fu67m 测速效果还不错

本土项目管理工具Gitee如何助力企业数字化转型

本土项目管理工具Gitee如何助力企业数字化转型 在数字化转型的浪潮席卷各行各业的当下,项目管理工具已成为企业提升协作效率的关键基础设施。作为国内领先的一站式研发管理平台,Gitee凭借其全流程管理能力和深度本土…

广州企业建设网站设计网站做的工作步骤是

前言 关于什么是weak关键字可以去看看我以前的一篇博客:【OC】 属性关键字 weak原理 1. SideTable SideTable 这个结构体,前辈给它总结了一个很形象的名字叫引用计数和弱引用依赖表,因为它主要用于管理对象的引用计数和 weak 表。在 NSOb…

最新网站开发工具h5页面制作代码

一、前言大家都知道,基于Web端的测试的基础框架是需要Selenium做主要支撑的,这里边给大家介绍下Web测试核心之基于 Python 的 SeleniumSelenium 是用于测试 Web 应用程序用户界面 (UI) 的常用框架。它是一款用于运行端到端功能测试的超强工具。您可以使用…

哪个网站微博做的最好怎么将网站做成小程序

系统:ubuntu17.04数据库主要分文档型和服务型两类:文档型:如sqlite3 (17.04自带/usr/bin/sqlite3)就是一个文件,应用在移动端如手机,pad,家电等服务型:如mysql有服务端(存储数据)和客户端mysql数…

【英语启蒙动画合集】0基础宝宝必看的动画,超全!直接下载~

▼资源展示▼ 01 - SSS儿歌视频」 链接:https://pan.quark.cn/s/e7f58293918a 02 - Super Simple ABCs 自然拼读 链接:https://pan.quark.cn/s/7016192ad6f3 03- RAZ全部29个级别‼️‼️AA-Z(包含Z1 Z2)一定及时存…

基于OPC UA协议的SIMATIC PLC通信实现

一、系统架构设计 +-------------------+| 上位机(OPC UA Client) || (C#/Python/SCADA) |+--------+----------+|v +-------------------+ +-------------------+ | SIMATIC PLC | | OPC UA Serv…

Transformer模型/注意力机制/目标检测/语义分割/图神经网络/强化学习/生成式模型/自监督学习/物理信息神经网络等 - 指南

Transformer模型/注意力机制/目标检测/语义分割/图神经网络/强化学习/生成式模型/自监督学习/物理信息神经网络等 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !import…