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

Ubuntu 一站式部署 RabbitMQ 4 并“彻底”迁移数据目录的终极实践

1 安装前准备

sudo apt update -y
sudo apt install -y curl gnupg apt-transport-https lsb-release jq

若计划将数据放到新磁盘(如 /dev/nvme0n1p1):

sudo mkfs.xfs /dev/nvme0n1p1
sudo mkdir /data
echo '/dev/nvme0n1p1 /data xfs defaults 0 0' | sudo tee -a /etc/fstab
sudo mount -a

2 官方仓库 + Erlang + RabbitMQ

Team RabbitMQ 在 Cloudsmith 维护滚动更新仓库,可同步 Erlang 子包。

## 2.1 导入 3 把签名钥匙
curl -1sLf "https://keys.openpgp.org/vks/v1/by-fingerprint/0A9AF2115F4687BD29803A206B73A36E6026DFCA" \| sudo gpg --dearmor -o /usr/share/keyrings/com.rabbitmq.team.gpg
curl -1sLf https://github.com/rabbitmq/signing-keys/releases/download/3.0/cloudsmith.rabbitmq-erlang.E495BB49CC4BBE5B.key \| sudo gpg --dearmor -o /usr/share/keyrings/rabbitmq.erlang.gpg
curl -1sLf https://github.com/rabbitmq/signing-keys/releases/download/3.0/cloudsmith.rabbitmq-server.9F4587F226208342.key \| sudo gpg --dearmor -o /usr/share/keyrings/rabbitmq.server.gpg## 2.2 写入仓库列表
DIST=$(lsb_release -cs)             # focal / jammy / noble
sudo tee /etc/apt/sources.list.d/rabbitmq.list <<EOF
# Erlang
deb [arch=amd64 signed-by=/usr/share/keyrings/rabbitmq.erlang.gpg] \https://ppa1.rabbitmq.com/rabbitmq/rabbitmq-erlang/deb/ubuntu $DIST main
deb [arch=amd64 signed-by=/usr/share/keyrings/rabbitmq.erlang.gpg] \https://ppa2.rabbitmq.com/rabbitmq/rabbitmq-erlang/deb/ubuntu $DIST main
# RabbitMQ
deb [arch=amd64 signed-by=/usr/share/keyrings/rabbitmq.server.gpg] \https://ppa1.rabbitmq.com/rabbitmq/rabbitmq-server/deb/ubuntu $DIST main
deb [arch=amd64 signed-by=/usr/share/keyrings/rabbitmq.server.gpg] \https://ppa2.rabbitmq.com/rabbitmq/rabbitmq-server/deb/ubuntu $DIST main
EOF## 2.3 安装
sudo apt update -y
sudo apt install -y erlang-base erlang-asn1 erlang-crypto erlang-eldap \erlang-inets erlang-mnesia erlang-os-mon erlang-parsetools \erlang-public-key erlang-runtime-tools erlang-snmp erlang-ssl \erlang-syntax-tools erlang-tools erlang-xmerl
# 默认 latest;若固定 3.13.7:
# sudo apt install -y rabbitmq-server=3.13.7-1
sudo apt install -y rabbitmq-server

服务安装即启动,systemd 单元 rabbitmq-server.service 已开机自启。

3 功能验收 & Web UI

sudo rabbitmq-plugins enable rabbitmq_management
sudo rabbitmq-diagnostics check_running

浏览 http://<host>:15672(默认 guest/guest 仅限回环)。正式环境先建管理员并删除 guest:

sudo rabbitmqctl add_user admin 'Str0ngP@ss!'
sudo rabbitmqctl set_user_tags admin administrator
sudo rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
sudo rabbitmqctl delete_user guest

4 数据-日志目录迁移:全量细节

4.1 为什么、迁去哪、用哪种环境变量?

变量作用场景
RABBITMQ_MNESIA_BASE迁移 Mnesia(持久化消息 & 元数据)根分区容量紧张,日志放默认 /var/log
RABBITMQ_LOG_BASE迁移日志文件同上
RABBITMQ_BASE整个 RabbitMQ 运行目录(mnesia / log / plugins / pid 等)迁到同一路径云主机挂整块数据盘、一劳永逸
systemd Environment= 覆写不想写 rabbitmq-env.conf,单独管理每节点Kubernetes/Ansible 场景

官方《File and Directory Locations》详细说明了变量优先级:
systemd Environment > rabbitmq-env.conf > /etc/default > 内置默认

本文以 RABBITMQ_MNESIA_BASE + RABBITMQ_LOG_BASE 为例,演示单节点迁移;稍后补充 RABBITMQ_BASE 一键迁移脚本。

4.2 单节点迁移全流程(含验证 & 回滚)

# 1) 准备目录
sudo mkdir -p /data/rabbitmq/{mnesia,log}
sudo chown -R rabbitmq:rabbitmq /data/rabbitmq
sudo chmod 750 /data/rabbitmq# 2) 停节点并热备
sudo systemctl stop rabbitmq-server
sudo rsync -aH --progress /var/lib/rabbitmq/mnesia/ /data/rabbitmq/mnesia/
sudo rsync -aH --progress /var/log/rabbitmq/        /data/rabbitmq/log/# 3) 写 rabbitmq-env.conf
sudo tee /etc/rabbitmq/rabbitmq-env.conf <<'EOF'
RABBITMQ_MNESIA_BASE=/data/rabbitmq/mnesia
RABBITMQ_LOG_BASE=/data/rabbitmq/log
EOF# 4) 启动 & 验证
sudo systemctl start rabbitmq-server
sudo rabbitmq-diagnostics -q check_running
sudo rabbitmqctl status | grep -A3 "Directory"
# ≥4.1 输出示例
#    "Data directory" => "/data/rabbitmq/mnesia",
#    "Log file(s)"    => "/data/rabbitmq/log/rabbit@host.log",
自动回滚脚本
#/usr/local/bin/rabbitmq-rollback.sh
sudo systemctl stop rabbitmq-server
sudo sed -i '/^RABBITMQ_MNESIA_BASE/d;/^RABBITMQ_LOG_BASE/d' /etc/rabbitmq/rabbitmq-env.conf
sudo systemctl start rabbitmq-server
echo "Rollback OK"

