RabbitMQ 集群降配

這里寫自定義目錄標題

    • 摘要
    • 檢查狀態
      • 1. 檢查 RabbitMQ 服務狀態
      • 2. 檢查 RabbitMQ 端口監聽
      • 3. 檢查 RabbitMQ 管理插件是否啟用
      • 4. 檢查開機自啟狀態
      • 5. 確認集群高可用性
      • 6. 檢查使用該集群的服務是否做了斷開重連
    • 實操
      • 1. 負載均衡配置
      • 2. 逐個節點降配(滾動操作)
        • 2.1 停止 RabbitMQ 服務
        • 2.2 調整 ECS 配置
        • 2.3 恢復節點并重新加入集群
        • 2.4 恢復負載均衡流量
      • 3. 全局監控與驗證
      • 4. 降配后優化(可選)
      • 風險點與應對
      • 總結
    • 命令說明
      • 查看集群狀態命令 rabbitmqctl cluster_status
        • 1. 集群節點狀態
        • 2. 網絡分區
        • 3. 告警狀態
        • 4. 集群名稱
        • 健康狀態總結
        • 進一步驗證建議
          • 1. 檢查隊列鏡像狀態
          • 2. 檢查資源使用情況
          • 3. 檢查日志
          • 4. 監控連接數
      • 查看節點同步狀態 rabbitmqctl list_queues name pid slave_pids synchronised_slave_pids
        • 字段含義
        • 如何判斷鏡像同步完成
      • 刪除隊列
        • 在 RabbitMQ 中執行刪除隊列(`delete_queue`)操作時,如果出現 `Access refused` 錯誤,通常是由于權限問題導致的。以下是可能的原因及解決方法:
          • 1. 用戶權限不足
            • 檢查用戶權限
            • 解決方法
          • 2. 隊列被其他消費者占用
            • 解決方法
          • 3. 用戶未綁定到正確的虛擬主機
            • 檢查虛擬主機
            • 解決方法

摘要

背景:2025年云成本優化仍是技術團隊的核心命題。當前需對遺留架構進行精細化治理,其中由前任架構師設計的RabbitMQ集群成為重點優化對象。該集群采用經典高可用架構,由3臺阿里云ECS實例構成核心節點,并通過負載均衡(SLB)實現流量分發。然而,經監控分析發現,節點資源利用率長期低于40%,存在顯著的配置冗余。在保障業務連續性的前提下,需通過降配調優實現成本節約。
自建RabbitMQ集群

ECS 配置:8C16G,CPU利用率 峰值18%, 內存峰值 25%
降配目標:平滑的將ECS節點降配至 2C8G
在這里插入圖片描述

檢查狀態

1. 檢查 RabbitMQ 服務狀態

使用 systemctl 命令查看服務是否正在運行:

sudo systemctl status rabbitmq-server
  • 輸出結果
    • 如果顯示 active (running),表示服務已啟動。
    • 如果顯示 inactive (dead),表示服務未運行。

2. 檢查 RabbitMQ 端口監聽

RabbitMQ 默認監聽 5672(AMQP 協議)和 15672(管理界面)端口:

# 使用 netstat 或 ss 命令檢查端口
sudo netstat -tuln | grep -E '5672|15672'
# 或
sudo ss -tuln | grep -E '5672|15672'
  • 輸出結果:如果有 LISTEN 狀態的端口,說明服務正常。

3. 檢查 RabbitMQ 管理插件是否啟用

若需通過 Web 界面管理 RabbitMQ,需確認管理插件是否啟用:

sudo rabbitmq-plugins list
  • 輸出結果:查找 rabbitmq_management 是否標記為 [E*](已啟用)。

4. 檢查開機自啟狀態

確認 RabbitMQ 是否設置為開機自啟:

sudo systemctl is-enabled rabbitmq-server
  • 輸出結果
    • enabled:已設置開機自啟。
    • disabled:未設置開機自啟(可通過 sudo systemctl enable rabbitmq-server 啟用)。

