1罢绽、搜集日志信息
通過ELK搜集集群節(jié)點中的日志信息畏线,對于ERROR信息,進行郵件告知相關(guān)的維護人員及時進行處理良价。
2寝殴、監(jiān)控硬件資源及進程
公司已經(jīng)有監(jiān)控系統(tǒng)蒿叠,直接將如下磁盤、內(nèi)存及端口蚣常、URL信息在監(jiān)控中進行配置即可市咽。
磁盤
監(jiān)控每臺服務(wù)器的磁盤空間,重點監(jiān)控如下兩個目錄:
- log目錄
即/app/log 目錄抵蚊。日志文件可以通過定期壓縮清理施绎,保證控制在一定的大小內(nèi)。
- data目錄
即/app/data 目錄贞绳,這個目錄主要堆積的數(shù)據(jù)還是未消費的已經(jīng)持久化到磁盤上的消息谷醉。這個需要及時對消息進行監(jiān)控。
內(nèi)存
監(jiān)控服務(wù)器的內(nèi)存使用情況冈闭,當(dāng)達到閥值的情況下俱尼,進行提前告警。
監(jiān)控進程
主要是監(jiān)控5672端口萎攒,及http://xxxx:15672訪問地址
3遇八、通過rest接口進行監(jiān)控
依托于rabbitmq提供的強大的rest api,我們可以很方便的獲取到集群中的各個節(jié)點信息躺酒,從而根據(jù)具體的需求押蚤,進行全方位的監(jiān)控。
在公司已經(jīng)采購的監(jiān)控系統(tǒng)和自行搭建的zabbix監(jiān)控中羹应,都能夠很好的支持rest api揽碘。可以通過監(jiān)控系統(tǒng)對json結(jié)果的解析园匹,達到告警的目的雳刺。
消息監(jiān)控
消息監(jiān)控可以通過定時調(diào)用rest接口,獲取隊列的未消費數(shù)量裸违,對超過一定數(shù)量的mq消息掖桦,提供短信郵件告警;
- 獲取消息的rest接口地址為:
- 消息內(nèi)容示例(只截取部分內(nèi)容):
[{
"memory": 55568,
...
"messages": 21, #消息總數(shù)量
...
"messages_ready": 21, #待處理消息數(shù)量
...
"messages_unacknowledged": 0, #未確認消息數(shù)量
...
"idle_since": "2018-07-02 14:02:04",
"consumer_utilisation": null,
"policy": "hao123",
"exclusive_consumer_tag": null,
"consumers": 0,
"slave_nodes": ["rabbit@rabbitmqstg03", "rabbit@rabbitmqstg04"],
"synchronised_slave_nodes": ["rabbit@rabbitmqstg03", "rabbit@rabbitmqstg04"],
"recoverable_slaves": ["rabbit@rabbitmqstg03", "rabbit@rabbitmqstg04"],
"state": "running",
...
"message_bytes_ram": 13086, #消息占用的內(nèi)存大小
"message_bytes_persistent": 2816, #消息占用的磁盤大小
...
"name": "ha.queue_123",
"vhost": "/123",
"durable": true,
"auto_delete": false,
"exclusive": false,
"arguments": {},
"node": "rabbit@rabbitmqstg02"
}]
文件描述符供汛、socket文件描述符枪汪、erlang進程監(jiān)控
通過rest接口獲取到每個集群中的節(jié)點信息,通過實際值和閥值的大小怔昨,及時的進行告警雀久,這一步告警方式,可以根據(jù)嚴(yán)重程度趁舀,依次郵件赖捌、微信、短信通知到相關(guān)的人員矮烹。
- 獲取節(jié)點的rest接口地址為:
- 集群節(jié)點內(nèi)容示例(只截取部分內(nèi)容):
[{
"cluster_links": [{
"peer_addr": "10.1.110.39",
"peer_port": 51715,
"sock_addr": "10.1.110.37",
"sock_port": 25672,
"stats": {...},
"name": "rabbit@rabbitmqstg04"
}, ...],
"disk_free": 28271468544, # 磁盤使用量
"fd_used": 58, # 文件描述符使用數(shù)
...
"mem_used": 58362720, # 內(nèi)存使用量
"mnesia_disk_tx_count": 7,
"mnesia_ram_tx_count": 13108,
"proc_used": 225, # erlang進程使用數(shù)
"sockets_used": 0, # socket描述符已經(jīng)使用數(shù)
"fd_total": 65536, # 文件描述符總數(shù)
"sockets_total": 58890, # socket描述符總數(shù)
"mem_limit": 1607527628, # 內(nèi)存閥值
"disk_free_limit": 10000000000, # 磁盤閥值
"proc_total": 1048576, # erlang進程總數(shù)
...
"log_file": "/app/rabbitmq/rabbitmq_server-3.6.1/log/rabbitmq/rabbit@rabbitmqstg02.log",
"sasl_log_file": "/app/rabbitmq/rabbitmq_server-3.6.1/log/rabbitmq/rabbit@rabbitmqstg02-sasl.log",
"db_dir": "/app/rabbitmq/rabbitmq_server-3.6.1/data/rabbit@rabbitmqstg02",
"config_files": ["/app/rabbitmq/rabbitmq_server-3.6.1/etc/rabbitmq/rabbitmq.config"],
...
"name": "rabbit@rabbitmqstg02",
"type": "disc",
"running": true
}]
4越庇、監(jiān)聽堵塞消息
可以在MQ中專門創(chuàng)建一個監(jiān)控的隊列罩锐,定時的發(fā)送和消費隊列中的消息,并且通過的如下的代碼去監(jiān)控隊列是否已經(jīng)堵塞卤唉,如果監(jiān)聽到隊列已經(jīng)堵塞涩惑,就立即發(fā)送告警的短信和郵件。
關(guān)于是否需要手動將故障機器剔除集群搬味,這個有待商榷境氢,但是如果要做的話,是可以在這里做到的碰纬。
ConnectionFactory factory = new ConnectionFactory();
Connection connection = factory.newConnection();
connection.addBlockedListener(new BlockedListener() {
public void handleBlocked(String reason) throws IOException {
// Connection is now blocked
}
public void handleUnblocked() throws IOException {
// Connection is now unblocked
}
});