当前位置: 首页 > news >正文

深入解析:RabbitMQ---集群搭建(HAProxy负载均衡高可用)

提示:本次搭建只是rabbitmq服务的高可用负载均衡而不是rabbitmq消息的高可用负载均衡

文章目录

  • 前言
    • RabbitMQ 集群 + HAProxy 高可用架构介绍
    • 1️⃣ RabbitMQ 集群概念
      • 节点类型
      • 集群特点
    • 2️⃣ HAProxy 在 RabbitMQ 集群中的作用
      • 目的
        • - 负载均衡:
        • - 高可用:
        • - 统一管理界面入口:
      • 逻辑架构
        • 具体作用如下:
        • 总结说明:
      • HAProxy 工作模式
    • 3️⃣ RabbitMQ 集群与 HAProxy 的高可用原理
      • 1.客户端透明访问
      • 2.节点健康检测
      • 3.队列高可用
      • 4.管理界面高可用
    • 4️⃣ 架构优势
    • 5️⃣ 注意事项
      • 1.Erlang Cookie 必须一致,否则节点无法加入集群
      • 2.队列高可用策略:
      • 3.HAProxy 健康检查配置:
      • 4.客户端重试机制:
      • 5.防火墙与端口映射:
  • 一、环境准备
  • 二、修改主机名换、配置Hosts
    • 2.1.修改主机名称
    • 2.2.配置Hosts
  • 三、三台机器同时安装Rabbitmq
  • 四、安装HAProxy
    • 4.1、HAProxy 安装在node1服务器上
  • 五、搭建 RabbitMQ Server 高可用集群
    • 5.1、将node2和node3 关闭节点和应用
    • 5.2、将node1服务器中的.erlang.cookie文件,拷贝到node2&&node3服务器上,保证相同的Erlang Cookie
    • 5.3、node2和node3上查看erlang.cookie文件然后重新启动节点和应用
    • 5.4、node2、node3执行----将node2和node3节点加入到node1集群
    • 5.5、使用rabbitmqctl cluster_status命令查看各个节点集群状态
      • 5.5.1、在node1执行查看状态
      • 5.5.2、在node2执行查看状态
      • 5.5.3、在node3执行查看状态
  • 六、在node1节点配置HAProxy
    • 6.1、copy配置文件并修改
    • 6.2、启动 HAProxy:
  • 七、负载均衡web显示
    • 7.1、通过访问http://122.152.208.19:8100/stats,查看 HAProxy 负载均衡信息:
    • 7.2、通过访问http://122.152.208.19:8101,查看rabbitmq的集群信息
  • 总结
    • - RabbitMQ 集群提供 消息高可用 + 队列复制
    • - HAProxy 提供 统一入口 + 负载均衡 + 健康检测
    • - 结合后,系统能保证 客户端访问透明、高可用、管理界面集中


前言

RabbitMQ 集群 + HAProxy 高可用架构介绍

1️⃣ RabbitMQ 集群概念

节点类型

集群特点

  • 统一的逻辑集群:多节点组成一个集群,节点间共享元数据和队列信息
  • 节点发现:节点通过 Erlang Cookie 和节点名相互识别
  • 分布式队列:队列可选择是否镜像到多个节点(mirrored queue)
  • 高可用性:
    – – 队列可复制到多节点
    – – 某个节点挂掉时,客户端可以自动切换到其他节点

2️⃣ HAProxy 在 RabbitMQ 集群中的作用

目的

- 负载均衡:
- 高可用:
  • HAProxy 定期健康检查节点
  • 如果某个节点不可用,自动剔除,客户端不会连接到宕机节点
- 统一管理界面入口:

逻辑架构

在这里插入图片描述
注意:在 RabbitMQ 集群 中,端口 25672 是用于 节点间通信(Erlang distribution) 的专用端口。