5. 確認集群高可用性

  • 鏡像隊列配置:確保所有業務隊列已配置鏡像策略(如 ha-mode: all 或指定副本數),避免單節點故障導致消息丟失。
    # 查看當前策略
    rabbitmqctl list_policies
    # 示例:設置所有隊列在3個節點鏡像
    rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
    
  • 集群狀態健康:確認所有節點狀態為 running,且無網絡分區問題。
    rabbitmqctl cluster_status
    

6. 檢查使用該集群的服務是否做了斷開重連

實操

1. 負載均衡配置

  • 設置待降配節點的權重:在負載均衡(如 SLB)中暫時設置待操作節點的流量權重為0,確保降配期間流量僅路由到其他節點。

2. 逐個節點降配(滾動操作)

2.1 停止 RabbitMQ 服務
sudo systemctl stop rabbitmq-server
  • 驗證節點離線:檢查集群狀態,確認該節點已標記為 down
    rabbitmqctl cluster_status
    
2.2 調整 ECS 配置
  • 關機 ECS
  • 降配操作:通過 ECS 控制臺或 API 調整實例規格(CPU/內存)。
  • 重啟 ECS(如需):若配置變更需要重啟,確保重啟后網絡和存儲正常掛載。
2.3 恢復節點并重新加入集群
  • 啟動 RabbitMQ
    sudo systemctl start rabbitmq-server
    
  • 重新加入集群:如果節點因 IP 或主機名變化無法自動加入,需手動操作(一般不需要重新加入)
    # 在新節點上重置 RabbitMQ 并重新加入集群
    rabbitmqctl stop_app
    rabbitmqctl reset
    rabbitmqctl join_cluster rabbit@<主節點主機名>
    rabbitmqctl start_app
    
  • 驗證集群狀態:確保節點狀態為 running,且隊列鏡像同步完成。
2.4 恢復負載均衡流量
  • 將節點權重恢復,觀察健康檢查狀態。

3. 全局監控與驗證

  • 業務監控:觀察消息堆積、消費延遲、連接數等指標。
  • 集群同步狀態:檢查鏡像隊列同步進度。
    rabbitmqctl list_queues name messages_ready messages_unacknowledged
    
  • 日志檢查:排查降配節點是否有異常報錯。
    tail -f /var/log/rabbitmq/rabbit@*.log
    

4. 降配后優化(可選)

  • 調整內存閾值:根據新配置優化 RabbitMQ 內存限制(vm_memory_high_watermark)。
  • 磁盤空間監控:確保降配后的磁盤容量足夠(RabbitMQ 默認需至少 50MB 剩余空間)。

風險點與應對

  1. 同步延遲:降配節點重啟后,若隊列數據量大,同步時間可能較長。建議在低峰期操作。
  2. 配置兼容性:確保新規格滿足 RabbitMQ 最低要求(如內存不低于 1GB)。
  3. 網絡波動:降配期間若節點 IP 變化,需更新集群節點列表和負載均衡配置。

總結

通過 逐節點滾動降配 + 負載均衡流量切換,可實現業務無感知。關鍵點在于確保鏡像隊列冗余、集群健康狀態,以及操作順序的嚴謹性。建議先在測試環境模擬流程,再在生產環境執行。

命令說明

查看集群狀態命令 rabbitmqctl cluster_status

輸出結果解析

Cluster status of node rabbit@rabbitmq-prod-03 ...
[{nodes,[{disc,['rabbit@rabbitmq-prod-01','rabbit@rabbitmq-prod-02','rabbit@rabbitmq-prod-03']}]},{running_nodes,['rabbit@rabbitmq-prod-02','rabbit@rabbitmq-prod-01','rabbit@rabbitmq-prod-03']},{cluster_name,<<"rabbit@rabbitmq-prod-01">>},{partitions,[]},{alarms,[{'rabbit@rabbitmq-prod-02',[]},{'rabbit@rabbitmq-prod-01',[]},{'rabbit@rabbitmq-prod-03',[]}]}].
1. 集群節點狀態
  • 所有節點均在線
    • {nodes} 列表顯示集群包含 3 個磁盤節點(disc 類型):rabbit@rabbitmq-prod-01, rabbit@rabbitmq-prod-02, rabbit@rabbitmq-prod-03
    • {running_nodes} 列表顯示這 3 個節點當前都在運行。
