不會用RabbitMQ實戰?來,一文帶你操作介面管理和監控
上一篇總結了可能出現的異常場景,並對RabbitMQ提供的可用性保證進行了分析,在出現伺服器當機後,仍然可以正常服務。另外,需要儘快恢復異常的伺服器,重新加入叢集,推送未消費的訊息,通過監控可第一時間接收到錯誤並進行處理。
另外,我們想主動了解訊息堆積和消費的情況,以及伺服器節點的壓力,RabbitMQ提供了幾種方式便捷、直觀的瞭解,包括Web管理外掛、REST API、rabbitmqadmin指令碼。
通過介紹,你會了解到:
- web管理外掛
- REST API
- rabbitmqadmin指令碼
- Nagios和監控RabbitMQ
web管理外掛
RabbitMQ的外掛是由Erlang語言寫的,並且和伺服器一同執行在同一個Erlang VM中,通過下面的命令啟用web管理外掛:
sudo ./rabbitmq-plugins enable rabbitmq_management
啟動之後,訪問15672埠,可看到Web管理頁面主頁面:
新增使用者
預設會提供一個預設使用者guest,密碼也是guest,線上環境需要建立一個新使用者,並把guest使用者刪除。
首先切換到Admin標籤頁,可以檢視或新增使用者,新增使用者時,可指定Tags,相當於角色,會擁有對應的許可權:
點選使用者列表的使用者名稱,可分配許可權、編輯或刪除使用者,分配許可權時,可細化到某個virtual下的某個topic,並按讀、寫、配置類別進行分開:
管理佇列、交換器、繫結
切換到“Exchanges”標籤,可檢視和管理交換器,單擊交換器名稱,可檢視到更多詳細資訊,比如交換器繫結,還可以新增新的繫結:
切換到“Queues”標籤,可以檢視佇列資訊,點選佇列名稱,可檢視佇列所有狀態的訊息數量和大小等統計資訊:
還可以檢視消費者和繫結,釋出、獲取訊息:
REST API
有時需要初始化一些列佇列和交換器,每次部署一套新環境後,都需要一步一步建立會有點麻煩,通過REST API可方便的實現自動化指令碼。
當啟用web管理外掛後,不僅獲得了WEB UI,也擁一個REST化的WEB管理API,任何語言或指令碼只要有HTTP庫,都能呼叫。
介面會返回json串,比如獲取所有佇列:
curl -i -u admin:admin http://localhost:15672/api/queues
會返回一個json陣列,每個元素是一個佇列,包含佇列的各種屬性:
rabbitmqadmin指令碼
另外,還提供了rabbitmqadmin指令碼的方式檢視後設資料資訊和一些統計資料,它會包裝REST API,使用乾淨的介面與其互動,而且輸出內容也是格式化過的,方便我們檢視。
比如檢視所有佇列,可以這樣寫:
./rabbitmqadmin list queues
會返回如下結果:
監控
監控RabbitMQ並不只是確保埠5672是開啟的並能接收TCP連線而已,還要能夠模擬AMQP客戶端來確保連線之後獲取通道,如果能使用REST API找出是否所有構成RabbitMQ部件都正常執行,並且之間能正常通訊,就更好了。
書中介紹使用Nagios監控框架進行監控,我之前沒有使用,這裡蒐集了一些資料,會做下簡單介紹。
Nagios
Nagios是一款開源的監控工具,能有效監控Windows、Linux和Unix的主機狀態,交換機路由器等網路設定,印表機等。在系統或服務狀態異常時發出郵件或簡訊報警第一時間通知網站運維人員,在狀態恢復後發出正常的郵件或簡訊通知。
它本身不包括這部分功能,所有的監控、檢測功能都是通過各種外掛完成的,啟動Nagios後,它會週期性的自動呼叫外掛去檢測伺服器狀態,同時Nagios會維持一個佇列,所有外掛返回來的狀態資訊都進入佇列,Nagios每次都從隊首開始讀取資訊,並進行處理後,把狀態結果通過web顯示出來。
Nagios可以識別4種狀態返回資訊:
- 0(OK)表示狀態正常/綠色;
- 1(WARNING)表示出現警告/黃色;
- 2(CRITICAL)表示出現非常嚴重的錯誤/紅色;
- 3(UNKNOWN)表示未知錯誤/深黃色。
Nagios根據外掛返回來的值,來判斷監控物件的狀態,並通過web顯示出來,以供管理員及時發現故障。
它是如何管理遠端伺服器物件的,使用NRPE外掛,主要過程如下:
- Nagios 執行安裝在它裡面的check_nrpe外掛,並告訴check_nrpe去檢測哪些服務;
- 通過SSL,check_nrpe連線遠端機子上的NRPE daemon;
- NRPE 執行本地的各種外掛去檢測本地的服務和狀態;
- NRPE把檢測的結果傳給主機端的check_nrpe,check_nrpe再把結果送到Nagios狀態佇列中;
- Nagios 依次讀取佇列中的資訊,再把結果顯示出來;
監控RabbitMQ
書中提到監控RabbitMQ的各個方面,比如:監控Rabbit內部狀態、確認RabbitMQ可用並且能夠響應、觀察佇列狀態檢測消費者異常、檢測訊息通訊結構中不合需求的配置更改等。
基本思路都是通過編寫Nagios需要的檢測指令碼,使用AMQP客戶端或REST API的方式,獲取關心的監控資訊,根據情況返回不同的狀態碼。
具體的指令碼指令碼就不一一介紹了,這裡舉個例子,監控佇列的持久化配置是否正確,通過api/queues//獲取佇列資訊,判斷它的durable屬性是否為true,指令碼如下:
import sys, json, httplib, urllib, base64, socket
# 1.定義狀態碼
EXIT_OK = 0
EXIT_WARNING = 1
EXIT_CRITICAL = 2
EXIT_UNKNOWN = 3
# 2.解析引數
server, port = sys.argv[1].split(":")
vhost = sys.argv[2]
username = sys.argv[3]
password = sys.argv[4]
queue_name = sys.argv[5]
auto_delete = json.loads(sys.argv[6].lower())
durable = json.loads(sys.argv[7].lower())
# 3.連線伺服器
conn = httplib.HTTPConnection(server, port)
# 4.構建api路徑
path = "/api/queues/%s/%s" % (urllib.quote(vhost, safe=""),
urllib.quote(queue_name))
method = "GET"
# 5.執行http請求
credentials = base64.b64encode("%s:%s" % (username, password))
try:
conn.request(method, path, "",
{"Content-Type" : "application/json",
"Authorization" : "Basic " + credentials})
# 6.連線異常,退出
except socket.error:
print "UNKNOWN: Could not connect to %s:%s" % (server, port)
exit(EXIT_UNKNOWN)
response = conn.getresponse()
# 7.狀態碼為404,說明佇列不存在,退出
if response.status == 404:
print "CRITICAL: Queue %s does not exist." % queue_name
exit(EXIT_CRITICAL)
# 8.durable屬性是否正確
if response["durable"] != durable:
print "WARN: Queue '%s' - durable flag is NOT %s." % \
(queue_name, durable)
exit(EXIT_WARNING)
# 9.返回正常
print "OK: Queue %s configured correctly." % queue_name
exit(EXIT_OK)
下一篇將介紹RabbitMQ安全和效能方面的考慮。
相關文章
- RabbitMQ實戰:介面管理和監控MQ
- RabbitMQ實戰:執行和管理RabbitMQMQ
- 一文帶你瞭解 WGCLOUD 監控硬碟故障 SMARTGCCloud硬碟
- Prometheus監控實戰應用Prometheus
- 【RabbitMQ】一文帶你搞定RabbitMQ延遲佇列MQ佇列
- 熬夜之作:一文帶你瞭解Cat分散式監控分散式
- Spring Boot應用監控實戰Spring Boot
- 一文帶你全面瞭解功能安全軟體監控方案
- 什麼?你還不會用位運算來操作狀態?
- 都9102年了,還不會Docker?10分鐘帶你從入門操作到實戰上手Docker
- App監控和效能優化實戰APP優化
- 一文帶你瞭解Spring核心介面Ordered的實現及應用Spring
- Zabbix實戰--監控NginxNginx
- 全網最全RabbitMQ總結,別再說你不會RabbitMQMQ
- OpenTelemetry 實戰:從零實現應用指標監控指標
- RabbitMQ實戰:效能和安全MQ
- 剛體驗完RabbitMQ?一文帶你SpringBoot+RabbitMQ方式收發訊息MQSpring Boot
- 快來為你的 .NET 應用加個監控吧!
- 用oa系統來管理,會給公司帶來哪些方便!
- INFORMIX的監控和管理命令ORM
- 實戰| 配置DataDog監控Apache Hudi應用指標Apache指標
- Spring Boot 揭祕與實戰(九) 應用監控篇 – 自定義監控端點Spring Boot
- RabbitMQ - 記憶體磁碟監控MQ記憶體
- Java 監控基礎 - 使用 JMX 監控和管理 Java 程式Java
- 沒用過訊息佇列?一文帶你體驗RabbitMQ收發訊息佇列MQ
- 【JVM實戰系列】「監控調優體系」實戰開發arthas-spring-boot-starter監控你的微服務是否健康JVMSpringboot微服務
- 基於 Prometheus 的監控神器,看完不信你不會,簡單靈活!Prometheus
- RunLoop實戰:實時卡頓監控OOP
- 清華尹成帶你實戰GO案例(38)Go 介面Go
- 管理層做好任務管理,團隊不會帶不動
- SpringBoot Serverless 實戰 | 監控除錯Spring BootServer除錯
- 容器雲環境,你們如何監控應用執行情況? ---JFrog 雲原生應用監控實踐
- Zabbix3.4用自帶模板監控mysqlMySql
- RabbitMQ 安裝與介面管理MQ
- OpenTelemetry 實戰:gRPC 監控的實現原理RPC
- 來!做一個分鐘級業務監控系統 【實戰】
- 帶你用 Python 實現自動化群控裝置Python
- 一文帶你學會AQS和併發工具類的關係AQS