具体作用如下:
端口作用默认协议
8100HAProxy 监控页面(访问地址如:http://node1:8100/stats,账号:admin/admin)HTTP
8101RabbitMQ 服务(AMQP 客户端)负载均衡入口,由 HAProxy 代理到各节点的 5672 端口TCP
8102RabbitMQ Web 管理界面负载均衡入口,由 HAProxy 代理到各节点的 15672 端口HTTP
5672RabbitMQ AMQP 通信端口(客户端连接消息队列)TCP
15672RabbitMQ Web 管理界面端口(单节点访问用)HTTP
25672RabbitMQ 集群节点间通信(Erlang 分布式协议)TCP
总结说明:
  • 8100、8101、8102 是 HAProxy 提供的统一入口端口,对外暴露,分别用于监控、消息队列和管理界面访问。

  • 5672、15672、25672 是 RabbitMQ 自身的内部端口,用于客户端连接、管理和节点间通信。

HAProxy 工作模式

功能模式端口描述
stats 页面HTTP8100监控 HAProxy 状态、节点健康
管理界面HTTP8101负载均衡访问 RabbitMQ 节点 15672
AMQP 客户端TCP8102负载均衡访问 RabbitMQ 节点 5672

3️⃣ RabbitMQ 集群与 HAProxy 的高可用原理

1.客户端透明访问

2.节点健康检测

  • HAProxy 定期 check 各节点端口
  • 节点宕机 → 自动剔除 → 负载均衡只分发到健康节点

3.队列高可用

4.管理界面高可用

  • RabbitMQ Web UI 默认监听 15672
  • HAProxy 8101 端口负载均衡到各节点的 15672
  • 管理员可通过单一入口查看整个集群状态

4️⃣ 架构优势

优势说明
高可用性节点挂掉,HAProxy 剔除,队列镜像保证消息不丢失
负载均衡客户端请求均匀分布到集群节点,避免单节点过载
统一入口AMQP 客户端和 Web UI 通过单一 HAProxy 端口访问
易运维stats 页面查看 HAProxy 与节点状态,便于运维

5️⃣ 注意事项

1.Erlang Cookie 必须一致,否则节点无法加入集群

2.队列高可用策略:

  • 不开启镜像 → 节点挂掉可能丢失消息
  • 开启镜像 → 网络带宽和存储消耗增加

3.HAProxy 健康检查配置:

4.客户端重试机制:

  • 即使 HAProxy 健康检查剔除了节点,客户端也可能缓存旧节点信息

5.防火墙与端口映射:


提示:以下是本篇文章正文内容,下面案例可供参考

一、环境准备

主机名称公网IP内网IP系统服务
node1122.152.208.19172.17.48.15Centos8Rabbitmq、HAProxy
node249.235.24.247172.17.48.123Centos8Rabbitmq
node31.15.25.123172.17.48.107Centos8Rabbitmq

二、修改主机名换、配置Hosts

2.1.修改主机名称

hostnamectl set-hostname node1
hostnamectl set-hostname node2
hostnamectl set-hostname node3

2.2.配置Hosts

三台机器同时修改
echo "122.152.208.19 node1" >> /etc/hosts
echo "49.235.106.214 node2" >> /etc/hosts
echo "110.40.181.62 node3" >> /etc/hosts

三、三台机器同时安装Rabbitmq

-------------------------------------------------------------------请点击查看安装Rabbitmq方法-------------------------------------------------------------------------

四、安装HAProxy

4.1、HAProxy 安装在node1服务器上

[root@node1 ~]# yum -y install haproxy

五、搭建 RabbitMQ Server 高可用集群

注意:一定要注意关启服务的顺序,否则很可能会报错!!!

5.1、将node2和node3 关闭节点和应用

[root@node2 ~]# /sbin/service rabbitmq-server stop
[root@node3 ~]# /sbin/service rabbitmq-server stop

5.2、将node1服务器中的.erlang.cookie文件,拷贝到node2&&node3服务器上,保证相同的Erlang Cookie

[root@node1 ~]# find / -name ".erlang.cookie"
/var/lib/rabbitmq/.erlang.cookie
[root@node1 ~]# cat /var/lib/rabbitmq/.erlang.cookie
ZRRNSMYOZZFTLBARYSWZ
[root@node1 rabbitmq]# scp /var/lib/rabbitmq/.erlang.cookie root@172.17.48.123:/var/lib/rabbitmq
[root@node1 rabbitmq]# scp /var/lib/rabbitmq/.erlang.cookie root@172.17.48.107:/var/lib/rabbitmq

5.3、node2和node3上查看erlang.cookie文件然后重新启动节点和应用

[root@node2 rabbitmq]# cat /var/lib/rabbitmq/.erlang.cookie
ZRRNSMYOZZFTLBARYSWZ
[root@node3 rabbitmq]# cat /var/lib/rabbitmq/.erlang.cookie
ZRRNSMYOZZFTLBARYSWZ
[root@node2 ~]# /sbin/service rabbitmq-server start
[root@node3 ~]# /sbin/service rabbitmq-server start

5.4、node2、node3执行----将node2和node3节点加入到node1集群

rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@node1
rabbitmqctl start_app

5.5、使用rabbitmqctl cluster_status命令查看各个节点集群状态

5.5.1、在node1执行查看状态

[root@node1 rabbitmq]# rabbitmqctl cluster_status
Cluster status of node rabbit@node1 ...
Basics
Cluster name: rabbit@node1
Total CPU cores available cluster-wide: 6
Disk Nodes
rabbit@node1
rabbit@node2
rabbit@node3
Running Nodes
rabbit@node1
rabbit@node2
rabbit@node3
Versions
rabbit@node1: RabbitMQ 3.13.7 on Erlang 26.2.5.4
rabbit@node2: RabbitMQ 3.13.7 on Erlang 26.2.5.4
rabbit@node3: RabbitMQ 3.13.7 on Erlang 26.2.5.4
CPU Cores
Node: rabbit@node1, available CPU cores: 2
Node: rabbit@node2, available CPU cores: 2
Node: rabbit@node3, available CPU cores: 2
Maintenance status
Node: rabbit@node1, status: not under maintenance
Node: rabbit@node2, status: not under maintenance
Node: rabbit@node3, status: not under maintenance
Alarms
(none)
Network Partitions
(none)
Listeners
Node: rabbit@node1, interface: 0.0.0.0, port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@node1, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@node1, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@node2, interface: 0.0.0.0, port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@node2, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@node2, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@node3, interface: 0.0.0.0, port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@node3, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@node3, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Feature flags
Flag: classic_mirrored_queue_version, state: enabled
Flag: classic_queue_type_delivery_support, state: enabled
Flag: detailed_queues_endpoint, state: enabled
Flag: direct_exchange_routing_v2, state: enabled
Flag: drop_unroutable_metric, state: enabled
Flag: empty_basic_get_metric, state: enabled
Flag: feature_flags_v2, state: enabled
Flag: implicit_default_bindings, state: enabled
Flag: khepri_db, state: disabled
Flag: listener_records_in_ets, state: enabled
Flag: maintenance_mode_status, state: enabled
Flag: message_containers, state: enabled
Flag: message_containers_deaths_v2, state: enabled
Flag: quorum_queue, state: enabled
Flag: quorum_queue_non_voters, state: enabled
Flag: restart_streams, state: enabled
Flag: stream_filtering, state: enabled
Flag: stream_queue, state: enabled
Flag: stream_sac_coordinator_unblock_group, state: enabled
Flag: stream_single_active_consumer, state: enabled
Flag: stream_update_config_command, state: enabled
Flag: tracking_records_in_ets, state: enabled
Flag: user_limits, state: enabled
Flag: virtual_host_metadata, state: enabled

5.5.2、在node2执行查看状态

[root@node2 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@node2 ...
Basics
Cluster name: rabbit@node2
Total CPU cores available cluster-wide: 6
Disk Nodes
rabbit@node1
rabbit@node2
rabbit@node3
Running Nodes
rabbit@node1
rabbit@node2
rabbit@node3
Versions
rabbit@node2: RabbitMQ 3.13.7 on Erlang 26.2.5.4
rabbit@node1: RabbitMQ 3.13.7 on Erlang 26.2.5.4
rabbit@node3: RabbitMQ 3.13.7 on Erlang 26.2.5.4
CPU Cores
Node: rabbit@node2, available CPU cores: 2
Node: rabbit@node1, available CPU cores: 2
Node: rabbit@node3, available CPU cores: 2
Maintenance status
Node: rabbit@node2, status: not under maintenance
Node: rabbit@node1, status: not under maintenance
Node: rabbit@node3, status: not under maintenance
Alarms
(none)
Network Partitions
(none)
Listeners
Node: rabbit@node2, interface: 0.0.0.0, port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@node2, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@node2, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@node1, interface: 0.0.0.0, port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@node1, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@node1, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@node3, interface: 0.0.0.0, port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@node3, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@node3, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Feature flags
Flag: classic_mirrored_queue_version, state: enabled
Flag: classic_queue_type_delivery_support, state: enabled
Flag: detailed_queues_endpoint, state: enabled
Flag: direct_exchange_routing_v2, state: enabled
Flag: drop_unroutable_metric, state: enabled
Flag: empty_basic_get_metric, state: enabled
Flag: feature_flags_v2, state: enabled
Flag: implicit_default_bindings, state: enabled
Flag: khepri_db, state: disabled
Flag: listener_records_in_ets, state: enabled
Flag: maintenance_mode_status, state: enabled
Flag: message_containers, state: enabled
Flag: message_containers_deaths_v2, state: enabled
Flag: quorum_queue, state: enabled
Flag: quorum_queue_non_voters, state: enabled
Flag: restart_streams, state: enabled
Flag: stream_filtering, state: enabled
Flag: stream_queue, state: enabled
Flag: stream_sac_coordinator_unblock_group, state: enabled
Flag: stream_single_active_consumer, state: enabled
Flag: stream_update_config_command, state: enabled
Flag: tracking_records_in_ets, state: enabled
Flag: user_limits, state: enabled
Flag: virtual_host_metadata, state: enabled

5.5.3、在node3执行查看状态

[root@node3 rabbitmq]# rabbitmqctl cluster_status
Cluster status of node rabbit@node3 ...
Basics
Cluster name: rabbit@node3
Total CPU cores available cluster-wide: 6
Disk Nodes
rabbit@node1
rabbit@node2
rabbit@node3
Running Nodes
rabbit@node1
rabbit@node2
rabbit@node3
Versions
rabbit@node3: RabbitMQ 3.13.7 on Erlang 26.2.5.4
rabbit@node1: RabbitMQ 3.13.7 on Erlang 26.2.5.4
rabbit@node2: RabbitMQ 3.13.7 on Erlang 26.2.5.4
CPU Cores
Node: rabbit@node3, available CPU cores: 2
Node: rabbit@node1, available CPU cores: 2
Node: rabbit@node2, available CPU cores: 2
Maintenance status
Node: rabbit@node3, status: not under maintenance
Node: rabbit@node1, status: not under maintenance
Node: rabbit@node2, status: not under maintenance
Alarms
(none)
Network Partitions
(none)
Listeners
Node: rabbit@node3, interface: 0.0.0.0, port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@node3, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@node3, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@node1, interface: 0.0.0.0, port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@node1, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@node1, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@node2, interface: 0.0.0.0, port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@node2, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@node2, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Feature flags
Flag: classic_mirrored_queue_version, state: enabled
Flag: classic_queue_type_delivery_support, state: enabled
Flag: detailed_queues_endpoint, state: enabled
Flag: direct_exchange_routing_v2, state: enabled
Flag: drop_unroutable_metric, state: enabled
Flag: empty_basic_get_metric, state: enabled
Flag: feature_flags_v2, state: enabled
Flag: implicit_default_bindings, state: enabled
Flag: khepri_db, state: disabled
Flag: listener_records_in_ets, state: enabled
Flag: maintenance_mode_status, state: enabled
Flag: message_containers, state: enabled
Flag: message_containers_deaths_v2, state: enabled
Flag: quorum_queue, state: enabled
Flag: quorum_queue_non_voters, state: enabled
Flag: restart_streams, state: enabled
Flag: stream_filtering, state: enabled
Flag: stream_queue, state: enabled
Flag: stream_sac_coordinator_unblock_group, state: enabled
Flag: stream_single_active_consumer, state: enabled
Flag: stream_update_config_command, state: enabled
Flag: tracking_records_in_ets, state: enabled
Flag: user_limits, state: enabled
Flag: virtual_host_metadata, state: enabled

六、在node1节点配置HAProxy

6.1、copy配置文件并修改

[root@node1 rabbitmq]# cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak
[root@node1 rabbitmq]# vi /etc/haproxy/haproxy.cfg  #删除以前代码并添加以下代码
global
log     127.0.0.1 local0 info
log     127.0.0.1 local1 notice
daemon
maxconn 4096
defaults
log     global
mode    tcp
option  tcplog
option  dontlognull
retries 3
option  abortonclose
maxconn 4096
timeout connect  5000ms
timeout client   3000ms
timeout server   3000ms
balance roundrobin
# HAProxy stats 页面
listen private_monitoring
bind 0.0.0.0:8100
mode http
option httplog
stats refresh 5s
stats uri /stats
stats realm Haproxy
stats auth admin:admin
# RabbitMQ 管理界面(Web UI,HTTP,负载均衡端口 8101)
listen rabbitmq_admin
bind 0.0.0.0:8101
mode http
option httplog
balance roundrobin
# 转发到 RabbitMQ 管理端口 15672
server node1 node1:15672 check
server node2 node2:15672 check
server node3 node3:15672 check
# RabbitMQ AMQP 服务(5672,TCP,负载均衡端口 8102)
listen rabbitmq_cluster
bind 0.0.0.0:8102
mode tcp
option tcplog
balance roundrobin
timeout client 3h
timeout server 3h
# 转发到 RabbitMQ 节点 AMQP 端口 5672
server node1 node1:5672 check inter 5000 rise 2 fall 3
server node2 node2:5672 check inter 5000 rise 2 fall 3
server node3 node3:5672 check inter 5000 rise 2 fall 3

6.2、启动 HAProxy:

[root@node1 rabbitmq]# haproxy -f /etc/haproxy/haproxy.cfg
关闭HAProxy话就直接杀掉进程
[root@node1 rabbitmq]# ps aux | grep haproxy
kill -9 进程号

七、负载均衡web显示

HAProxy 配置了三个地址:
http://122.152.208.19:8100/stats:HAProxy 负载均衡信息地址,账号密码:admin/admin。
http://122.152.208.19:8101:RabbitMQ Server Web 管理界面(基于负载均衡)。
http://122.152.208.19:8102:RabbitMQ Server 服务地址(基于负载均衡)。

7.1、通过访问http://122.152.208.19:8100/stats,查看 HAProxy 负载均衡信息:

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

7.2、通过访问http://122.152.208.19:8101,查看rabbitmq的集群信息

在这里插入图片描述
在这里插入图片描述
在每次点击刷新时下图中会切换到每个节点上,从而达到一个负载均衡的效果,即使停掉node3节点他也会在node1和node2节点上切换
在这里插入图片描述


总结

- RabbitMQ 集群提供 消息高可用 + 队列复制

- HAProxy 提供 统一入口 + 负载均衡 + 健康检测

- 结合后,系统能保证 客户端访问透明、高可用、管理界面集中

http://www.jsqmd.com/news/295188/

相关文章:

  • 多邻国第五阶段第13部分
  • s7-1500plc与modbustcp通讯错误报16#80c8
  • 试卷中的英文
  • 深度学习篇---图像分割任务
  • 深度学习篇---图像分类任务
  • 直觉模糊不确定性建模与应用【附代码】
  • 学霸同款2026 TOP10 AI论文写作软件:专科生毕业论文必备测评
  • GPS天线TVS选型指南:超低电容是关键
  • ESD 二极管 vs TVS 二极管 深度解析:定义、原理、特性、选型与应用
  • 2026最新YOLO26改进:卷积层、轻量化、注意力机制、损失函数、Backbone、SPPF、Neck、检测头全方位优化汇总
  • 基于猴子算法的排序
  • 英语歌词学习
  • AI编码工具Skills.md全网资源检索报告【商业化产品需求分析、竞品分析和可行性研究】
  • 【计算机毕业设计案例】基于springboot的眼科医院管理系统基于SpringBoot+Vue的眼科患者随访管理系统(程序+文档+讲解+定制)
  • 【计算机毕业设计案例】基于Spring Boot+ Vue的网上超市购物系统的设计与实现基于springboot的线上超市购物管理系统的设计与实现(程序+文档+讲解+定制)
  • Java计算机毕设之基于springboot的线上超市购物管理系统基于SpringBoot的网上购物超市商城管理系统(完整前后端代码+说明文档+LW,调试定制等)
  • 毕业论文开题报告优化指南:精选9款AI工具与模板修改方法
  • Java毕设项目:基于springboot的线上超市购物管理系统的设计与实现(源码+文档,讲解、调试运行,定制等)
  • 探索大数据领域 HDFS 的数据治理方案
  • 毕业论文开题报告智能修改:9款AI工具应用实践指南
  • 【毕业设计】基于springboot的线上超市购物管理系统的设计与实现(源码+文档+远程调试,全bao定制等)
  • 9个AI技术支持的开题报告模板修改工具对比与使用建议
  • 【课程设计/毕业设计】基于springboot的大型超市购物管理系统基于springboot的线上超市购物管理系统的设计与实现【附源码、数据库、万字文档】
  • Java毕设项目推荐-基于SpringBoot+Vue的眼科患者随访管理系统基于springboot的眼科医院管理系统的设计与实现【附源码+文档,调试定制服务】
  • 人群仿真软件:SimWalk_(18).仿真项目管理与最佳实践
  • 高效完成开题报告:9款人工智能写作工具与模板修改技巧
  • Java毕设项目推荐-基于SpringBoot的网上超市系统的设计与实现基于springboot的线上超市购物管理系统的设计与实现【附源码+文档,调试定制服务】
  • 学术写作智能化:9种AI工具组合优化毕业论文开题报告
  • 智能写作方案:9款AI工具辅助修改毕业论文开题报告模板
  • Java毕设选题推荐:基于Spring Boot的眼科健康管理与咨询系统设计与实现基于springboot的眼科医院管理系统的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】