2. 網絡分區
  • 無網絡分區
    • {partitions,[]} 表示沒有發生網絡分區問題。如果存在分區,partitions 字段會列出被隔離的節點及其分區信息。
3. 告警狀態
  • 無告警
    • {alarms,[{'rabbit@rabbitmq-prod-02',[]}, {'rabbit@rabbitmq-prod-01',[]}, {'rabbit@rabbitmq-prod-03',[]}]} 表明所有節點均未觸發任何告警(如內存、磁盤空間不足等)。
4. 集群名稱
  • 集群名稱一致
    • {cluster_name,<<"rabbit@rabbitmq-prod-01">>} 顯示集群的名稱為 rabbit@rabbitmq-prod-01,所有節點共享同一個集群名稱,表明它們屬于同一集群。

健康狀態總結

從上述分析來看,你的 RabbitMQ 集群處于健康狀態

  1. 所有節點都在線且正常運行。
  2. 沒有網絡分區問題。
  3. 沒有任何節點觸發告警。
  4. 集群名稱一致,結構完整。

進一步驗證建議

雖然當前狀態健康,但為了確保長期穩定運行,可以執行以下檢查:

1. 檢查隊列鏡像狀態

確認隊列是否在多個節點上正確鏡像:

rabbitmqctl list_queues name pid slave_pids synchronised_slave_pids
  • 確保關鍵隊列的 slave_pidssynchronised_slave_pids 包含至少 2 個節點。
2. 檢查資源使用情況

監控節點的 CPU、內存和磁盤使用率,避免因資源不足導致性能下降或告警:

# 查看磁盤剩余空間
df -h# 查看內存使用情況
free -m# 查看 RabbitMQ 內存使用
rabbitmqctl status | grep -A 5 "memory"
3. 檢查日志

查看 RabbitMQ 日志文件,排查潛在的警告或錯誤:

tail -n 20 /var/log/rabbitmq/rabbit@*.log
4. 監控連接數

確保各節點的連接數在合理范圍內:

rabbitmqctl list_connections --node rabbit@rabbitmq-prod-03 | grep -v "Listing" | wc -l

查看節點同步狀態 rabbitmqctl list_queues name pid slave_pids synchronised_slave_pids

命令輸出解析
以下是 rabbitmqctl list_queues name pid slave_pids synchronised_slave_pids 的輸出示例:

name: collector_event
pid: <rabbit@rabbitmq-prod-03.1606707793.6080.60>
slave_pids: [<rabbit@rabbitmq-prod-02.1607654826.19286.68>, <rabbit@rabbitmq-prod-01.1606707802.17230.4475>]
synchronised_slave_pids: [<rabbit@rabbitmq-prod-01.1606707802.17230.4475>, <rabbit@rabbitmq-prod-02.1607654826.19286.68>]
字段含義
  1. name

    • 隊列名稱。例如:collector_event
  2. pid

    • 主隊列所在節點的進程 ID(Process ID)。例如:<rabbit@rabbitmq-prod-03.1606707793.6080.60> 表示主隊列位于 rabbit@rabbitmq-prod-03 節點。
  3. slave_pids

    • 副本隊列所在的節點和進程 ID 列表。例如:
      • <rabbit@rabbitmq-prod-02.1607654826.19286.68> 表示該副本位于 rabbit@rabbitmq-prod-02
      • <rabbit@rabbitmq-prod-01.1606707802.17230.4475> 表示該副本位于 rabbit@rabbitmq-prod-01
  4. synchronised_slave_pids

    • 已完成數據同步的副本隊列所在的節點和進程 ID 列表。例如:
      • <rabbit@rabbitmq-prod-01.1606707802.17230.4475><rabbit@rabbitmq-prod-02.1607654826.19286.68> 表示這兩個副本已完成同步。

