本系列是「RabbitMQ實戰:高效部署分佈式消息隊列」書籍的總結筆記。java
上一篇總結了可能出現的異常場景,並對RabbitMQ提供的可用性保證進行了分析,在出現服務器宕機後,仍然能夠正常服務。另外,須要儘快恢復異常的服務器,從新加入集羣,推送未消費的消息,經過監控可第一時間接收到錯誤並進行處理。python
另外,咱們想主動了解消息堆積和消費的狀況,以及服務器節點的壓力,RabbitMQ提供了幾種方式便捷、直觀的瞭解,包括Web管理插件、REST API、rabbitmqadmin腳本。ios
經過介紹,你會了解到:web
RabbitMQ的插件是由Erlang語言寫的,而且和服務器一同運行在同一個Erlang VM中,經過下面的命令啓用web管理插件:json
sudo ./rabbitmq-plugins enable rabbitmq_management
複製代碼
啓動以後,訪問15672端口,可看到Web管理頁面主頁面:api
默認會提供一個默認用戶guest,密碼也是guest,線上環境須要建立一個新用戶,並把guest用戶刪除。數組
首先切換到Admin標籤頁,能夠查看或添加用戶,添加用戶時,可指定Tags,至關於角色,會擁有對應的權限:安全
點擊用戶列表的用戶名,可分配權限、編輯或刪除用戶,分配權限時,可細化到某個virtual下的某個topic,並按讀、寫、配置類別進行分開:bash
切換到「Exchanges」標籤,可查看和管理交換器,單擊交換器名稱,可查看到更多詳細信息,好比交換器綁定,還能夠添加新的綁定:服務器
切換到「Queues」標籤,能夠查看隊列信息,點擊隊列名稱,可查看隊列全部狀態的消息數量和大小等統計信息:
還能夠查看消費者和綁定,發佈、獲取消息:
有時須要初始化一些列隊列和交換器,每次部署一套新環境後,都須要一步一步建立會有點麻煩,經過REST API可方便的實現自動化腳本。
當啓用web管理插件後,不只得到了WEB UI,也擁一個REST化的WEB管理API,任何語言或腳本只要有HTTP庫,都能調用。
接口會返回json串,好比獲取全部隊列:
curl -i -u admin:admin http://localhost:15672/api/queues
複製代碼
會返回一個json數組,每一個元素是一個隊列,包含隊列的各類屬性:
另外,還提供了rabbitmqadmin腳本的方式查看元數據信息和一些統計數據,它會包裝REST API,使用乾淨的接口與其交互,並且輸出內容也是格式化過的,方便咱們查看。
好比查看全部隊列,能夠這樣寫:
./rabbitmqadmin list queues
複製代碼
會返回以下結果:
監控RabbitMQ並不僅是確保端口5672是開啓的並能接收TCP鏈接而已,還要可以模擬AMQP客戶端來確保鏈接以後獲取信道,若是能使用REST API找出是否全部構成RabbitMQ部件都正常運行,而且之間能正常通訊,就更好了。
書中介紹使用Nagios監控框架進行監控,我以前沒有使用,這裏蒐集了一些資料,會作下簡單介紹。
Nagios是一款開源的監控工具,能有效監控Windows、Linux和Unix的主機狀態,交換機路由器等網絡設置,打印機等。在系統或服務狀態異常時發出郵件或短信報警第一時間通知網站運維人員,在狀態恢復後發出正常的郵件或短信通知。
它自己不包括這部分功能,全部的監控、檢測功能都是經過各類插件完成的,啓動Nagios後,它會週期性的自動調用插件去檢測服務器狀態,同時Nagios會維持一個隊列,全部插件返回來的狀態信息都進入隊列,Nagios每次都從隊首開始讀取信息,並進行處理後,把狀態結果經過web顯示出來。
Nagios能夠識別4種狀態返回信息:
Nagios根據插件返回來的值,來判斷監控對象的狀態,並經過web顯示出來,以供管理員及時發現故障。
它是如何管理遠端服務器對象的,使用NRPE插件,主要過程以下:
書中提到監控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安全和性能方面的考慮。
歡迎掃描下方二維碼,關注個人我的微信公衆號 ~