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 集群滾動遷移方案
- 順序停機:確保至少一半以上 Disc 節點在線。
- 遷移節點 A → 啟動 →
rabbitmq-diagnostics cluster_status
正常后再遷移下一節點。 - 遷移期間,客戶端采用 至少兩臺 Broker 的連接串,避免全部指向同一節點。
- 查看每次啟動的 Feature Flags 與 Cookie 是否一致:
rabbitmq-diagnostics -q feature_flags_enabled stat ~/.erlang.cookie
- 完成后在任意節點執行
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/... | 目錄權限 / SELinux | ls -ld /data/rabbitmq; getenforce |
duplicate node name detected | hostname 沖突或 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 加固與運維進階
- TLS / Mutual-TLS:在 5671/15671 端口啟用證書 →
rabbitmq.conf
[listeners.ssl]
. - Prometheus:
rabbitmq_prometheus
插件已默認集成,新增-p 9419:9419
暴露/metrics
。 - Quorum Queues & Streams:4.x 默認開啟,配合 SSD + RAID-10 可替代經典鏡像隊列。
- 自動化升級:配置
unattended-upgrades
僅對白名單包(erlang/ rabbitmq-server)放行,跨大版本前先rabbitmq-diagnostics upgrade_status
.
7.結語
本文以生產視角呈現 Ubuntu 上 RabbitMQ 4 的完整落地方案,重點打磨「數據-日志遷移」細枝末節,并兼顧單機、集群、IaC 三種場景。希望能讓你在最短時間內完成 高可靠、路徑清晰、可隨時回滾 的企業級部署,盡享 4.x 帶來的 Streams、高級監控、Quorum Queue 等特性。
有任何疑問,rabbitmq-diagnostics
+ 官方文檔索引幾乎可以解決 90% 難題,剩下 10% 拋給我,我們再一起深挖!