如何判斷鏡像同步完成
  1. 比較 slave_pidssynchronised_slave_pids

    • 如果 synchronised_slave_pids 包含所有 slave_pids 中的節點,則表示所有副本均已同步完成。
    • 示例分析
      • slave_pids: [<rabbit@rabbitmq-prod-02>, <rabbit@rabbitmq-prod-01>]
      • synchronised_slave_pids: [<rabbit@rabbitmq-prod-01>, <rabbit@rabbitmq-prod-02>]
      • 結論synchronised_slave_pids 包含了所有 slave_pids,說明鏡像已完全同步。
  2. 檢查數量是否一致

    • 如果 slave_pidssynchronised_slave_pids 的數量相同,且內容一致,則鏡像同步完成。
  3. 異常情況

    • 如果 synchronised_slave_pids 為空或少于 slave_pids,則表示某些副本尚未完成同步,需等待同步完成后再繼續操作。可以到管理界面queue界面查看有哪些隊里沒有同步完成,可點擊進入隊列并手動同步。

刪除隊列

rabbitmqctl delete_queue -p  <host>  <queue_name>
在 RabbitMQ 中執行刪除隊列(delete_queue)操作時,如果出現 Access refused 錯誤,通常是由于權限問題導致的。以下是可能的原因及解決方法:
1. 用戶權限不足

RabbitMQ 的用戶權限分為三類:

  • Configure:允許創建和刪除隊列、交換器等資源。
  • Write:允許向隊列發送消息。
  • Read:允許從隊列消費消息。
檢查用戶權限

使用以下命令查看當前用戶的權限:

rabbitmqctl list_permissions -p <vhost>
  • <vhost> 是目標虛擬主機,默認為 /
  • 輸出示例:
    Listing permissions for vhost "/" ...
    user    configure   write   read
    guest   .*          .*      .*
    
解決方法

確保當前用戶對目標隊列所在的虛擬主機具有足夠的權限:

# 授予用戶對虛擬主機的權限
rabbitmqctl set_permissions -p <vhost> <username> ".*" ".*" ".*"
  • <username>:當前登錄 RabbitMQ 的用戶名。
  • "."*:表示匹配所有資源。

2. 隊列被其他消費者占用

如果隊列正在被其他消費者使用(例如有活躍的連接或未確認的消息),刪除操作可能會失敗。

解決方法
  • 停止消費者:確保沒有客戶端正在消費該隊列。
  • 清空隊列(可選):
    rabbitmqadmin delete queue name=<queue_name>
    
    或通過管理界面清空隊列。

3. 用戶未綁定到正確的虛擬主機

RabbitMQ 支持多虛擬主機(vhost)。如果用戶未綁定到目標隊列所在的虛擬主機,也會導致權限拒絕。

檢查虛擬主機

列出所有虛擬主機:

rabbitmqctl list_vhosts
解決方法

將用戶添加到正確的虛擬主機,并授予權限:

# 添加用戶到虛擬主機
rabbitmqctl add_user <username> <password>
rabbitmqctl set_permissions -p <vhost> <username> ".*" ".*" ".*"

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/73769.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/73769.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/73769.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

設計模式之外觀模式:原理、實現與應用

引言 外觀模式&#xff08;Facade Pattern&#xff09;是一種結構型設計模式&#xff0c;它通過提供一個統一的接口來簡化復雜系統的使用。外觀模式隱藏了系統的復雜性&#xff0c;使得客戶端可以通過一個簡單的接口與系統交互。本文將深入探討外觀模式的原理、實現方式以及實…

進行交通流預測,使用KAN+Transformer模型

