您好,登錄后才能下訂單哦!
本系列是「RabbitMQ實戰(zhàn):高效部署分布式消息隊列」書籍的總結(jié)筆記。
上一篇總結(jié)了可能出現(xiàn)的異常場景,并對RabbitMQ提供的可用性保證進行了分析,在出現(xiàn)服務器宕機后,仍然可以正常服務。另外,需要盡快恢復異常的服務器,重新加入集群,推送未消費的消息,通過監(jiān)控可第一時間接收到錯誤并進行處理。
另外,我們想主動了解消息堆積和消費的情況,以及服務器節(jié)點的壓力,RabbitMQ提供了幾種方式便捷、直觀的了解,包括Web管理插件、REST API、rabbitmqadmin腳本。
通過介紹,你會了解到:
RabbitMQ的插件是由Erlang語言寫的,并且和服務器一同運行在同一個Erlang VM中,通過下面的命令啟用web管理插件:
sudo ./rabbitmq-plugins enable rabbitmq_management
啟動之后,訪問15672端口,可看到Web管理頁面主頁面:
默認會提供一個默認用戶guest,密碼也是guest,線上環(huán)境需要創(chuàng)建一個新用戶,并把guest用戶刪除。
首先切換到Admin標簽頁,可以查看或添加用戶,添加用戶時,可指定Tags,相當于角色,會擁有對應的權(quán)限:
點擊用戶列表的用戶名,可分配權(quán)限、編輯或刪除用戶,分配權(quán)限時,可細化到某個virtual下的某個topic,并按讀、寫、配置類別進行分開:
切換到“Exchanges”標簽,可查看和管理交換器,單擊交換器名稱,可查看到更多詳細信息,比如交換器綁定,還可以添加新的綁定:
切換到“Queues”標簽,可以查看隊列信息,點擊隊列名稱,可查看隊列所有狀態(tài)的消息數(shù)量和大小等統(tǒng)計信息:
還可以查看消費者和綁定,發(fā)布、獲取消息:
有時需要初始化一些列隊列和交換器,每次部署一套新環(huán)境后,都需要一步一步創(chuàng)建會有點麻煩,通過REST API可方便的實現(xiàn)自動化腳本。
當啟用web管理插件后,不僅獲得了WEB UI,也擁一個REST化的WEB管理API,任何語言或腳本只要有HTTP庫,都能調(diào)用。
接口會返回json串,比如獲取所有隊列:
curl -i -u admin:admin http://localhost:15672/api/queues
會返回一個json數(shù)組,每個元素是一個隊列,包含隊列的各種屬性:
另外,還提供了rabbitmqadmin腳本的方式查看元數(shù)據(jù)信息和一些統(tǒng)計數(shù)據(jù),它會包裝REST API,使用干凈的接口與其交互,而且輸出內(nèi)容也是格式化過的,方便我們查看。
比如查看所有隊列,可以這樣寫:
./rabbitmqadmin list queues
會返回如下結(jié)果:
監(jiān)控RabbitMQ并不只是確保端口5672是開啟的并能接收TCP連接而已,還要能夠模擬AMQP客戶端來確保連接之后獲取信道,如果能使用REST API找出是否所有構(gòu)成RabbitMQ部件都正常運行,并且之間能正常通信,就更好了。
書中介紹使用Nagios監(jiān)控框架進行監(jiān)控,我之前沒有使用,這里搜集了一些資料,會做下簡單介紹。
Nagios是一款開源的監(jiān)控工具,能有效監(jiān)控Windows、Linux和Unix的主機狀態(tài),交換機路由器等網(wǎng)絡設置,打印機等。在系統(tǒng)或服務狀態(tài)異常時發(fā)出郵件或短信報警第一時間通知網(wǎng)站運維人員,在狀態(tài)恢復后發(fā)出正常的郵件或短信通知。
它本身不包括這部分功能,所有的監(jiān)控、檢測功能都是通過各種插件完成的,啟動Nagios后,它會周期性的自動調(diào)用插件去檢測服務器狀態(tài),同時Nagios會維持一個隊列,所有插件返回來的狀態(tài)信息都進入隊列,Nagios每次都從隊首開始讀取信息,并進行處理后,把狀態(tài)結(jié)果通過web顯示出來。
Nagios可以識別4種狀態(tài)返回信息:
Nagios根據(jù)插件返回來的值,來判斷監(jiān)控對象的狀態(tài),并通過web顯示出來,以供管理員及時發(fā)現(xiàn)故障。
它是如何管理遠端服務器對象的,使用NRPE插件,主要過程如下:
書中提到監(jiān)控RabbitMQ的各個方面,比如:監(jiān)控Rabbit內(nèi)部狀態(tài)、確認RabbitMQ可用并且能夠響應、觀察隊列狀態(tài)檢測消費者異常、檢測消息通信結(jié)構(gòu)中不合需求的配置更改等。
基本思路都是通過編寫Nagios需要的檢測腳本,使用AMQP客戶端或REST API的方式,獲取關心的監(jiān)控信息,根據(jù)情況返回不同的狀態(tài)碼。
具體的腳本腳本就不一一介紹了,這里舉個例子,監(jiān)控隊列的持久化配置是否正確,通過api/queues/<vhost>/<queueName>獲取隊列信息,判斷它的durable屬性是否為true,腳本如下:
import sys, json, httplib, urllib, base64, socket
# 1.定義狀態(tài)碼
EXIT_OK = 0
EXIT_WARNING = 1
EXIT_CRITICAL = 2
EXIT_UNKNOWN = 3
# 2.解析參數(shù)
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.構(gòu)建api路徑
path = "/api/queues/%s/%s" % (urllib.quote(vhost, safe=""),
urllib.quote(queue_name))
method = "GET"
# 5.執(zhí)行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.狀態(tài)碼為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安全和性能方面的考慮。
歡迎掃描下方二維碼,關注我的個人微信公眾號 ~
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。