監(jiān)控是運(yùn)維系統(tǒng)的基礎(chǔ),我們衡量一個公司/部門的運(yùn)維水平,看他們的監(jiān)控系統(tǒng)就可以了。一個完善的監(jiān)控系統(tǒng)可以提高應(yīng)用的可用性和可靠性,在提供更優(yōu)質(zhì)服務(wù)的前提下,降低運(yùn)維的投入和工作量,為用戶帶來更多的商業(yè)利益和客戶體驗(yàn)。下面就帶大家徹底搞懂監(jiān)控系統(tǒng),使用Prometheus +Grafana搭建完整的應(yīng)用監(jiān)控系統(tǒng)。
一、監(jiān)控系統(tǒng)簡介
1.1 什么是監(jiān)控系統(tǒng)?
監(jiān)控系統(tǒng)顧名思義就是監(jiān)控服務(wù)器、應(yīng)用系統(tǒng)以及其他第三方組件運(yùn)行狀態(tài)的系統(tǒng)。對于平臺系統(tǒng)而言,監(jiān)控系統(tǒng)就是我們的第三只眼,監(jiān)控系統(tǒng)會實(shí)時跟蹤應(yīng)用平臺的運(yùn)行狀態(tài),如果有應(yīng)用系統(tǒng)出現(xiàn)問題或是服務(wù)器內(nèi)存爆滿,我們通過監(jiān)控系統(tǒng)就可以快速定位問題所在,甚至可以設(shè)置預(yù)警,對一些將要出現(xiàn)的問題進(jìn)行提前預(yù)防處理,及時避免問題的發(fā)生。
1.2 監(jiān)控系統(tǒng)的作用
監(jiān)控是運(yùn)維系統(tǒng)的基礎(chǔ),我們衡量一個公司/部門的運(yùn)維水平,看他們的監(jiān)控系統(tǒng)就可以了。監(jiān)控系統(tǒng)的作用不言而喻,能幫我們快速定位問題,減少故障,容量規(guī)劃,性能優(yōu)化等。
1)定位故障:在發(fā)生故障時,我們可以通過查看監(jiān)控系統(tǒng)的各項(xiàng)指標(biāo)數(shù)據(jù),輔助故障分析和定位。
2)減少故障率:對于即將可能產(chǎn)生的故障能夠及時發(fā)出預(yù)警信息,做好提前預(yù)防處理。
3)容量規(guī)劃:為服務(wù)器、中間件以及應(yīng)用集群的容量規(guī)劃提供數(shù)據(jù)支撐。
4)性能調(diào)優(yōu):JVM垃圾回收次數(shù)、接口響應(yīng)時間、慢SQL等等都可以監(jiān)控優(yōu)化。
總而言之,一個完善的監(jiān)控系統(tǒng)可以提高應(yīng)用的可用性和可靠性,在提供更優(yōu)質(zhì)服務(wù)的前提下,降低運(yùn)維的投入和工作量,為用戶帶來更多的商業(yè)利益和客戶體驗(yàn)。
1.3 常見的監(jiān)控對象和指標(biāo)都有哪些?
應(yīng)用系統(tǒng)的監(jiān)控主要分為指標(biāo)監(jiān)控和日志監(jiān)控兩大部分:
- 指標(biāo)監(jiān)控主要是對一定時間段內(nèi)性能指標(biāo)進(jìn)行測量,然后再通過時間序列的方式,進(jìn)行處理、存儲和告警。
- 日志監(jiān)控則可以提供更詳細(xì)的上下文信息,通常通過 ELK 技術(shù)棧來進(jìn)行收集、索引和圖形化展示。
指標(biāo)監(jiān)控可以說是系統(tǒng)監(jiān)控最核心的功能。主要有服務(wù)器資源、應(yīng)用監(jiān)控、數(shù)據(jù)庫中間件等。
- 服務(wù)器資源監(jiān)控:CPU使用率、內(nèi)存使用率、磁盤使用率、磁盤讀寫的吞吐量、網(wǎng)絡(luò)出入流量等等。
- 數(shù)據(jù)庫監(jiān)控:TPS、QPS、數(shù)據(jù)庫連接數(shù)、慢SQL、InnoDB緩沖池命中率等。
- redis監(jiān)控:內(nèi)存使用率、緩存命中率、key值總數(shù)、Redis響應(yīng)請求時間、客戶端連接數(shù)、持久性指標(biāo)等。
- MQ消息監(jiān)控:連接數(shù)、隊(duì)列數(shù)、生產(chǎn)速率、消費(fèi)速率、消息堆積量等等。
- 應(yīng)用監(jiān)控:包括HTTP請求,JVM,線程池等。
1.4 監(jiān)控系統(tǒng)的架構(gòu)
一個完整的監(jiān)控系統(tǒng)通常由數(shù)據(jù)采集、數(shù)據(jù)傳輸、數(shù)據(jù)存儲、數(shù)據(jù)展示、監(jiān)控告警等多個模塊組成。
- 數(shù)據(jù)采集,采集的方式有很多種,包括日志埋點(diǎn)進(jìn)行采集,JMX標(biāo)準(zhǔn)接口輸出監(jiān)控指標(biāo),被監(jiān)控對象提供REST API進(jìn)行數(shù)據(jù)采集(如Hadoop、ES),系統(tǒng)命令行,統(tǒng)一的SDK進(jìn)行侵入式的埋點(diǎn)和上報等。
- 數(shù)據(jù)傳輸,將采集的數(shù)據(jù)以TCP、UDP或者HTTP協(xié)議的形式上報給監(jiān)控系統(tǒng),有主動Push模式,也有被動Pull模式。
- 數(shù)據(jù)存儲,有使用MySQL、Oracle等關(guān)系數(shù)據(jù)庫存儲的,也有使用時序數(shù)據(jù)庫RRDTool、OpentTSDB、InfluxDB存儲的,還有使用HBase存儲的。
- 數(shù)據(jù)展示,數(shù)據(jù)指標(biāo)的圖形化展示。
- 監(jiān)控告警,靈活的告警設(shè)置,以及支持郵件、短信、IM等多種通知通道。