理論基礎 KAN&#xff08;Knowledge Augmented Network&#xff09; KAN 是一種知識增強網絡&#xff0c;其核心思想是將先驗知識融入到神經網絡中&#xff0c;以此提升模型的性能與泛化能力。在交通流預測領域&#xff0c;先驗知識可以是交通規則、歷史交通模式等。通過把這…

TF中 Arg 節點

TF中 Arg 節點 在 TensorFlow 的計算圖中&#xff0c;_Arg 節點&#xff08;Argument Node&#xff09;表示函數的輸入參數&#xff0c;是計算圖中負責接收外部輸入數據的節點。它的名字來源于“Argument”&#xff08;參數&#xff09;&#xff0c;直接對應函數調用時傳入的張…

Educational Codeforces Round 176 (Rated for Div. 2)

A.To Zero 簽到題 void solve() { int n,k;cin>>n>>k;int k2k/2*2;int k1(k2<k)?k:k-1;int cnt0;if(n%21){n-k1;cnt;cnt(n/k2)(n%k2!0);}else {cnt(n/k2)(n%k2!0);}cout<<cnt<<endl;}B.Array Recoloring 手推一下可以發現&#xff0c;答案其實就…

Kubernetes的Service詳解

一、Service介紹 在 kubernetes 中&#xff0c; pod 是應用程序的載體&#xff0c;我們可以通過 pod 的 ip 來訪問應用程序&#xff0c;但是 pod 的 ip 地址不是固定的&#xff0c;這也就意味著不方便直接采用pod 的 ip 對服務進行訪問。 為了解決這個問題&#xff0c;kuberne…

基于Nvidia Jetson Nano邊緣計算設備使用TensorRT部署YOLOv8模型實現目標檢測推理

0、背景 最近拿到一臺邊緣計算設備&#xff0c;在部署YOLO模型的過程中遇到一些問題&#xff0c;特此記錄。 設備介紹信息&#xff1a;NVIDIA Jetson Orin Nano T201Developer Kit 開發套件 開發者套件&#xff1a;Jetson Orin Nano T201 8GB開發套件 使用指南文檔&#x…

讓人感到疑惑的const

const 關鍵字在不同的編程語言中有著不同的含義和限制&#xff0c;但通常它被用來聲明一個常量或只讀變量。然而&#xff0c;在 JavaScript 中&#xff0c;const 的行為有時可能會讓人感到困惑&#xff0c;因為它并不總是意味著“不可變”&#xff08;immutable&#xff09;。讓…

Python 列表全面解析

關于Python列表的詳細教程&#xff0c;涵蓋增刪改查、切片、列表推導式及核心方法 一、 列表基礎 1.1 創建列表 列表是Python中最常用的數據結構之一&#xff0c;支持動態存儲多種類型的元素。 # 空列表 empty_list []# 初始化列表 numbers [1, 2, 3, 4] fruits ["a…

【Ratis】ReferenceCountedObject接口的作用及參考意義

Apache Ratis的項目源碼里,大量用到了自定義的ReferenceCountedObject接口。 本文就來學習一下這個接口的作用,并借鑒一下它解決的問題和實現原理。 功能與作用 ReferenceCountedObject 是一個接口,用于管理對象的引用計數。它的主要功能和作用包括: 引用計數管理: 提供…

leetcode-50.Pow(x,n)

快速計算次方的方法。 首先&#xff0c;先保證n是正數。 如果n<0&#xff0c;就讓x取反&#xff0c;n取絕對值。 然后考慮怎么快速乘法。 考慮 x 7 x 1 2 4 x ? x 2 ? x 4 x^7x^{124}x*x^2*x^4 x7x124x?x2?x4&#xff0c;可以發現&#xff0c;本來乘6次x&#xff0…

基于javaweb的SpringBoot公司日常考勤系統設計與實現(源碼+文檔+部署講解)

技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、小程序、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;免費功能設計、開題報告、任務書、中期檢查PPT、系統功能實現、代碼編寫、論文編寫和輔導、論…