TIPS

  • rsync 后不立即删除旧目录,观察 24 h 无异常再清理。
  • AppArmor/SELinux 默认允许新路径,若自定义 profile 需加规则。
  • 如果要完全迁走,省事做法:
    mkdir /data/rmq && chown rabbitmq:rabbitmq /data/rmq  
    echo 'RABBITMQ_BASE=/data/rmq' | sudo tee /etc/rabbitmq/rabbitmq-env.conf  
    rsync -aH /var/lib/rabbitmq/ /data/rmq  
    

4.3 集群滚动迁移方案

  1. 顺序停机:确保至少一半以上 Disc 节点在线。
  2. 迁移节点 A → 启动 → rabbitmq-diagnostics cluster_status 正常后再迁移下一节点。
  3. 迁移期间,客户端采用 至少两台 Broker 的连接串,避免全部指向同一节点。
  4. 查看每次启动的 Feature Flags 与 Cookie 是否一致:
    rabbitmq-diagnostics -q feature_flags_enabled  
    stat ~/.erlang.cookie  
    
  5. 完成后在任意节点执行 rabbitmqctl rotate_feature_flags_file,保证文件路径随 RABBITMQ_BASE 同步(4.x 新功能)。

4.4 在 IaC / systemd 中覆写

sudo systemctl edit rabbitmq-server
# 写入
[Service]
Environment="RABBITMQ_MNESIA_BASE=/data/rabbitmq/mnesia"
Environment="RABBITMQ_LOG_BASE=/data/rabbitmq/log"
# 保存退出
sudo systemctl daemon-reload
sudo systemctl restart rabbitmq-server

优点:不改任何包文件,易于 Ansible / SaltStack 模块化。

5 常见故障定位表

现象原因一键诊断
permission denied open /data/...目录权限 / SELinuxls -ld /data/rabbitmq; getenforce
duplicate node name detectedhostname 冲突或 Cookie 改变hostnamectl + cat ~/.erlang.cookie
Waiting for Mnesia tables 长时间卡住rsync 未包含硬链接 / inode 改变rabbitmq-diagnostics -q check_local_alarms 查看 disk_free 告警
systemd 环境变量无效忘记 daemon-reload 或路径写错systemctl show -p Environment rabbitmq-server

6 加固与运维进阶

  1. TLS / Mutual-TLS:在 5671/15671 端口启用证书 → rabbitmq.conf [listeners.ssl].
  2. Prometheusrabbitmq_prometheus 插件已默认集成,新增 -p 9419:9419 暴露 /metrics
  3. Quorum Queues & Streams:4.x 默认开启,配合 SSD + RAID-10 可替代经典镜像队列。
  4. 自动化升级:配置 unattended-upgrades 仅对白名单包(erlang/ rabbitmq-server)放行,跨大版本前先 rabbitmq-diagnostics upgrade_status.

7.结语

本文以生产视角呈现 Ubuntu 上 RabbitMQ 4 的完整落地方案,重点打磨「数据-日志迁移」细枝末节,并兼顾单机、集群、IaC 三种场景。希望能让你在最短时间内完成 高可靠、路径清晰、可随时回滚 的企业级部署,尽享 4.x 带来的 Streams、高级监控、Quorum Queue 等特性。
有任何疑问,rabbitmq-diagnostics + 官方文档索引几乎可以解决 90% 难题,剩下 10% 抛给我,我们再一起深挖!

相关文章:

  • 【回眸】Aurix TC397 IST 以太网 UDP 相关开发
  • 观成科技:摩诃草组织Spyder下载器流量特征分析
  • SpringCloud——负载均衡
  • Mediamtx与FFmpeg远程与本地推拉流使用
  • 信息系统项目管理工程师备考计算类真题讲解七
  • 【晶振】晶振的工作原理及其与单片机关系
  • 【C语言】C语言中的联合体与枚举类型
  • 网站高可用架构设计基础——高可用策略和架构原则
  • 关于nginx,负载均衡是什么?它能给我们的业务带来什么?怎么去配置它?
  • Spring Boot + MyBatis-Plus 的现代开发模式
  • uniapp跨平台开发---switchTab:fail page `/undefined` is not found
  • HTML邮件背景图兼容 Outlook
  • HTML响应式网页设计与跨平台适配
  • 基于RFID的智能家居系统设计与实现
  • C++:函数重载
  • 【Python Web开发】02-Socket网络编程02
  • 从零到精通:全面解析人工智能的核心技术与发展趋势
  • 矩阵运营的限流问题本质上是平台与创作者之间的流量博弈
  • 高德MCP制作旅游攻略
  • NLP高频面试题(五十三)——深度学习正则化详解
  • 《哪吒之魔童降世》电影版权方诉《仙侠神域》游戏运营方侵权案开庭
  • 鸿蒙智行八大车型亮相上海车展,余承东拉上三家车企老总“直播推销”
  • 2024年度全国十大考古新发现公布,武王墩一号墓等入选
  • 北京顺义潮白河大桥主跨坍塌原因公布,已成立事故调查组
  • 金融监管总局:支持将上海打造成具有国际竞争力的再保险中心
  • 这场宣介会,重庆市委书记和中联部部长同台为外宾答疑解惑