RabbitMQ服务介绍
@
RabbitMQ 是一个开源的消息代理软件(message broker),它的主要功能是处理消息的收发。它实现了高级消息队列协议(AMQP,Advanced Message Queuing Protocol),用于在分布式系统中传递消息。RabbitMQ 可以在不同的应用之间高效地传递数据,从而解耦发送和接收消息的程序,实现异步通信、消息排队、消息路由等功能。
主要解决的问题
- 解耦:生产者和消费者无需直接通信,可以通过 RabbitMQ 中间件传递消息,从而降低了系统之间的耦合度。
- 异步处理:生产者发送消息后,不必等待消费者处理完毕,可以继续执行其他操作,提高系统的并发性和响应速度。
- 负载均衡:通过消息队列,可以将负载分摊到多个消费者,提高系统的处理能力和稳定性。
- 流量削峰:在高并发场景下,消息队列可以缓冲瞬间的大量请求,平滑处理负载,避免系统崩溃。
- 可靠性:通过消息持久化、确认机制等,RabbitMQ 能保证消息不会丢失,确保消息的可靠传递。
底层原理
RabbitMQ 的底层实现基于 Erlang 编程语言,Erlang 以其在构建分布式系统和高可用系统方面的优势而著称。RabbitMQ 的架构主要包括以下几个组件:
- 生产者(Producer):消息的发送者,将消息发送到 RabbitMQ。
- 交换器(Exchange):接收生产者发送的消息,并根据路由规则将消息分发到相应的队列。常见的交换器类型有 Direct、Fanout、Topic 和 Headers。
- 队列(Queue):存储消息的容器,消费者从队列中获取消息进行处理。
- 消费者(Consumer):消息的接收者,从 RabbitMQ 中的队列获取消息并处理。
- 绑定(Binding):定义交换器与队列之间的路由规则。
工作原理
1.消息发布:生产者将消息发送到交换器,同时指定路由键(Routing Key)。
2.消息路由:交换器根据绑定规则和路由键将消息路由到一个或多个队列。
3.消息存储:消息到达队列后,根据配置可以持久化存储,以保证消息不会因服务器宕机等问题而丢失。
4.消息消费:消费者订阅队列,RabbitMQ 将队列中的消息按照一定的策略(如轮询等)分发给消费者。
5.消息确认:消费者处理完消息后,可以发送确认信息给 RabbitMQ,
RabbitMQ 收到确认信息后才会将该消息从队列中移除。
RabbitMQ 的高可用性和分布式特性使其在处理大规模、高并发的消息传递场景中表现优异。其灵活的路由机制和可靠的消息传递机制,使其成为许多企业级应用的重要组件。
官网版本发布:目前发布到4.0

队列(Queue)是RabbitMQ中用于存储和传递消息的容器,是消息从生产者到消费者的中间媒介。核心特点:
RabbitMQ 队列的 3 种主要类型
| 类型 | 特点 | 适用场景 |
|---|---|---|
| Classic Queue | 默认队列类型、可搭配镜像队列实现高可用、支持惰性队列(Lazy Mode) | 常规异步任务、事件通知 |
| Quorum Queue | 基于 Raft 协议,强一致性、 自动故障转移、必须持久化 | 订单、支付等关键业务(RabbitMQ 3.8+) |
| Stream Queue | 高性能持久化日志、支持消息回溯(按偏移量消费)、多消费者独立读取 | 日志收集、事件溯源(RabbitMQ 3.9+) |
详细对比
-
Classic Queue(经典队列)
默认行为:
消息优先存内存,内存不足时溢出到磁盘。
可配置为 镜像队列(ha-mode: all)实现高可用。
变种:
Lazy Queue:通过参数 x-queue-mode=lazy 启用,消息直接写磁盘,适合堆积场景。 -
Quorum Queue(仲裁队列)
核心机制:
使用 Raft 协议保证数据一致性,所有节点同步写入。
自动处理脑裂(网络分区时少数派节点拒绝写入)。
限制:
必须持久化,不支持内存节点。
性能低于 Classic Queue(强一致性牺牲速度)。 -
Stream Queue(流队列)
设计目标:
解决 Classic Queue 的堆积性能瓶颈,支持消息历史回溯。
独特功能:
消费者可指定偏移量(Offset)重复消费。
支持多消费者独立读取(非竞争模式)。
集群配置 vs 队列类型
| 维度 | 集群配置 | 队列类型选择 |
|---|---|---|
| 作用范围 | 定义整个集群的行为(如节点通信、故障恢复策略)。 | 定义单个队列的数据存储和一致性机制(如 Classic/Quorum/Stream)。 |
| 配置方式 | 通过 rabbitmq.conf 或命令行(如 cluster_partition_handling)。 | 在声明队列时指定参数(如 x-queue-type: quorum)。 |
| 相互独立性 | 集群模式不强制队列类型,但某些队列类型对集群有要求(如 Quorum 队列需全磁盘节点)。 | 队列类型的选择不受集群模式限制,但依赖集群功能(如 Quorum 队列需 3.8+ 版本支持)。 |
关键结论
-
两者独立但协同工作:
你可以 在普通集群中创建 Quorum 队列(只需满足版本和节点要求)。
也可以 在配置了镜像策略的集群中混用 Classic 和 Quorum 队列。 -
Quorum 队列的优势:
无需手动配置镜像策略,自动实现多副本和强一致性。
更适合关键业务场景(如金融交易),而 Classic 队列+镜像适合高吞吐场景。
安装使用
使用Docker安装
实验环境:Ubuntu2404
- 安装Docker
apt -y install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
apt-get -y install docker-ce
- 配置daemon文件
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://registry-mirrors.yunyuan.co"],
"insecure-registries" : ["0.0.0.0/0"]
}
EOF
systemctl daemon-reload
systemctl restart docker
- 安装 4.0 RabbitMQ
docker run -itd --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:4.0-management
root@huhy:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c330d363607b rabbitmq:4.0-management "docker-entrypoint.s…" 3 seconds ago Up 3 seconds 4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, [::]:5672->5672/tcp, 15671/tcp, 15691-15692/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp, [::]:15672->15672/tcp rabbitmq
- 浏览器访问:IP:15672(guest/guest)


