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.pswp.cn/pingmian/78014.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/78014.shtml
英文地址,請注明出處:http://en.pswp.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;記錄我使用通過虛擬滾動實現…