快速操作指南
# 一、部署架構
# 整體架構
┌─────────────────────────────────────────────────────────────┐
│ 客户端层 │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │ 生产者应用 │ │ 消费者应用 │ │ 管控台/Web管理 │ │
│ └─────────────┘ └─────────────┘ └─────────────────────┘ │
└────────────────────────┬────────────────────────────────────┘
│ AMQP/MQTT/STOMP
┌────────────────────────▼────────────────────────────────────┐
│ 消息引擎层 │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ ADMQ for RabbitMQ 节点 │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌──────────────┐ │ │
│ │ │ 连接层 │ │ 交换机 │ │ 队列 │ │ │
│ │ │ Connection │ │ Exchange │ │ Queue │ │ │
│ │ └─────────────┘ └─────────────┘ └──────────────┘ │ │
│ │ │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌──────────────┐ │ │
│ │ │ 路由层 │ │ 镜像队列 │ │ 持久化存储 │ │ │
│ │ │ Router │ │Mirror Queue │ │ Mnesia/ETS │ │ │
│ │ └─────────────┘ └─────────────┘ └──────────────┘ │ │
│ └───────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
│
┌────────────────────────▼────────────────────────────────────┐
│ 集群通信层 │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ Erlang Distribution 网络 │ │
│ │ (节点间元数据同步与心跳检测) │ │
│ └───────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 部署模式
| 部署模式 | 節點數 | 適用場景 | 高可用性 |
|---|---|---|---|
| 單機部署 | 1 節點 | 開發測試 | 無 |
| 普通叢集 | 2+ 節點 | 生產環境 | 元資料高可用 |
| 映象佇列叢集 | 3+ 節點 | 生產環境 | 元資料+資料高可用 |
# 二、快速安裝
# 1. 環境準備
| 元件 | 最低要求 | 推薦配置 |
|---|---|---|
| CPU | 4 核 | 8 核及以上 |
| 記憶體 | 8 GB | 16 GB 及以上 |
| 磁碟 | 100 GB SSD | 500 GB 及以上 SSD |
| 作業系統 | CentOS 7+, Ubuntu 18.04+, 麒麟, 統信 | - |
埠要求:
| 埠 | 用途 |
|---|---|
| 5672 | AMQP 協定 |
| 15672 | Web 管理介面 |
| 25672 | 叢集節點間通訊 |
# 2. 單機安裝
# 建立目錄
mkdir -p /apusic && cd /apusic
# 解壓安裝包
tar zxvf ADMQ-V2.0.6.xxx.tar.gz
cd admq-rabbitmq
# 放置 license.xml 授權檔案到根目錄
# 修改主機名(只能包含字母、數字、連字元)
hostname node1
# 啟動服務
bin/admq-daemon start rabbitmq server
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 3. 叢集安裝(3 節點)
所有節點執行:
mkdir -p /apusic && cd /apusic
tar zxvf ADMQ-V2.0.6.xxx.tar.gz
cd admq-rabbitmq
# 放置 license.xml
# 修改主機名
hostname node171 # node172, node173
# 配置 /etc/hosts
172.20.140.171 node171
172.20.140.172 node172
172.20.140.173 node173
# 啟動服務
bin/admq-daemon start rabbitmq server
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Node 1 執行叢集建立:
bin/admq rabbitmq cluster add -s 172.20.140.172:58181 -u monitor -p apusic_123
bin/admq rabbitmq cluster add -s 172.20.140.173:58181 -u monitor -p apusic_123
1
2
2
開啟映象佇列(可選):
bin/admq rabbitmq admin ctl set_policy ha-all "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
1
# 三、核心概念
# 訊息模型
Producer -> Exchange -> [Binding/Routing Key] -> Queue -> Consumer
1
# 交換機型別
| 型別 | 路由方式 | 適用場景 |
|---|---|---|
| Direct | 精確匹配 Routing Key | 點對點訊息 |
| Fanout | 廣播到所有佇列 | 廣播通知 |
| Topic | 模式匹配 * # | 日誌分類、事件路由 |
| Headers | 基於訊息頭匹配 | 複雜條件路由 |
# 佇列型別
| 型別 | 特點 | 適用場景 |
|---|---|---|
| Classic Queue | 傳統佇列,支援映象 | 一般業務場景 |
| Quorum Queue | 基於 Raft,自動多副本 | 高可用場景 |
| Stream Queue | 只追加日誌,支援多次讀取 | 高吞吐、日誌場景 |
# 四、常用命令速查
# 服務管理
# 啟動/停止/重啟
bin/admq-daemon start rabbitmq server
bin/admq-daemon stop rabbitmq server
bin/admq-daemon restart rabbitmq server
# 應用啟停
bin/admq rabbitmq admin ctl start_app
bin/admq rabbitmq admin ctl stop_app
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 狀態檢視
# 節點狀態
bin/admq rabbitmq admin ctl status
# 叢集狀態
bin/admq rabbitmq admin ctl cluster_status
# 健康檢查
bin/admq rabbitmq admin diagnostics health_check
# 記憶體使用
bin/admq rabbitmq admin diagnostics memory_breakdown
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 使用者管理
# 建立使用者
bin/admq rabbitmq admin ctl add_user username password
bin/admq rabbitmq admin ctl set_user_tags username administrator
bin/admq rabbitmq admin ctl set_permissions -p /vhost username ".*" ".*" ".*"
# 修改密碼
bin/admq rabbitmq admin ctl change_password username newpassword
# 刪除使用者
bin/admq rabbitmq admin ctl delete_user username
# 檢視使用者
bin/admq rabbitmq admin ctl list_users
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 佇列管理
# 檢視佇列
bin/admq rabbitmq admin ctl list_queues
bin/admq rabbitmq admin ctl list_queues name messages consumers
# 檢視交換機
bin/admq rabbitmq admin ctl list_exchanges name type
# 檢視連線
bin/admq rabbitmq admin ctl list_connections peer_host state
# 檢視通道
bin/admq rabbitmq admin ctl list_channels connection consumer_count
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 叢集管理
# 檢視叢集狀態
bin/admq rabbitmq admin ctl cluster_status
# 檢視佇列詳情(含映象)
bin/admq rabbitmq admin ctl list_queues name pid slave_pids synchronised_slave_pids
# 移除故障節點
bin/admq rabbitmq admin ctl forget_cluster_node rabbit@node2
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 策略管理
# 檢視策略
bin/admq rabbitmq admin ctl list_policies
# 設定映象策略
bin/admq rabbitmq admin ctl set_policy ha-all "^" '{"ha-mode":"all"}' --priority 0 --apply-to queues
# 清除策略
bin/admq rabbitmq admin ctl clear_policy ha-all
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 備份恢復
# 匯出配置
bin/admq rabbitmq admin ctl export_definitions /backup/definitions.json
# 匯入配置
bin/admq rabbitmq admin ctl import_definitions /backup/definitions.json
# 備份 Mnesia
bin/admq rabbitmq admin ctl eval 'rabbit_mnesia:backup("/backup/mnesia.backup").'
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 五、日常運維
# 日誌位置
| 日誌型別 | 路徑 |
|---|---|
| 服務日誌 | ./log/rabbitmq/rabbit@hostname.log |
| 啟動日誌 | ./log/rabbitmq/rabbit@hostname-sasl.log |
| 管控臺日誌 | ./logs/ |
# 日常檢查清單
| 檢查項 | 命令 | 正常標準 |
|---|---|---|
| 節點狀態 | bin/admq rabbitmq admin ctl status | 執行正常 |
| 叢集狀態 | bin/admq rabbitmq admin ctl cluster_status | 所有節點線上 |
| 佇列堆積 | bin/admq rabbitmq admin ctl list_queues messages | 無異常堆積 |
| 記憶體使用 | bin/admq rabbitmq admin ctl status | 低於水位線 |
| 磁碟空間 | df -h | 高於 disk_free_limit |
# 健康檢查指令碼
#!/bin/bash
# 節點健康檢查
bin/admq rabbitmq admin diagnostics health_check
# 記憶體檢查
bin/admq rabbitmq admin diagnostics memory_breakdown
# 告警佇列檢查(訊息數 > 10000)
bin/admq rabbitmq admin ctl list_queues name messages consumers | awk '$2 > 10000 {print "WARNING: Queue "$1" has "$2" messages"}'
# 連線數檢查
CONN_COUNT=$(bin/admq rabbitmq admin ctl list_connections | wc -l)
if [ $CONN_COUNT -gt 1000 ]; then
echo "WARNING: Connection count $CONN_COUNT exceeds threshold"
fi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 六、配置最佳化
# rabbitmq.conf 核心配置
# 網路
listeners.tcp.default = 5672
listeners.ssl.default = 5671
# 記憶體(推薦 0.6-0.7)
vm_memory_high_watermark.relative = 0.6
vm_memory_high_watermark_paging_ratio = 0.5
# 磁碟(推薦絕對值 1GB)
disk_free_limit.relative = 1.5
disk_free_limit.absolute = 1GB
# 連線
channel_max = 2047
heartbeat = 30
# 佇列
queue_master_locator = min-masters
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 系統最佳化
# 檔案描述符
ulimit -n 65535
# 核心引數(/etc/sysctl.conf)
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_tw_reuse = 1
net.core.somaxconn = 65535
vm.swappiness = 10
# 磁碟排程
echo deadline > /sys/block/sda/queue/scheduler
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 七、故障排查
# 服務無法啟動
| 現象 | 可能原因 | 解決方案 |
|---|---|---|
| 埠被佔用 | 5672/15672 被佔用 | 停止佔用程序或修改埠 |
| Cookie 不一致 | 叢集節點 Cookie 不匹配 | 同步 .erlang.cookie |
| 記憶體不足 | 系統記憶體不足 | 增加記憶體或降低水位線 |
| 磁碟不足 | 低於 disk_free_limit | 清理磁碟或調整限制 |
# 訊息消費異常
| 現象 | 可能原因 | 解決方案 |
|---|---|---|
| 訊息堆積 | 消費者過慢或離線 | 增加消費者或最佳化邏輯 |
| 訊息丟失 | 未啟用持久化 | 啟用 delivery_mode=2 |
| 重複消費 | 確認超時 | 最佳化處理邏輯,及時確認 |
# 叢集異常
| 現象 | 可能原因 | 解決方案 |
|---|---|---|
| 節點離線 | 網路故障 | 檢查網路,重啟服務 |
| 腦裂 | 網路分割 | 使用 forget_cluster_node 清理 |
| 佇列不可用 | 節點離線 | 使用映象佇列或 Quorum Queue |
# 診斷命令
# 檢視詳細資訊
bin/admq rabbitmq admin ctl status
bin/admq rabbitmq admin ctl cluster_status
bin/admq rabbitmq admin ctl list_connections peer_host peer_port state
bin/admq rabbitmq admin ctl list_queues name messages consumers memory
# 檢視記憶體/程序
bin/admq rabbitmq admin diagnostics memory_breakdown
bin/admq rabbitmq admin diagnostics processes
bin/admq rabbitmq admin diagnostics connections
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 八、安全加固
# 修改預設使用者
# 刪除預設 guest 使用者
bin/admq rabbitmq admin ctl delete_user guest
# 建立新管理員
bin/admq rabbitmq admin ctl add_user admin strongpassword
bin/admq rabbitmq admin ctl set_user_tags admin administrator
bin/admq rabbitmq admin ctl set_permissions -p / admin ".*" ".*" ".*"
1
2
3
4
5
6
7
2
3
4
5
6
7
# 防火牆配置
firewall-cmd --permanent --add-port=5672/tcp
firewall-cmd --permanent --add-port=15672/tcp
firewall-cmd --permanent --add-port=25672/tcp
firewall-cmd --reload
1
2
3
4
2
3
4
# SSL 配置
listeners.ssl.default = 5671
ssl_options.cacertfile = /path/to/ca_certificate.pem
ssl_options.certfile = /path/to/server_certificate.pem
ssl_options.keyfile = /path/to/server_key.pem
ssl_options.verify = verify_peer
ssl_options.fail_if_no_peer_cert = false
1
2
3
4
5
6
2
3
4
5
6
# 九、效能最佳化要點
# 佇列最佳化
Map<String, Object> args = new HashMap<>();
// 佇列長度限制
args.put("x-max-length", 100000);
args.put("x-max-length-bytes", 1073741824); // 1GB
// 訊息 TTL
args.put("x-message-ttl", 3600000); // 1小時
// 惰性佇列(減少記憶體)
args.put("x-queue-mode", "lazy");
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 用戶端最佳化
// 連線池 + 自動恢復
factory.setAutomaticRecoveryEnabled(true);
factory.setNetworkRecoveryInterval(5000);
// 單連線多通道
Connection connection = factory.newConnection();
for (int i = 0; i < 10; i++) {
Channel channel = connection.createChannel();
}
// QoS 預取
channel.basicQos(100);
// 批量確認
channel.basicAck(deliveryTag, true);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 監控指標
| 指標 | 說明 |
|---|---|
| rabbitmq_connections | 連線數 |
| rabbitmq_queue_messages | 總訊息數 |
| rabbitmq_node_mem_used | 記憶體使用量 |
| rabbitmq_node_disk_free | 磁碟剩餘空間 |
# 十、運維最佳實踐
- 定期檢查:建立日常檢查機制
- 監控告警:配置完善的監控告警體系
- 備份策略:定期備份配置和資料
- 容量規劃:提前評估並擴容
- 安全更新:及時更新安全修補程式
- 最小許可權:為業務使用者分配最小必要許可權
- 災難演練:定期進行故障恢復演練
技術支援:
- 網址:www.apusic.com
- 電話:400-855-5800
- 郵箱:support@apusic.com
编辑页面 (opens new window)