二、當(dāng)前流行的監(jiān)控系統(tǒng)
目前大部分廠商都采用自研或是基于開源組件的方式搭建自己的監(jiān)控平臺。當(dāng)然也有很多非常流行的開源監(jiān)控系統(tǒng),其中,最流行的莫過于Zabbix和Prometheus。下面就對這兩個監(jiān)控系統(tǒng)進(jìn)行介紹,同時總結(jié)下各自的優(yōu)劣勢。
2.1 Zabbix
Zabbix 1998年誕生,核心組件采用C語言開發(fā),Web端采用php開發(fā)。它屬于老牌監(jiān)控系統(tǒng)中的優(yōu)秀代表,功能全面,使用廣泛,是最優(yōu)秀的監(jiān)控解決方案之一。

2.1.1 Zabbix的優(yōu)勢
- 產(chǎn)品成熟:由于誕生時間長且使用廣泛,擁有豐富的文檔資料以及各種開源的數(shù)據(jù)采集插件,能覆蓋絕大部分監(jiān)控場景。
- 采集方式豐富:支持Agent、SNMP、JMX、SSH等多種采集方式,以及主動和被動的數(shù)據(jù)傳輸方式。
2.1.2 Zabbix的劣勢
Zabbix需要在被監(jiān)控主機(jī)上安裝Agent,所有的數(shù)據(jù)都存在數(shù)據(jù)庫里,產(chǎn)生的數(shù)據(jù)很大,瓶頸主要在數(shù)據(jù)庫。
2.2 Prometheus
隨著微服務(wù)架構(gòu)和容器的興起,Zabbix對容器監(jiān)控顯得力不從心。為解決監(jiān)控容器的問題 Prometheus 應(yīng)運(yùn)而生。
Prometheus 是一套開源的系統(tǒng)監(jiān)控報警框架,采用Go語言開發(fā)。得益于google與k8s的強(qiáng)力支持,自帶云原生的光環(huán),天然能夠友好協(xié)作,使得Prometheus 在開源社區(qū)異常火爆。