游戲引擎學習第167天

回顧和今天的計劃 我們不使用引擎&#xff0c;也不依賴庫&#xff0c;只有我們自己和我們的小手指在敲擊代碼。 今天我們會繼續進行一些工作。首先&#xff0c;我們會清理昨天留下的一些問題&#xff0c;這些問題我們當時沒有深入探討。除了這些&#xff0c;我覺得我們在資產…

深度學習框架PyTorch——從入門到精通(5)自動微分

使用torch.autograd自動微分 張量、函數和計算圖計算梯度禁用梯度追蹤關于計算圖的更多信息張量梯度和雅可比乘積 在訓練神經網絡時&#xff0c;最常用的算法是反向傳播。在該算法中&#xff0c;參數&#xff08;模型權重&#xff09;根據損失函數的梯度相對于給定參數進行調整…

以食為藥:緩解老人手抖的飲食策略

手抖&#xff0c;在醫學上稱為震顫&#xff0c;是老年人常見的癥狀之一。其成因復雜&#xff0c;可能涉及神經系統病變、甲狀腺功能異常、藥物副作用等。除了積極就醫治療&#xff0c;合理的飲食對于緩解手抖癥狀、提高老人生活質量具有重要意義。 老人手抖時&#xff0c;身體能…

JUC大揭秘:從ConcurrentHashMap到線程池,玩轉Java并發編程!

目錄 JUC實現類 ConcurrentHashMap 回顧HashMap ConcurrentHashMap CopyOnWriteArrayList 回顧ArrayList CopyOnWriteArrayList: CopyOnWriteArraySet 輔助類 CountDownLatch 線程池 線程池 線程池優點 ThreadPoolExecutor 構造器各個參數含義&#xff1a; 線程…

C++之list類及模擬實現

目錄 list的介紹 list的模擬實現 定義節點 有關遍歷的重載運算符 list的操作實現 &#xff08;1&#xff09;構造函數 (2)拷貝構造函數 &#xff08;3&#xff09;賦值運算符重載函數 &#xff08;4&#xff09;析構函數和clear成員函數 &#xff08;5&#xff09;尾…

Elasticsearch 向量檢索詳解

文章目錄 1、向量檢索的用途2、適用場景2.1 自然語言處理&#xff08;NLP&#xff09;&#xff1a;2.2 圖像搜索&#xff1a;2.3 推薦系統2.4 音視頻搜索 3、向量檢索的核心概念3.1 向量3.2 相似度計算3.3 向量索引 4、案例&#xff1a;基于文本的語義搜索5、總結 向量檢索是 E…

自學軟硬件第755 docker容器虛擬化技術

見字如面&#xff0c; 這里是AIGC創意人_竹相左邊&#xff0c; 正在通過AI自學軟硬件工程師&#xff0c;目標手搓可回收火箭玩具。 我很喜歡 《流浪地球 2》中 &#xff0c;馬兆&#xff1a;沒有硬件支撐&#xff0c;你破解個屁。 寫作背景 今天在剪視頻&#xff0c;然后看…

不可不知的分布式數據庫-TiDB

不可不知的分布式數據庫-TiDB 介紹TiDb架構TiDb與Mysql的區別功能特性性能表現數據可靠性運維管理成本 Docker部署TiDB1. 獲取 TiDB 配置文件2. 啟動 TiDB 集群3. 連接到 TiDB4. 停止和清理 TiDB 集群注意事項 實用案例TiDB實現分布式事務實現原理實現方式SQL 方式編程方式 注意…

20242817李臻《Linux?級編程實踐》第四周

20242817李臻《Linux?級編程實踐》第4周 一、AI對學習內容的總結 第5章 Linux進程管理 5.1 進程基本概念 進程與程序的區別 程序&#xff1a;靜態的二進制文件&#xff08;如/bin/ls&#xff09;&#xff0c;存儲在磁盤中&#xff0c;不占用運行資源。進程&#xff1a;程…