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% 抛给我,我们再一起深挖!

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

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

相关文章

5.2.3 WPF 中 XAML 文件 Converter 使用介绍

Converter&#xff08;转换器&#xff09;在 WPF 数据绑定中扮演着重要角色&#xff0c;用于在源数据和目标属性之间进行值转换 举例来说&#xff1a;我想用一个bool量来控制一个背景&#xff0c;为true时&#xff0c;显示红色&#xff1b;为false时背景用默认颜色。因此 Backg…

MySQL 8 自动安装脚本(CentOS-7 系统)

文章目录 一、MySQL 8 自动安装脚本脚本说明&#x1f4cc; 使用脚本前提条件1. 操作系统2. 用户权限3. 网络要求 &#x1f4cc; 脚本的主要功能1. 环境检查2. MySQL 自动安装3. 自动配置 MySQL4. 防火墙配置5. 验证与输出 &#x1f4cc; 适用场景 二、执行sh脚本1. 给予脚本执行…

Python跨平台桌面应用程序开发

引言 在当今软件开发领域&#xff0c;跨平台应用程序开发变得越来越重要。用户希望无论使用Windows、macOS还是Linux系统&#xff0c;都能获得一致的应用体验。Python作为一种高级编程语言&#xff0c;凭借其简洁的语法和丰富的库生态系统&#xff0c;成为了跨平台桌面应用程序…

使用 Docker 安装 SQL Server 2022 并解决 Navicat 连接问题

在使用 Docker 安装 SQL Server 时&#xff0c;很多人可能遇到过无法通过 Navicat 等数据库客户端连接到容器的情况。尤其是尝试使用 mcr.microsoft.com/mssql/server:2022-latest 镜像时&#xff0c;可能会发现 Navicat一直转圈&#xff0c;无法连接到数据库。在这篇博客中&am…

2025最新软件测试面试八股文(答案+文档+视频讲解)

1、你的测试职业发展是什么&#xff1f; 测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有初步的职业规划&#xff0c;前3年积累测试经验&#xff0c;按如何做好测试工程师的要点去要求自己&…

理解计算机系统_网络编程(2)

前言 以<深入理解计算机系统>(以下称“本书”)内容为基础&#xff0c;对程序的整个过程进行梳理。本书内容对整个计算机系统做了系统性导引,每部分内容都是单独的一门课.学习深度根据自己需要来定 引入 接续上一篇理解计算机系统_网络编程(1)-CSDN博客 国际互联…

【盈达科技】GEO(生成式引擎优化)底层逻辑

​​一、GEO的现状​​ ​​技术快速迭代​​ 生成式AI&#xff08;如ChatGPT、Claude、Google SGE&#xff09;正在成为用户获取信息的核心入口&#xff0c;传统搜索引擎的流量被分流。主流平台如Google推出“生成式搜索体验&#xff08;SGE&#xff09;”&#xff0c;Bing整合…

VS Code 智能代理模式:重塑开发体验

在编程领域&#xff0c;效率与精准度无疑是开发者们永恒的追求。而如今&#xff0c;VS Code 推出的智能代理模式&#xff08;Agent Mode&#xff09;&#xff0c;正以前所未有的方式&#xff0c;彻底颠覆了传统开发流程&#xff0c;为程序员们带来了一场前所未有的效率革命。本…

【回眸】Aurix TC397 IST 以太网 UDP 相关开发

前言 关于移植IST功能至 Infineon TC397上主要涉及到UDP发送报文及接收。IST是安全诊断相关的工作 Nvidia IST介绍 Orin系列芯片会提供一种机制来检测由系统内测&#xff08;IST&#xff09;所产生的永久的故障&#xff0c;IST 应该在 Orin-x 功能安全系统中使用期间被启动。…

Mediamtx与FFmpeg远程与本地推拉流使用

1.本地推拉流 启服 推流 ffmpeg -re -stream_loop -1 -i ./DJI_0463.MP4 -s 1280x720 -an -c:v h264 -b:v 2000k -maxrate 2500k -minrate 1500k -bufsize 3000k -rtsp_transport tcp -f rtsp rtsp://127.0.0.1:8554/stream 拉流 ffplay -rtsp_transport tcp rtsp://43.136.…

