RabbitMQ---集群搭建(HAProxy负载均衡高可用)

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

文章目录


前言

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

1️⃣ RabbitMQ 集群概念

🔹 节点类型

  • Disk Node:保存队列元数据到磁盘,保证持久化
  • RAM Node:只保存在内存中,启动快但断电会丢失元数据
  • 通常 至少一个 Disk Node,其他节点可以是 RAM Node 或 Disk Node

🔹 集群特点

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

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

🔹 目的

- 负载均衡:
  • 客户端访问单一入口(8102/AMQP)
  • HAProxy 将请求分发到集群中的不同 RabbitMQ 节点
- 高可用:
  • HAProxy 定期健康检查节点
  • 如果某个节点不可用,自动剔除,客户端不会连接到宕机节点
- 统一管理界面入口:
  • Web 管理界面(15672)也通过 HAProxy 统一访问(8101)

🔹 逻辑架构


注意:在 RabbitMQ 集群 中,端口 25672 是用于 节点间通信(Erlang distribution) 的专用端口。

具体作用如下:
  • 🔗 节点间同步通信:RabbitMQ 集群的各个节点(例如 node1、node2、node3)需要相互通信以共享元数据(如队列、交换机、绑定信息等),这个通信就是通过 25672 端口进行的。
  • 💬 Erlang 分布式协议使用:RabbitMQ 是基于 Erlang/OTP 开发的,Erlang 自带分布式机制,默认使用 TCP 端口 25672 建立节点间的分布式连接。
  • ⚙️ 可配置:该端口可以在配置文件中通过环境变量 RABBITMQ_DIST_PORT 修改。
  • 🔥 防火墙注意事项:如果你在不同服务器上部署 RabbitMQ 集群,必须确保防火墙放通 25672 端口,否则节点之间无法建立集群关系(会出现 "connection refused" 或 "timeout" 错误)。
端口 作用 默认协议
8100 HAProxy 监控页面(访问地址如:http://node1:8100/stats,账号:admin/admin) HTTP
8101 RabbitMQ 服务(AMQP 客户端)负载均衡入口,由 HAProxy 代理到各节点的 5672 端口 TCP
8102 RabbitMQ Web 管理界面负载均衡入口,由 HAProxy 代理到各节点的 15672 端口 HTTP
5672 RabbitMQ AMQP 通信端口(客户端连接消息队列) TCP
15672 RabbitMQ Web 管理界面端口(单节点访问用) HTTP
25672 RabbitMQ 集群节点间通信(Erlang 分布式协议) TCP
📘 总结说明:
  • 8100、8101、8102 是 HAProxy 提供的统一入口端口,对外暴露,分别用于监控、消息队列和管理界面访问。

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

🔹 HAProxy 工作模式

功能 模式 端口 描述
stats 页面 HTTP 8100 监控 HAProxy 状态、节点健康
管理界面 HTTP 8101 负载均衡访问 RabbitMQ 节点 15672
AMQP 客户端 TCP 8102 负载均衡访问 RabbitMQ 节点 5672
  • HTTP 模式: 用于 Web 管理界面和 stats 页面
  • TCP 模式: 用于 AMQP 协议流量

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

1.客户端透明访问

  • 客户端不需要知道 RabbitMQ 有多少节点
  • 只连接 HAProxy 的单一端口(8102/AMQP)
  • HAProxy 根据负载均衡策略(roundrobin、leastconn)选择节点

2.节点健康检测

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

3.队列高可用

  • 如果使用 mirrored queue:
  • 队列元数据和消息复制到多个节点
  • 某个节点挂掉,消息不会丢失
  • 集群内其他节点仍可提供服务

4.管理界面高可用

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

4️⃣ 架构优势

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

5️⃣ 注意事项

2.队列高可用策略:

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

3.HAProxy 健康检查配置:

  • HTTP 用 option httpchk
  • TCP 用 check inter 5000 rise 2 fall 3

4.客户端重试机制:

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

5.防火墙与端口映射:

  • 15672/5672/8100/8101/8102 都需要开放并正确转发

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

一、环境准备

主机名称 公网IP 内网IP 系统 服务
node1 122.152.208.19 172.17.48.15 Centos8 Rabbitmq、HAProxy
node2 49.235.24.247 172.17.48.123 Centos8 Rabbitmq
node3 1.15.25.123 172.17.48.107 Centos8 Rabbitmq

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

2.1.修改主机名称

bash 复制代码
hostnamectl set-hostname node1
hostnamectl set-hostname node2
hostnamectl set-hostname node3

2.2.配置Hosts

bash 复制代码
三台机器同时修改
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服务器上

bash 复制代码
[root@node1 ~]# yum -y install haproxy

五、搭建 RabbitMQ Server 高可用集群

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

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

bash 复制代码
[root@node2 ~]# /sbin/service rabbitmq-server stop
[root@node3 ~]# /sbin/service rabbitmq-server stop
bash 复制代码
[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文件然后重新启动节点和应用

bash 复制代码
[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集群

bash 复制代码
rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@node1
rabbitmqctl start_app

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

5.5.1、在node1执行查看状态

bash 复制代码
[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执行查看状态

bash 复制代码
[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执行查看状态

bash 复制代码
[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配置文件并修改

bash 复制代码
[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:

bash 复制代码
[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 提供 统一入口 + 负载均衡 + 健康检测

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

相关推荐
大米粥哥哥3 小时前
Qt 使用QAMQP连接RabbitMQ
开发语言·qt·rabbitmq·qamqp
喝养乐多长不高13 小时前
SpringCloud:Eureka和负载均衡
spring cloud·eureka·服务发现·负载均衡·cap·服务注册
毛甘木14 小时前
阿里云CentOS环境下Docker使用教程
阿里云·docker·centos
q***728714 小时前
SpringBoot中整合RabbitMQ(测试+部署上线 最完整)
spring boot·rabbitmq·java-rabbitmq
adnyting15 小时前
【Linux日新月异(五)】CentOS 7防火墙深度解析:firewalld全面指南
linux·运维·centos
adnyting1 天前
【Linux日新月异(四)】CentOS 7进程管理深度指南:掌控系统生命线
linux·运维·centos
毛甘木1 天前
阿里云CentOS环境下Docker Compose详细使用教程
阿里云·docker·centos
adnyting1 天前
【Linux日新月异(二)】CentOS 7用户与用户组管理深度指南:保障系统安全的基石
linux·运维·centos
linuxxx1101 天前
Centos环境中Django项目中gunicorn的配置和使用
django·centos·gunicorn