2.2.1 Prometheus優(yōu)點(diǎn)
(1)提供多維度數(shù)據(jù)模型和靈活的查詢方式
通過將監(jiān)控指標(biāo)關(guān)聯(lián)多個 tag,來將監(jiān)控?cái)?shù)據(jù)進(jìn)行任意維度的組合,并且提供簡單的 PromQL 查詢方式,還提供 HTTP 查詢接口,可以很方便地結(jié)合 Grafana 等 GUI 組件展示數(shù)據(jù)。
(2)基于時序數(shù)據(jù)庫,支持服務(wù)器節(jié)點(diǎn)的本地存儲
通過 Prometheus 自帶的時序數(shù)據(jù)庫,可以完成每秒千萬級的數(shù)據(jù)存儲;不僅如此,在保存大量歷史數(shù)據(jù)的場景中,Prometheus 可以對接第三方時序數(shù)據(jù)庫和 OpenTSDB 等。
(3)定義了開放指標(biāo)數(shù)據(jù)標(biāo)準(zhǔn)
以基于 HTTP 的 Pull 方式采集時序數(shù)據(jù),只有實(shí)現(xiàn)了Prometheus監(jiān)控?cái)?shù)據(jù)才可以被 Prometheus 采集、匯總、并支持 Push 方式向中間網(wǎng)關(guān)推送時序數(shù)據(jù),能更加靈活地應(yīng)對多種監(jiān)控場景。
(4)支持通過靜態(tài)文件配置和動態(tài)發(fā)現(xiàn)機(jī)制發(fā)現(xiàn)監(jiān)控對象
自動完成數(shù)據(jù)采集。Prometheus 目前已經(jīng)支持 Kube.NETes、etcd、Consul 等多種服務(wù)發(fā)現(xiàn)機(jī)制。
(5)易于維護(hù)
可以通過二進(jìn)制文件直接啟動,并且提供了容器化部署鏡像。
(6)集群支持
支持?jǐn)?shù)據(jù)的分區(qū)采樣和集群部署,支持大規(guī)模集群監(jiān)控。
2.2.2 Prometheus缺點(diǎn)
- Prometheus 是基于 Metric 的監(jiān)控,不適用于日志(Logs)、事件(Event)、調(diào)用鏈(Tracing)。
- 由于Prometheus采用的是Pull模型拉取數(shù)據(jù),意味著所有被監(jiān)控的endpoint必須是可達(dá)的,需要合理規(guī)劃網(wǎng)絡(luò)的安全配置。
- 指標(biāo)眾多,需進(jìn)行適當(dāng)裁剪。
2.3 綜合對比
下表通過多維度展現(xiàn)了各自監(jiān)控系統(tǒng)的優(yōu)缺點(diǎn):