使用apt安装
Ubuntu2404只能安装3.12版本
root@huhy:~# apt list | grep rabbitmq
WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
golang-github-rabbitmq-amqp091-go-dev/noble 1.9.0-1 all
kamailio-rabbitmq-modules/noble 5.7.4-1build7 amd64
libanyevent-rabbitmq-perl/noble 1.22~dfsg-1 all
libmojo-rabbitmq-client-perl/noble 0.3.1-3 all
libmono-messaging-rabbitmq4.0-cil/noble 6.8.0.105+dfsg-3.6ubuntu2 all
libmono-rabbitmq4.0-cil/noble 6.8.0.105+dfsg-3.6ubuntu2 all
librabbitmq-client-java/noble 5.0.0-1.1 all
librabbitmq-dev/noble 0.11.0-1build2 amd64
librabbitmq4/noble 0.11.0-1build2 amd64
nagios-plugins-rabbitmq/noble 1:1.2.0-2.2ubuntu1 all
puppet-module-puppetlabs-rabbitmq/noble 8.5.0-7 all
rabbitmq-server/noble-updates,noble-security 3.12.1-1ubuntu1.2 all
apt install -y rabbitmq-server
- 启用web插件
rabbitmq-plugins enable rabbitmq_management
root@huhy:~# ss -tlun | grep 56
tcp LISTEN 0 1024 0.0.0.0:15672 0.0.0.0:*
tcp LISTEN 0 128 0.0.0.0:25672 0.0.0.0:*
tcp LISTEN 0 128 *:5672 *:*
- 浏览器界面访问:IP:15672

二进制编译安装
erlnag与RabbitMQ版本对应表
| RabbitMQ 版本 | 最低要求 Erlang/OTP | 最高支持 Erlang/OTP | 备注 |
|---|---|---|---|
| 4.0.5、4.0.4 | 26.2 | 27.x | 从 4.0.4 版本开始,4.0.x 系列与 Erlang 27 兼容 |
| 4.0.3、4.0.2、4.0.1 | 26.2 | 26.2.x | 4.0 系列与 Erlang 26.2 兼容 |
| 3.13.7 - 3.13.0 | 26.0 | 26.2.x | 3.13 系列与 Erlang 26 兼容 |
| 3.12.13 - 3.12.10 | 25.0 | 26.2.x | 3.12 系列与 Erlang 26 兼容 |
| 3.12.9 - 3.12.5 | 25.0 | 26.1.x | 3.12 系列与 Erlang 26 兼容 |
CentOS7.9环境搭建
- 安装依赖
yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel ncurses-devel wget xz
- 如果使用Ubuntu则
apt install -y build-essential libncurses5-dev libssl-dev
- 下载erlang:官网
wget https://github.com/erlang/otp/releases/download/OTP-27.3.2/otp_src_27.3.2.tar.gz
tar -xf otp_src_27.3.2.tar.gz
cd otp_src_27.3.2
- 编译安装erlang
./configure prefix=/usr/local/erlang;make ;make install
- 配置环境变量
echo 'export PATH=/usr/local/erlang/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
- 查看版本:进入erl执行erlang:system_info(otp_release).
oot@huhy:~# erl
Erlang/OTP 27 [erts-15.1.1] [source] [64-bit] [smp:128:4] [ds:128:4:10] [async-threads:1] [jit:ns]
Eshell V15.1.1 (press Ctrl+G to abort, type help(). for help)
1> erlang:system_info(otp_release).
"27"
2>
- 下载RabbitMQ包:官网
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v4.0.7/rabbitmq-server-generic-unix-4.0.7.tar.xz
- 解压软件包
xz -d rabbitmq-server-generic-unix-4.0.7.tar.xz
tar -xf rabbitmq-server-generic-unix-4.0.7.tar
mv rabbitmq_server-4.0.7/ /usr/local/rabbitmq
- 配置环境变量
echo 'export PATH=/usr/local/rabbitmq/sbin:$PATH' >> ~/.bashrc
source ~/.bashrc
- 启动RabbitMQ
rabbitmq-server -detached
[root@localhost ~]# ss -tlun | grep 5672
tcp LISTEN 0 128 *:25672 *:*
tcp LISTEN 0 128 [::]:5672 [::]:*
- 启动web插件
# 添加rabbitmq浏览器管理插件
rabbitmq-plugins enable rabbitmq_management
# 添加远程管理用户,用户名admin,密码123456
rabbitmqctl add_user admin 123456
# 为admin用户添加administrator角色
rabbitmqctl set_user_tags admin administrator
# 设置admin用户权限,允许访问vhost及read/write
rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
- 浏览器界面访问