使用QML Tumbler 实现时间日期选择器

目录 引言相关阅读项目结构示例实现与代码解析示例一&#xff1a;时间选择器&#xff08;TimePicker&#xff09;示例二&#xff1a;日期时间选择器&#xff08;DateTimePicker&#xff09; 主窗口整合运行效果总结下载链接 引言 在现代应用程序开发中&#xff0c;时间与日期选…

R语言中的常用内置函数

常用的数值函数 常用的字符函数 与概率分布相关的函数 有用的统计函数 数据来源:《数据挖掘与数据分析&#xff1a;基于R语言》王阳 2024年1月出版

org.springframework.core.env.PropertiesPropertySource 类详解

org.springframework.core.env.PropertiesPropertySource 类详解 1. 基本概述 类路径: org.springframework.core.env.PropertiesPropertySource继承关系: 继承自 PropertySource<Properties>&#xff0c;实现 PropertySource 接口。作用: 将 Java Properties 对象&…

2025-04-22 李沐深度学习5 —— 线性回归

文章目录 1 案例介绍1.1 应用场景&#xff1a;美国房价预测1.2 核心假设1.3 线性回归与神经网络的关系1.4 平方损失&#xff08;L2 Loss&#xff09;1.5 训练模型&#xff1a;最小化损失 2 基础优化算法2.1 梯度下降2.2 小批量随机梯度下降&#xff08;Mini-batch SGD&#xff…

你的大模型服务如何压测:首 Token 延迟、并发与 QPS

写在前面 大型语言模型(LLM)API,特别是遵循 OpenAI 规范的接口(无论是 OpenAI 官方、Azure OpenAI,还是 DeepSeek、Moonshot 等众多兼容服务),已成为驱动下一代 AI 应用的核心引擎。然而,随着应用规模的扩大和用户量的增长,仅仅关注模型的功能是不够的,API 的性能表…

数字化转型避坑指南:中钧科技如何用“四个锚点”破解转型深水区

数字化转型浪潮下&#xff0c;企业常陷入四大典型陷阱&#xff1a;跟风式投入、数据沼泽化、流程伪在线、安全裸奔化。中钧科技旗下产品以“经营帮”平台为核心&#xff0c;通过针对性方案帮助企业绕开深坑。 陷阱一&#xff1a;盲目跟风&#xff0c;为数字化而数字化 许…

时分复用、频分复用和码分复用简要比较分析

时分复用&#xff08;TDM&#xff09;、频分复用&#xff08;FDM&#xff09;和码分复用&#xff08;CDM&#xff09;是经典的多路复用技术&#xff0c;它们通过不同的方式共享信道资源。以下是两者的详细比较及其优缺点&#xff1a; 1. 原理对比 时分复用&#xff08;TDM&…

MCP认证难题破解:常见技术难题实战分析与解决方案

MCP认证难题破解:常见技术难题实战分析与解决方案 一、引言:MCP认证——智能协作领域的“技术试金石” MCP(Multi-agent Communication Protocol)认证作为多智能体系统领域的权威认证,旨在考察考生对MCP协议设计、智能体协作架构、分布式系统优化等核心技术的掌握程度。…

最新iOS性能测试方法与教程

一、工具instrument介绍 使用Xcode的instrument进行测试&#xff0c;instrument自带了很多性能方面的测试工具&#xff0c;如图所示&#xff1a; 二、常见性能测试内容 不管是安卓还是iOS的性能测试&#xff0c;常见的性能测试都要包含这五个方面&#xff1a; 1、内存&#xff…

Vue el-checkbox 虚拟滚动解决多选框全选卡顿问题 - 高性能处理大数据量选项列表

一、背景 在我们开发项目中&#xff0c;经常会遇到需要展示大量选项的多选框场景&#xff0c;比如权限配置、数据筛选等。当选项数量达到几百甚至上千条时&#xff0c;传统的渲染方式全选时会非常卡顿&#xff0c;导致性能问题。本篇文章&#xff0c;记录我使用通过虚拟滚动实现…