綜合來看,Zabbix 成熟度更高,上手更快,但靈活性較差。而且,監(jiān)控?cái)?shù)據(jù)的復(fù)雜度增加后,Zabbix 做進(jìn)一步定制難度很高,即使做好了定制,也沒法利用之前收集到的數(shù)據(jù)了(關(guān)系型數(shù)據(jù)庫造成的問題)。
Prometheus 基本上是正相反,上手難度大一些,但由于定制靈活度高,數(shù)據(jù)也有更多的聚合可能,起步后的使用難度遠(yuǎn)小于 Zabbix。
如果監(jiān)控的是物理機(jī),用 Zabbix 沒毛病,Zabbix 在傳統(tǒng)監(jiān)控系統(tǒng)中,尤其是在服務(wù)器相關(guān)監(jiān)控方面,占據(jù)絕對優(yōu)勢;但如果是云環(huán)境的話,除非是 Zabbix 玩得非常溜,可以做各種定制,否則還是 Prometheus 吧,畢竟人家就是干這個的。
Prometheus 號稱下一代監(jiān)控系統(tǒng),已經(jīng)成為主導(dǎo)及容器監(jiān)控方面的標(biāo)配,并且在未來可見的時間內(nèi)被廣泛應(yīng)用。
三、使用Prometheus+grafana搭建監(jiān)控系統(tǒng)
前面,我們了解了一些監(jiān)控系統(tǒng)的區(qū)別和優(yōu)缺點(diǎn),下面我們以Prometheus為例,帶大家一步一步搭建監(jiān)控系統(tǒng)。
3.1 下載
Prometheus需要下載prometheus(Prometheus主服務(wù))、node_exporter(服務(wù)器監(jiān)控)、mysqld_exporter(Mysql數(shù)據(jù)庫監(jiān)控-可選)、pushgateway(數(shù)據(jù)網(wǎng)關(guān)-可選)、alertmanager(告警組件-可選)
下載地址:
https://prometheus.io/download/
Grafana為數(shù)據(jù)展示界面,下載地址:
https://grafana.com/grafana/download
3.2 架構(gòu)圖

3.3 安裝 Prometheus Server
Prometheus 的架構(gòu)設(shè)計(jì)中,Prometheus Server 主要負(fù)責(zé)數(shù)據(jù)的收集,存儲并且對外提供數(shù)據(jù)查詢支持。下面開始安裝Prometheus Server。
step1:首先,下載prometheus,并上傳到服務(wù)器
# 解壓到/usr/local/prometheus目錄下:
tar -zxvf prometheus-2.37.0.linux-amd64.tar.gz -C /usr/local/prometheus
# 修改目錄名:
cd /usr/local/prometheus
mv prometheus-2.37.0.linux-amd64 prometheus-2.37.0
setp2:啟動prometheus Server 服務(wù)。prometheus啟動非常簡單,只需要一個命令即可,進(jìn)入到
/usr/local/prometheus/prometheus-2.37.0后執(zhí)行如下命令:
#進(jìn)入prometheus目錄
cd /usr/local/prometheus/prometheus-2.37.0
#執(zhí)行啟動腳本
./prometheus --web.enable-admin-api --config.file=prometheus.yml
step3:驗(yàn)證prometheus是否啟動成功,prometheus默認(rèn)端口為:9090,我們在瀏覽器中輸入:
http://10.2.1.231:9090/graph,進(jìn)入prometheus數(shù)據(jù)展示頁面,說明prometheus啟動成功。

3.4 安裝 Node Exporter
實(shí)際的監(jiān)控樣本數(shù)據(jù)的由 Exporter 負(fù)責(zé)收集,如node_exporter 就是負(fù)責(zé)服務(wù)器的資源信息,同時提供了對外訪問的HTTP服務(wù)地址(通常是/metrics)給prometheus拉取監(jiān)控樣本數(shù)據(jù)。下面開始安裝node_exporter。
step1:首先,下載node_exporter,并上傳到服務(wù)器
# 解壓到/usr/local/prometheus目錄下:
tar -zxvf node_exporter-1.3.1.linux-amd64.tar.gz -C /usr/local/prometheus
# 修改目錄名:
cd /usr/local/prometheus
mv node_exporter-1.3.1.linux-amd64 node_exporter-1.3.1
step2:啟動node_exporler,輸入如下命令啟動:
#node_exporter
cd /usr/local/prometheus/node_exporter-1.3.1
#執(zhí)行啟動命令,指定數(shù)據(jù)訪問的url
./node_exporter --web.listen-address 10.2.1.231:9527
step3:驗(yàn)證node_exporler是否啟動成功,我們在瀏覽器中輸入上面指定的地址:
http://10.2.1.231:9527/metrics,可以看到當(dāng)前 node_exporter 獲取到的當(dāng)前主機(jī)的所有監(jiān)控?cái)?shù)據(jù)。說明node_exporler啟動成功。