如果出现警告
⚠ All stable feature flags must be enabled after completing an upgrade. [Learn more]
- 查看功能是否启用(enabled),将disabled启用即可:官网说明
[root@localhost ~]# rabbitmqctl list_feature_flags
Listing feature flags ...
name state
classic_mirrored_queue_version enabled
classic_queue_type_delivery_support enabled
detailed_queues_endpoint enabled
direct_exchange_routing_v2 enabled
drop_unroutable_metric enabled
empty_basic_get_metric enabled
feature_flags_v2 enabled
implicit_default_bindings enabled
khepri_db disabled
listener_records_in_ets enabled
maintenance_mode_status enabled
message_containers enabled
message_containers_deaths_v2 enabled
quorum_queue enabled
quorum_queue_non_voters enabled
rabbit_exchange_type_local_random enabled
rabbitmq_4.0.0 enabled
restart_streams enabled
stream_filtering enabled
stream_queue enabled
stream_sac_coordinator_unblock_group enabled
stream_single_active_consumer enabled
stream_update_config_command enabled
tracking_records_in_ets enabled
user_limits enabled
virtual_host_metadata enabled
rabbitmqctl enable_feature_flag detailed_queues_endpoint
- 配置systemd启动
vi /etc/systemd/system/rabbitmq-server.service
[Unit]
Description=RabbitMQ Messaging Server
After=network.target
[Service]
Type=forking
User=rabbitmq
Group=rabbitmq
UMask=0027
Environment="HOME=/var/lib/rabbitmq"
Environment="RABBITMQ_MNESIA_BASE=/var/lib/rabbitmq/mnesia"
Environment="RABBITMQ_LOG_BASE=/var/log/rabbitmq"
Environment="PATH=/usr/local/erlang/bin:/usr/local/rabbitmq/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
Environment="ERLANG_HOME=/usr/local/erlang"
WorkingDirectory=/usr/local/rabbitmq
ExecStart=/usr/local/rabbitmq/sbin/rabbitmq-server -detached
ExecStop=/usr/local/rabbitmq/sbin/rabbitmqctl stop
Restart=on-failure
RestartSec=10s
[Install]
WantedBy=multi-user.target
- 创建用户
groupadd rabbitmq
useradd -r -d /var/lib/rabbitmq -s /bin/false -g rabbitmq rabbitmq
mkdir -p /etc/rabbitmq
mkdir -p /var/lib/rabbitmq
mkdir -p /var/log/rabbitmq
chown -R rabbitmq:rabbitmq /var/lib/rabbitmq /var/log/rabbitmq
vi /etc/rabbitmq/rabbitmq-env.conf
NODENAME=rabbit@localhost
CONFIG_FILE=/etc/rabbitmq/rabbitmq.conf
- 杀死启动的mq进程(重启也行),加载文件
[root@localhost ~]# ps -aux| grep rabbit
root 41042 0.8 2.0 2947416 79012 ? Sl 10:50 0:58 /usr/local/erlang/lib/erlang/erts-15.2.5/bin/beam.smp -W w -MBas ageffcbf -MHas ageffcbf -MBlmbcs 512 -MHlmbcs 512 -MMmcs 30 -pc unicode -P 1048576 -t 5000000 -stbt db -zdbbl 128000 -sbwt none -sbwtdcpu none -sbwtdio none -B i -- -root /usr/local/erlang/lib/erlang -bindir /usr/local/erlang/lib/erlang/erts-15.2.5/bin -progname erl -- -home /root -- -pa -noshell -noinput -s rabbit boot -boot start_sasl -syslog logger [] -syslog syslog_error_logger false -kernel prevent_overlapping_partitions false -detached -noshell -noinput --
root 41116 0.0 0.0 113284 1388 ? Ss 10:50 0:00 /bin/sh -s rabbit_disk_monitor
root 42389 0.0 0.0 112812 968 pts/0 S+ 12:42 0:00 grep --color=auto rabbit
[root@localhost ~]# kill -9 41042 41116
systemctl daemon-reload
systemctl start rabbitmq-server
[root@localhost ~]# systemctl status rabbitmq-server
● rabbitmq.service - RabbitMQ Messaging Server
Loaded: loaded (/etc/systemd/system/rabbitmq.service; disabled; vendor preset: disabled)
Active: active (running) since Sat 2025-04-12 12:51:57 EDT; 3min 0s ago
Process: 42998 ExecStop=/usr/local/rabbitmq/sbin/rabbitmqctl stop (code=exited, status=0/SUCCESS)
Process: 43037 ExecStart=/usr/local/rabbitmq/sbin/rabbitmq-server -detached (code=exited, status=0/SUCCESS)
Main PID: 43046 (beam.smp)
CGroup: /system.slice/rabbitmq.service
├─43046 /usr/local/erlang/lib/erlang/erts-15.2.5/bin/beam.smp -W w -MBas ageffcbf -MHas ageffcbf -MBlmbcs ...
├─43050 erl_child_setup 1024
├─43075 sh -s disksup
├─43077 /usr/local/erlang/lib/erlang/lib/os_mon-2.10.1/priv/bin/memsup
├─43078 /usr/local/erlang/lib/erlang/lib/os_mon-2.10.1/priv/bin/cpu_sup
├─43079 /usr/local/erlang/lib/erlang/erts-15.2.5/bin/inet_gethost 4
├─43080 /usr/local/erlang/lib/erlang/erts-15.2.5/bin/inet_gethost 4
└─43084 /bin/sh -s rabbit_disk_monitor
Apr 12 12:51:57 localhost.localdomain systemd[1]: Starting RabbitMQ Messaging Server...
Apr 12 12:51:57 localhost.localdomain systemd[1]: Started RabbitMQ Messaging Server.
如果出现节点通信失败问题
Error: unable to perform an operation on node 'rabbit@localhost'. Please see diagnostics information and suggestions below.
- 先比较服务端和客户端的cookie,确保两者一致
cat /var/lib/rabbitmq/.erlang.cookie
cat ~/.erlang.cookie
- 如果不一致就复制
cp -rf /var/lib/rabbitmq/.erlang.cookie ~/
chmod 600 ~/.erlang.cookie
[root@localhost ~]# rabbitmqctl list_users
Listing users ...
user tags
guest [administrator]
- 配置rabbitmqadmin
wget http://localhost:15672/cli/rabbitmqadmin -P /usr/local/bin/
chmod +x /usr/local/bin/rabbitmqadmin
基础命令
- 服务管理
| 命令 | 说明 |
|---|---|
| rabbitmq-server start | 启动 RabbitMQ 服务(前台运行) |
| rabbitmq-server -detached | 后台启动服务 |
| rabbitmqctl stop | 停止 RabbitMQ 服务 |
| rabbitmqctl status | 查看服务状态 |
| systemctl restart rabbitmq-server | 重启服务(Systemd 系统) |
| systemctl stop rabbitmq-server | 停止服务(Systemd 系统) |
| systemctl start rabbitmq-server | 启动服务(Systemd 系统) |
| systemctl enable rabbitmq-server | 开机自启服务(Systemd 系统) |
- 集群管理
| 命令 | 说明 |
|---|---|
| rabbitmqctl join_cluster rabbit@<主节点> | 加入集群 |
| rabbitmqctl cluster_status | 查看集群状态 |
| rabbitmqctl forget_cluster_node rabbit@<节点> | 从集群移除节点 |
| rabbitmqctl change_cluster_node_type disc / ram | 切换节点类型(磁盘/内存) |
| rabbitmqctl sync_queue <队列名> | 手动同步镜像队列 |
- 队列/交换机操作
| 命令 | 说明 |
|---|---|
| rabbitmqctl list_queues | 列出所有队列 |
| rabbitmqctl list_queues name messages | 显示队列名和消息数 |
| rabbitmqctl list_exchanges | 列出所有交换机 |
| rabbitmqctl list_bindings | 列出所有绑定关系 |
| rabbitmqctl purge_queue <队列名> | 清空队列消息 |
| rabbitmqctl delete_queue <队列名> | 删除队列 |
| rabbitmqctl delete_exchange <交换机名> | 删除交换机 |
- 用户与权限
| 命令 | 说明 |
|---|---|
| rabbitmqctl add_user <用户名> <密码> | 创建用户 |
| rabbitmqctl change_password <用户名> <密码> | 修改密码 |
| rabbitmqctl delete_user <用户名> | 删除用户 |
| rabbitmqctl list_users | 列出所有用户 |
| rabbitmqctl set_user_tags <用户名> administrator | 设为管理员 |
| rabbitmqctl set_permissions -p / <用户名> "." "." ".*" | 授予用户全部权限 |
| rabbitmqctl clear_permissions -p / <用户名> | 清除用户权限 |
RabbitMQ 本身没有直接修改用户名的命令,通常的做法是创建一个新用户,将原用户的权限赋予新用户,然后删除原用户。
- 创建新用户
假设要将原用户 old_user 改名为 new_user,并设置新密码为 new_password,可以使用以下命令:
rabbitmqctl add_user new_user new_password
- 复制原用户的权限
先查看原用户的权限:
rabbitmqctl list_user_permissions old_user
- 假设原用户在所有虚拟主机上都有配置、写入和读取权限,将这些权限赋予新用户:
rabbitmqctl set_permissions -p / new_user ".*" ".*" ".*"
- 这里的 -p / 表示针对默认的虚拟主机 /,".*" 表示匹配所有资源。
- 删除原用户
确认新用户权限无误后,删除原用户:
rabbitmqctl delete_user old_user
- 策略管理(镜像队列等)
| 命令 | 说明 |
|---|---|
| rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}' | 将所有队列镜像到所有节点 |
| rabbitmqctl set_policy ha-two "^" '{"ha-mode":"exactly","ha-params":2}' | 镜像到 2 个节点 |
| rabbitmqctl list_policies | 列出所有策略 |
| rabbitmqctl clear_policy <策略名> | 删除策略 |
- 插件管理
| 命令 | 说明 |
|---|---|
| rabbitmq-plugins list | 列出所有插件 |
| rabbitmq-plugins enable rabbitmq_management | 启用管理插件(Web UI) |
| rabbitmq-plugins disable <插件名> | 禁用插件 |
- 高级运维
| 命令 | 说明 |
|---|---|
| rabbitmqctl report | 生成详细报告(含配置、状态) |
| rabbitmqctl environment | 查看环境变量 |
| rabbitmqctl eval 'node().' | 执行 Erlang 代码(调试用) |
| rabbitmqadmin declare queue name=<队列名> durable=true | 使用 rabbitmqadmin 声明队列(需安装) |
| rabbitmqctl list_feature_flags | 出所有功能标志及其状态(启用/禁用) |
| rabbitmqctl enable_feature_flag <flag_name> | 启用指定功能标志 |
| rabbitmqctl disable_feature_flag <flag_name> | 禁用功能标志(部分标志可能无法禁用) |
- 网络与连接
| 命令 | 说明 |
|---|---|
| rabbitmqctl list_connections | 查看客户端连接 |
| rabbitmqctl close_connection "<连接名>" "维护关闭" | 强制关闭连接 |
| rabbitmqctl list_channels | 查看通信通道 |
- 数据备份与恢复
| 命令 | 说明 |
|---|---|
| rabbitmqctl export_definitions <文件名>.json | 导出元数据(队列、交换机等) |
| rabbitmqctl import_definitions <文件名>.json | 导入元数据 |
参数调优
运行生产工作负载的 RabbitMQ 安装可能需要系统限制和内核参数调整,才能处理足够数量的并发连接和队列。需要调整的主要设置是最大打开文件数(也称为 )ulimit -n。许多操作系统上的默认值对于消息代理来说太低(1024在多个 Linux 发行版中)。建议在生产环境中至少为用户提供 65536 个rabbitmq文件连接数
- 在使用 systemd 的发行版中:
mkdir /etc/systemd/system/rabbitmq-server.service.d
cat > /etc/systemd/system/rabbitmq-server.service.d/limits.conf <<EOF
[Service]
LimitNOFILE=64000
EOF
systemctl daemon-reload;systemctl restart rabbitmq-server
[root@localhost ~]# rabbitmq-diagnostics status | grep limit
Erlang processes: 398 used, 1048576 limit
Total: 0, limit: 63903
-
如果LimitNOFILE设置为高于 65536 的值,则必须相应更新环境变量以增加运行ERL_MAX_PORTS时限制。
-
要配置 Docker 的内核限制,请使用Docker 守护进程配置文件"default-ulimits"中的键。该文件必须安装在 Docker 主机上的以下位置:/etc/docker/daemon.json
{
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 64000,
"Soft": 64000
}
}
}
- 修改系统连接数编辑/etc/sysctl.conf配置文件:
cat >> /etc/sysctl.conf <<EOF
fs.file-max = 10240
EOF
sysctl -p
- 用户级别修改,编辑/etc/security/limits.conf配置文件,具体命令如下:
vi /etc/security/limits.conf
* soft nofile 10240
* hard nofile 10240
- rabbitmq.conf文件官网配置说明
# 内存水位线(超过阈值触发流控)
vm_memory_high_watermark.relative = 0.6 # 相对内存比例(60%)
# 或绝对内存值(例如 4GB)
vm_memory_high_watermark.absolute = 4GB
# 磁盘空闲空间阈值(低于此值阻塞生产者)
disk_free_limit.relative = 1.0 # 与内存比例相同
# 或绝对磁盘空间(例如 5GB)
disk_free_limit.absolute = 5GB
# 内存计算方式(避免内存统计误差)
vm_memory_calculation_strategy = rss # 使用 RSS(实际物理内存)
# TCP 监听设置
listeners.tcp.default = 5672
num_acceptors.tcp = 100 # TCP 接收器进程数(建议 10-100)
# 连接和通道限制
channel_max = 2047 # 每个连接的最大通道数
connection_max = 10000 # 最大客户端连接数
heartbeat = 60 # 心跳间隔(秒,0=禁用)
# 分布式节点通信端口范围
kernel.inet_dist_listen_min = 9100
kernel.inet_dist_listen_max = 9105
- rabbitmq-env.conf文件
包含覆盖 RabbitMQ 脚本和 CLI 工具内置默认值的环境变量
# 主机节点名称
NODENAME=bunny@myhost
# 配置文件路径
CONFIG_FILE=/etc/rabbitmq/rabbitmq.conf
# 配置文件路径
ADVANCED_CONFIG_FILE=/etc/rabbitmq/advanced.config
搭建普通集群模式(Cluster)
RabbitMQ的普通集群模式(Classic Cluster Mode) 是其最基础的集群部署方式,主要用于分布式扩展和基础高可用。它的核心特点是元数据共享但队列数据局部存储,下面详细解释它的工作原理和特点:
- 核心特点
元数据全局同步:
(1)所有节点共享 交换机(Exchange)、队列定义(Queue)、绑定关系(Binding) 等元数据。
(2)客户端连接任意节点均可看到完整的拓扑结构。
队列数据局部存储:
(1)队列的消息数据仅存储在创建它的节点上(其他节点通过代理转发请求)。
(2)例如:QueueA 创建在 Node1 上,Node2 收到该队列的消费请求时,会从 Node1 拉取数据。
+---------------+ +---------------+
| Node1 |<----->| Node2 |
| (QueueA 主节点)| | (QueueB 主节点)|
+-------+-------+ +-------+-------+
^ ^
| 代理转发请求 | 代理转发请求
| |
+-------+-------+ +-------+-------+
| Client (生产者)| | Client (消费者)|
+---------------+ +---------------+
-
优点
横向扩展:可通过增加节点分散连接和计算压力。
无缝客户端访问:客户端连接任意节点均可操作全局资源(如声明队列、发布消息)。 -
缺点
无数据冗余:
如果 Node1 宕机,其上的 QueueA 数据会不可用(即使其他节点健康)
需通过镜像队列(Mirrored Queues) 补充高可用。
依赖网络稳定性:节点间通信中断可能导致集群分裂(需人工干预)
使用CentOS7.9环境搭建MQ版本为 v3.3.5,实验环境如下:
| 节点 | IP |
|---|---|
| rabbitmq01(磁盘节点) | 192.168.200.80 |
| rabbitmq02(内存节点) | 192.168.200.81 |
| rabbitmq03(内存节点) | 192.168.200.82 |
[root@localhost ~]# cat init.sh
#!/bin/bash
# 定义节点信息
NODES=("192.168.200.80 rabbitmq01" "192.168.200.81 rabbitmq02" "192.168.200.82 rabbitmq03")
# 定义当前节点的密码(默认集群统一密码)
HOST_PASS="000000"
# 时间同步的目标节点
TIME_SERVER=rabbitmq01
# 时间同步的地址段
TIME_SERVER_IP=192.160.200.0/24
# 欢迎界面
cat > /etc/motd <<EOF
################################
# Welcome to mycluster #
################################
EOF
#禁用selinux
sed -i 's/SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
setenforce 0
#firewalld
systemctl stop firewalld
systemctl disable firewalld >> /dev/null 2>&1
#关闭IPtables,清空规则
yum install iptables-services -y
if [ 0 -ne $? ]; then
echo -e "\033[31mThe installation source configuration errors\033[0m"
exit 1
fi
systemctl restart iptables
iptables -F
iptables -X
iptables -Z
/usr/sbin/iptables-save
systemctl stop iptables
systemctl disable iptables
#禁用NetworkManager
systemctl stop NetworkManager >> /dev/null 2>&1
systemctl disable NetworkManager >> /dev/null 2>&1
yum remove -y NetworkManager firewalld
systemctl restart network
# 优化ssh连接
sed -i -e 's/#UseDNS yes/UseDNS no/g' -e 's/GSSAPIAuthentication yes/GSSAPIAuthentication no/g' /etc/ssh/sshd_config
systemctl reload sshd
# 修改主机名
for node in "${NODES[@]}"; do
ip=$(echo "$node" | awk '{print $1}')
hostname=$(echo "$node" | awk '{print $2}')
# 获取当前节点的主机名和 IP
current_ip=$(hostname -I | awk '{print $1}')
current_hostname=$(hostname)
# 检查当前节点与要修改的节点信息是否匹配
if [[ "$current_ip" == "$ip" && "$current_hostname" != "$hostname" ]]; then
echo "Updating hostname to $hostname on $current_ip..."
hostnamectl set-hostname "$hostname"
if [ $? -eq 0 ]; then
echo "Hostname updated successfully."
else
echo "Failed to update hostname."
fi
break
fi
done
# 遍历节点信息并添加到 hosts 文件
for node in "${NODES[@]}"; do
ip=$(echo "$node" | awk '{print $1}')
hostname=$(echo "$node" | awk '{print $2}')
# 检查 hosts 文件中是否已存在相应的解析
if grep -q "$ip $hostname" /etc/hosts; then
echo "Host entry for $hostname already exists in /etc/hosts."
else
# 添加节点的解析条目到 hosts 文件
sudo sh -c "echo '$ip $hostname' >> /etc/hosts"
echo "Added host entry for $hostname in /etc/hosts."
fi
done
if [[ ! -s ~/.ssh/id_rsa.pub ]]; then
ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa -q -b 2048
fi
# 检查并安装 expect 工具
if ! which expect &> /dev/null; then
echo "expect 工具未安装,正在安装 expect..."
sudo yum install -y expect
fi
# 遍历所有节点
for node in "${NODES[@]}"; do
ip=$(echo "$node" | awk '{print $1}')
hostname=$(echo "$node" | awk '{print $2}')
expect -c "
set timeout -1
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub $hostname
expect {
\"*password:*\" { send -- \"$HOST_PASS\r\"; exp_continue }
\"*(yes/no)*\" { send -- \"yes\r\"; exp_continue }
eof { exit 1 }
}
"
done
# 时间同步
if [[ $name == $TIME_SERVER ]]; then
# 配置当前节点为时间同步源
sed -i '3,6s/^/#/g' /etc/chrony.conf
sed -i "7s/^/server $TIME_SERVER iburst/g" /etc/chrony.conf
echo "allow $TIME_SERVER_IP" >> /etc/chrony.conf
echo "local stratum 10" >> /etc/chrony.conf
else
# 配置当前节点同步到目标节点
sed -i '3,6s/^/#/g' /etc/chrony.conf
sed -i "7s/^/server $TIME_SERVER iburst/g" /etc/chrony.conf
fi
# 重启并启用 chrony 服务
systemctl restart chronyd
systemctl enable chronyd
echo "###############################################################"
echo "################# 集群初始化成功 #####################"
echo "###############################################################"
- 配置离线源,安装软件包
[root@rabbitmq01 ~]# ls
anaconda-ks.cfg init.sh rabbitmq-repo.tar.gz
[root@rabbitmq01 ~]# tar -xf rabbitmq-repo.tar.gz -C /opt/
[root@rabbitmq01 ~]# mkdir /etc/yum.repos.d/repo.bak
[root@rabbitmq01 ~]# mv /etc/yum.repos.d/CentOS-* /etc/yum.repos.d/repo.bak/
[root@rabbitmq01 ~]# mkdir /opt/centos
[root@rabbitmq01 ~]# mount /dev/sr0 /opt/centos/
mount: /dev/sr0 is write-protected, mounting read-only
[root@rabbitmq01 ~]# cat /etc/yum.repos.d/rabbitmq.repo
[rabbitmq]
name=rabbitmq
baseurl=file:///opt/rabbitmq-repo
gpgcheck=0
enabled=1
[centos]
name=centos
baseurl=file:///opt/centos
gpgcheck=0
enabled=1
[root@rabbitmq01 ~]# yum clean all;yum repolist
Loaded plugins: fastestmirror
Cleaning repos: centos rabbitmq
Cleaning up list of fastest mirrors
Other repos take up 176 M of disk space (use --verbose for details)
Loaded plugins: fastestmirror
Determining fastest mirrors
centos | 3.6 kB 00:00:00
rabbitmq | 2.9 kB 00:00:00
(1/3): centos/group_gz | 153 kB 00:00:00
(2/3): rabbitmq/primary_db | 35 kB 00:00:00
(3/3): centos/primary_db | 3.3 MB 00:00:00
repo id repo name status
centos centos 4,070
rabbitmq rabbitmq 26
repolist: 4,096
[root@rabbitmq01 ~]#
[root@rabbitmq01 ~]# yum install -y vsftpd
[root@rabbitmq01 ~]# echo "anon_root=/opt" >> /etc/vsftpd/vsftpd.conf
[root@rabbitmq01 ~]# systemctl enable --now vsftpd
Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.service to /usr/lib/systemd/system/vsftpd.service.
[root@rabbitmq01 ~]#
[root@rabbitmq02 ~]# mkdir /etc/yum.repos.d/repo.bak
[root@rabbitmq02 ~]# mv /etc/yum.repos.d/CentOS-* /etc/yum.repos.d/repo.bak/
[root@rabbitmq02 ~]# cat /etc/yum.repos.d/rabbitmq.repo abbitmq.repo
[rabbitmq]
name=rabbitmq
baseurl=ftp://rabbitmq01/rabbitmq-repo
gpgcheck=0
enabled=1
[centos]
name=centos
baseurl=ftp://rabbitmq01/centos
gpgcheck=0
enabled=1
[root@rabbitmq02 ~]# yum clean all;yum repolist
Loaded plugins: fastestmirror
Cleaning repos: centos rabbitmq
Cleaning up list of fastest mirrors
Other repos take up 176 M of disk space (use --verbose for details)
Loaded plugins: fastestmirror
Determining fastest mirrors
centos | 3.6 kB 00:00:00
rabbitmq | 2.9 kB 00:00:00
(1/3): centos/group_gz | 153 kB 00:00:00
(2/3): rabbitmq/primary_db | 35 kB 00:00:00
(3/3): centos/primary_db | 3.3 MB 00:00:00
repo id repo name status
centos centos 4,070
rabbitmq rabbitmq 26
repolist: 4,096
[root@rabbitmq02 ~]#
[root@rabbitmq03 ~]# mkdir /etc/yum.repos.d/repo.bak
[root@rabbitmq03 ~]# mv /etc/yum.repos.d/CentOS-* /etc/yum.repos.d/repo.bak/
[root@rabbitmq03 ~]# cat /etc/yum.repos.d/rabbitmq.repo
[rabbitmq]
name=rabbitmq
baseurl=ftp://rabbitmq01/rabbitmq-repo
gpgcheck=0
enabled=1
[centos]
name=centos
baseurl=ftp://rabbitmq01/centos
gpgcheck=0
enabled=1
[root@rabbitmq03 ~]# yum clean all;yum repolist
Loaded plugins: fastestmirror
Cleaning repos: centos rabbitmq
Cleaning up list of fastest mirrors
Other repos take up 176 M of disk space (use --verbose for details)
Loaded plugins: fastestmirror
Determining fastest mirrors
centos | 3.6 kB 00:00:00
rabbitmq | 2.9 kB 00:00:00
(1/3): rabbitmq/primary_db | 35 kB 00:00:00
(2/3): centos/group_gz | 153 kB 00:00:00
(3/3): centos/primary_db | 3.3 MB 00:00:00
repo id repo name status
centos centos 4,070
rabbitmq rabbitmq 26
repolist: 4,096
[root@rabbitmq03 ~]#
[root@rabbitmq01 ~]# yum install -y rabbitmq-server
[root@rabbitmq02 ~]# yum install -y rabbitmq-server
[root@rabbitmq03 ~]# yum install -y rabbitmq-server
- 启动并开机自动
[root@rabbitmq01 ~]# systemctl enable --now rabbitmq-server
Created symlink from /etc/systemd/system/multi-user.target.wants/rabbitmq-server.service to /usr/lib/systemd/system/rabbitmq-server.service.
[root@rabbitmq01 ~]#
[root@rabbitmq02 ~]# systemctl enable --now rabbitmq-server
Created symlink from /etc/systemd/system/multi-user.target.wants/rabbitmq-server.service to /usr/lib/systemd/system/rabbitmq-server.service.
[root@rabbitmq02 ~]#
[root@rabbitmq03 ~]# systemctl enable --now rabbitmq-server
Created symlink from /etc/systemd/system/multi-user.target.wants/rabbitmq-server.service to /usr/lib/systemd/system/rabbitmq-server.service.
[root@rabbitmq03 ~]#
- 启用web插件
[root@rabbitmq01 ~]# rabbitmq-plugins enable rabbitmq_management
The following plugins have been enabled:
mochiweb
webmachine
rabbitmq_web_dispatch
amqp_client
rabbitmq_management_agent
rabbitmq_management
Plugin configuration has changed. Restart RabbitMQ for changes to take effect.
- 重启后界面查看
[root@rabbitmq01 ~]# systemctl restart rabbitmq-server
[root@rabbitmq01 ~]# ss -tln | grep 15672
LISTEN 0 128 *:15672 *:*
[root@rabbitmq01 ~]#
- 可以看到15672端口已开放,打开浏览器,输入rabbitmq1节点的ip加端口15672(http://IP:15672)访问RabbitMQ监控界面,使用用户名:密码guest:guest登录


- 配置集群节点通信
[root@rabbitmq01 ~]# cat /var/lib/rabbitmq/.erlang.cookie
XQDUOWPJABMYRFCNXQKV
[root@rabbitmq01 ~]# chmod 777 /var/lib/rabbitmq/.erlang.cookie
[root@rabbitmq01 ~]# scp /var/lib/rabbitmq/.erlang.cookie root@rabbitmq02:/var/lib/rabbitmq/
.erlang.cookie 100% 20 12.8KB/s 00:00
[root@rabbitmq01 ~]# scp /var/lib/rabbitmq/.erlang.cookie root@rabbitmq03:/var/lib/rabbitmq/
.erlang.cookie 100% 20 12.5KB/s 00:00
[root@rabbitmq01 ~]#
- 注;经过测试只需要远程把erlang.cookie同步,不做授权和更改文件属性也能成功搭建的,但是做了这些可能后续有服务会用到,就还是做了
[root@rabbitmq02 ~]# chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
[root@rabbitmq03 ~]# chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
- 重启rabbitmq服务
[root@rabbitmq02 ~]#systemctl restart rabbitmq-server
[root@rabbitmq03 ~]#systemctl restart rabbitmq-server
配置节点加入集群
- 节点类型定义
| 节点类型 | 数据存储方式 | 特点 |
|---|---|---|
| 磁盘节点 | 元数据和消息持久化到磁盘 | 数据可靠,重启后不丢失,但写入性能较低(受磁盘 I/O 限制)。 |
| 内存节点 | 元数据和消息仅存储在内存 | 读写性能高,但节点重启后数据丢失(依赖磁盘节点同步)。 |
默认rabbitmq启动后是磁盘节点,在这个cluster命令下,rabbitmq02和rabbitmq03是内存节点,rabbitmq1是磁盘节点。
如果要使rabbitmq02、rabbitmq03都是磁盘节点,去掉--ram参数即可。
如果想要更改节点类型,可以使用命令rabbitmqctl change_cluster_node_type disc(ram),前提是必须停掉rabbit应用。
集群配置要求
(1) 磁盘节点的必要性
- 至少需要一个磁盘节点:
RabbitMQ 要求集群中 必须存在至少一个磁盘节点,用于保存集群的元数据(队列、交换机、用户权限等)。
如果所有节点均为内存节点,磁盘节点宕机后,集群无法恢复元数据(可能导致配置丢失)。 - 推荐多个磁盘节点:
生产环境建议部署 2 个以上磁盘节点,避免单点故障导致元数据不可用。
(2) 内存节点的限制
- 仅适合临时数据:
内存节点的队列数据 不会持久化,适合处理高吞吐但允许丢失的临时消息(如实时监控数据)。 - 依赖磁盘节点同步:
内存节点的元数据(如队列定义)需从磁盘节点同步,因此必须与磁盘节点保持网络连通。
[root@rabbitmq02 ~]# rabbitmqctl stop_app
Stopping node rabbit@rabbitmq02 ...
...done.
[root@rabbitmq02 ~]# rabbitmqctl join_cluster --ram rabbit@rabbitmq01
Clustering node rabbit@rabbitmq02 with rabbit@rabbitmq01 ...
...done.
[root@rabbitmq02 ~]# rabbitmqctl start_app
Starting node rabbit@rabbitmq02 ...
...done.
[root@rabbitmq02 ~]#
[root@rabbitmq03 ~]# rabbitmqctl stop_app
Stopping node rabbit@rabbitmq03 ...
...done.
[root@rabbitmq03 ~]# rabbitmqctl join_cluster --ram rabbit@rabbitmq01
Clustering node rabbit@rabbitmq03 with rabbit@rabbitmq01 ...
...done.
[root@rabbitmq03 ~]# rabbitmqctl start_app
Starting node rabbit@rabbitmq03 ...
...done.
[root@rabbitmq03 ~]#
- 在rabbitmq02和rabbitmq03节点上启用rabbitmq_management
[root@rabbitmq02 ~]# rabbitmq-plugins enable rabbitmq_management
The following plugins have been enabled:
mochiweb
webmachine
rabbitmq_web_dispatch
amqp_client
rabbitmq_management_agent
rabbitmq_management
Plugin configuration has changed. Restart RabbitMQ for changes to take effect.
[root@rabbitmq02 ~]# systemctl restart rabbitmq-server
[root@rabbitmq02 ~]#
[root@rabbitmq03 ~]# rabbitmq-plugins enable rabbitmq_management
The following plugins have been enabled:
mochiweb
webmachine
rabbitmq_web_dispatch
amqp_client
rabbitmq_management_agent
rabbitmq_management
Plugin configuration has changed. Restart RabbitMQ for changes to take effect.
[root@rabbitmq03 ~]# systemctl restart rabbitmq-server
-
界面验证


-
查看集群状态
[root@rabbitmq01 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@rabbitmq01 ...
[{nodes,[{disc,[rabbit@rabbitmq01]},
{ram,[rabbit@rabbitmq03,rabbit@rabbitmq02]}]},
{running_nodes,[rabbit@rabbitmq02,rabbit@rabbitmq03,rabbit@rabbitmq01]},
{cluster_name,<<"rabbit@rabbitmq01">>},
{partitions,[]}]
...done.
普通集群模式默认不复制数据,可以通过策略(Policy) 显式启用镜像队列:官网(最新版本中已启用,推荐使用仲裁队列)
rabbitmqctl set_policy 是 RabbitMQ 中用于定义 策略(Policy) 的命令,策略主要用于控制队列、交换机的行为(如镜像队列、TTL、死信队列等)
命令语法
rabbitmqctl set_policy [--vhost <vhost>] [--priority <priority>] [--apply-to <apply-to>] <policy_name> <pattern> <definition>
- 参数说明
| 参数 | 说明 | 示例 |
|---|---|---|
| < policy_name > | 策略名称(可自定义) | ha-all-queue |
| < pattern > | 正则表达式,匹配队列/交换机名称 | "^ha."(匹配以 ha. 开头的队列) |
| < definition> | JSON 格式的策略规则 | '{"ha-mode":"all"}' |
| --vhost < vhost> | (可选)策略作用的虚拟主机,默认 / | --vhost /prod |
| --priority < priority> | (可选)策略优先级(0-99,越大优先级越高),默认 0 | --priority 10 |
| --apply-to < apply-to> | (可选)策略作用对象:queues、exchanges 或 all(默认) | --apply-to queues |
- 镜像队列(高可用)
作用:所有名称以 ha. 开头的队列会在集群所有节点上镜像。
参数:
ha-mode: "all":镜像到所有节点(也可用 exactly 或 nodes)。
ha-sync-mode: "automatic":新节点自动同步数据(或 manual 手动同步)
rabbitmqctl set_policy ha-all-queue "^ha\." \
'{"ha-mode":"all","ha-sync-mode":"automatic"}' \
--priority 10 \
--apply-to queues
- 仅镜像到所有磁盘节点,避免不必要的网络和磁盘开销(尤其是集群规模大时)
rabbitmqctl set_policy ha-disk "^" '{"ha-mode":"nodes","ha-params":["rabbit@disk-node1", "rabbit@disk-node2"]}'
- 仅镜像到其他内存节点(避免磁盘节点拖累性能):
rabbitmqctl set_policy ha-ram "^" '{"ha-mode":"nodes","ha-params":["rabbit@ram-node1", "rabbit@ram-node2"]}'
删除镜像策略
- 执行以下命令,确认当前生效的镜像策略名称和匹配规则:
rabbitmqctl list_policies
- 如果策略名为 ha-all,执行以下命令删除( 默认vhost为/,若不同需指定-p参数):
rabbitmqctl clear_policy ha-all -p /
- 以下是 RabbitMQ 普通集群模式 和 启用 ha-mode: "all" 镜像队列 的对比
| 对比项 | 普通集群模式(Classic Cluster) | 启用 ha-mode: "all" 的镜像队列 |
|---|---|---|
| 数据分布 | 队列数据仅存储在创建它的主节点,其他节点无副本。 | 队列数据在所有节点(包括磁盘和内存节点)复制完整副本 |
| 高可用性 | ❌ 主节点宕机后,队列不可用(无自动故障转移) | ✅ 主节点宕机后,自动选举镜像节点为新主节点(无缝切换) |
| 元数据同步 | ✅ 所有节点共享交换机、队列定义等元数据 | ✅ 元数据同步 + 消息数据全量复制 |
| 性能影响 | ⚡ 高性能(无数据复制开销) | ⚠️ 写入性能降低(需同步到所有节点,网络和磁盘 I/O 增加) |
| 网络分区处理 | 可能脑裂(需人工干预) | 依赖策略(如 pause_minority),但仍可能需干预 |
| 配置方式 | 默认集群行为,无需额外配置 | 需显式设置策略:rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}' |
| 适用场景 | 非关键业务,允许短暂数据丢失 | 需要横向扩展连接数。 |
| 资源占用 | 低(仅主节点存储数据) | 高(所有节点存储全量数据,占用内存/磁盘翻倍) |
| 故障恢复复杂度 | 高(需手动恢复主节点或迁移队列) | 低(自动切换,客户端无感知) |
| 队列类型支持 | 所有队列类型(经典队列、Quorum 队列等) | 仅支持经典队列(Quorum 队列自带高可用,无需镜像) |
配置集群数据迁移
RabbitMQ 从 3.7.5 迁移到 4.0.7 的升级迁移方案
- 在旧集群(3.7.5)上:核心文件是定义definitions,其他只作为参考
# 1. 检查当前集群状态
rabbitmqctl cluster_status
# 2. 记录所有vhost、用户、权限、队列、交换机和绑定
rabbitmqctl list_vhosts > rabbitmq_vhosts.txt
rabbitmqctl list_users > rabbitmq_users.txt
for vhost in $(rabbitmqctl list_vhosts -q); do
rabbitmqctl list_permissions -p $vhost >> rabbitmq_permissions.txt
rabbitmqctl list_queues -p $vhost name messages >> rabbitmq_queues.txt
rabbitmqctl list_exchanges -p $vhost >> rabbitmq_exchanges.txt
rabbitmqctl list_bindings -p $vhost >> rabbitmq_bindings.txt
done
# 3. 导出定义(JSON格式,包含所有配置vhost、用户、权限、队列、交换机和绑定)
rabbitmqadmin -u admin -p 000000 export rabbitmq_definitions_3.7.5.json
[root@rb1 remove_mq]# ls
rabbitmq_bindings.txt rabbitmq_exchanges.txt rabbitmq_queues.txt rabbitmq_vhosts.txt
rabbitmq_definitions_3.7.5.json rabbitmq_permissions.txt rabbitmq_users.txt
- 数据迁移
# 将定义文件从旧集群拷贝到当前目录
scp -r ip:/root/remove_mq .
- 在新集群(4.0.7)上导入定义:官网
注意修改文件里面的版本号和集群名称,以及自定义修改队列,用户,虚拟主机等属性!!!
可以通过这种方式批量修改队列从经典队列为仲裁队列
[root@localhost ~]# rabbitmqctl import_definitions rabbitmq_definitions_3.7.5.json
Importing definitions in JSON from a file at "rabbitmq_definitions_3.7.5.json" ...
Successfully started definition import. This process is asynchronous and can take some time. Watch target node logs for completion.
如果出现报错:那么就在配置文件中删除策略,这是最新版本中不支持策略的设置,通过仲裁队列替代这种镜像队列了。
"policies":[],将[]中的内容删除
Importing definitions in JSON from a file at "20250416-rabbitmq.json" ...
Error:
<<"Validation failed\n\n[{<<\"ha-mode\">>,<<\"all\">>},{<<\"ha-sync-mode\">>,<<\"automatic\">>}] are not recognised policy settings\n (//ha-all-queue)">>
- 配置迁移(没有旧集群没有就不管)
# 1. 迁移核心配置文件
scp /etc/rabbitmq/rabbitmq.conf user@new-server:/etc/rabbitmq/
scp /etc/rabbitmq/rabbitmq-env.conf user@new-server:/etc/rabbitmq/
# 2. 特别注意4.0.7中可能变更的配置项
# 例如: 磁盘告警阈值、流控设置等可能需要调整
- 验证迁移
# 检查集群状态
rabbitmqctl cluster_status
比较关键指标,查看用户、队列、虚拟主机等信息是否一致即可

浙公网安备 33010602011771号