step4:最后,配置prometheus,將新增加的node配置到prometheus。
修改prometheus-2.37.0 文件夾下的prometheus.yml文件。增加新的node配置,具體配置如下:
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: "prometheus"
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ["localhost:9090"]
# 采集node exporter監(jiān)控?cái)?shù)據(jù)
- job_name: 'node'
static_configs:
- targets: ['10.2.1.231:9527']
修改完prometheus.yml 文件后,重新啟動prometheus。再次訪問prometheus數(shù)據(jù)展示頁面,選擇status | target,可以看到新的node已經(jīng)添加進(jìn)來了。

在Graph 頁面,在查詢框中輸入: process_cpu_seconds_total

3.5 安裝grafana
前面已經(jīng)把prometheus和node exporter 安裝并集成成功。prometheus雖然有自帶的數(shù)據(jù)展示界面,但是不夠全面也不直觀。接下來集成grafana 完成數(shù)據(jù)展示。
下載地址:
https://grafana.com/grafana/download
step1:首先,下載Grafana,并上傳到服務(wù)器。
# 下載grafana
wget https://dl.grafana.com/enterprise/release/grafana-enterprise-9.0.3.linux-amd64.tar.gz
# 解壓到
tar -zxvf grafana-enterprise-9.0.3.linux-amd64.tar.gz -C /usr/local/prometheus
# 修改目錄名:
cd /usr/local/prometheus
mv ngrafana-enterprise-9.0.3.linux-amd64 grafana-9.0.3
step2:啟動Grafana,輸入如下命令:
#grafana
cd /usr/local/prometheus/grafana-9.0.3/bin
#執(zhí)行啟動命令,指定數(shù)據(jù)訪問的url
./grafana-server --homepath /usr/local/prometheus/grafana-9.0.3 web
step3:驗(yàn)證是否安裝成功,Grafana默認(rèn)端口:3000。在瀏覽器中輸入:http://10.2.1.231:3000/ 輸入默認(rèn)賬號密碼:adminadmin。能正常進(jìn)入Grafana,說明Grafana安裝成功。

step4:配置prometheus數(shù)據(jù)源,點(diǎn)擊 設(shè)置 | Data Sources ,按照操作添加prometheus數(shù)據(jù)源。

點(diǎn)擊add data source,后選擇prometheus數(shù)據(jù)源。

輸入data source 的名字以及prometheus的地址:http://10.2.1.231:9090/ 后點(diǎn)擊Save&Test 即可。
step5:創(chuàng)建儀表盤 Dashboard
Grafana 支持手動創(chuàng)建儀表盤 Dashboard 和自動導(dǎo)入Dashboard模板兩種方式,手動一個個添加Dashboard 比較繁瑣,Grafana 社區(qū)鼓勵用戶分享 Dashboard,通過
https://grafana.com/dashboards 網(wǎng)站,可以找到大量可直接使用的Dashboard模板。
Grafana 中所有的Dashboard 通過 JSON 進(jìn)行共享,下載并且導(dǎo)入這些 JSON 文件,就可以直接使用這些已經(jīng)定義好的 Dashboard。

選擇自己喜歡的模板后,點(diǎn)擊 Download JSON下載對應(yīng)的json 文件。然后在Grafana系統(tǒng)中導(dǎo)入相應(yīng)的json即可。
接下來回到Grafana頁面,點(diǎn)擊DashBoards|Import

選擇之前下載好的json文件,導(dǎo)入即可。

點(diǎn)擊Import后,我們就可以看到詳細(xì)的服務(wù)器資源監(jiān)控?cái)?shù)據(jù)。如下圖所示:

最后
以上,我們就把監(jiān)控系統(tǒng)介紹完了,并使用Prometheus + Grafana 構(gòu)建了一個初步的監(jiān)控系統(tǒng)。
監(jiān)控是運(yùn)維系統(tǒng)的基礎(chǔ),在DevOps大行其道的今天,運(yùn)維監(jiān)控不再是運(yùn)維工程師的工作,而是程序員和架構(gòu)師的必備技能。希望大家能夠熟練掌握。