監控是運維系統的基礎,我們衡量一個公司/部門的運維水平,看他們的監控系統就可以了。一個完善的監控系統可以提高應用的可用性和可靠性,在提供更優質服務的前提下,降低運維的投入和工作量,為用戶帶來更多的商業利益和客戶體驗。下面就帶大家徹底搞懂監控系統,使用Prometheus +Grafana搭建完整的應用監控系統。
一、監控系統簡介
1.1 什么是監控系統?
監控系統顧名思義就是監控服務器、應用系統以及其他第三方組件運行狀態的系統。對于平臺系統而言,監控系統就是我們的第三只眼,監控系統會實時跟蹤應用平臺的運行狀態,如果有應用系統出現問題或是服務器內存爆滿,我們通過監控系統就可以快速定位問題所在,甚至可以設置預警,對一些將要出現的問題進行提前預防處理,及時避免問題的發生。
1.2 監控系統的作用
監控是運維系統的基礎,我們衡量一個公司/部門的運維水平,看他們的監控系統就可以了。監控系統的作用不言而喻,能幫我們快速定位問題,減少故障,容量規劃,性能優化等。
1)定位故障:在發生故障時,我們可以通過查看監控系統的各項指標數據,輔助故障分析和定位。
2)減少故障率:對于即將可能產生的故障能夠及時發出預警信息,做好提前預防處理。
3)容量規劃:為服務器、中間件以及應用集群的容量規劃提供數據支撐。
4)性能調優:JVM垃圾回收次數、接口響應時間、慢SQL等等都可以監控優化。
總而言之,一個完善的監控系統可以提高應用的可用性和可靠性,在提供更優質服務的前提下,降低運維的投入和工作量,為用戶帶來更多的商業利益和客戶體驗。
1.3 常見的監控對象和指標都有哪些?
應用系統的監控主要分為指標監控和日志監控兩大部分:
- 指標監控主要是對一定時間段內性能指標進行測量,然后再通過時間序列的方式,進行處理、存儲和告警。
- 日志監控則可以提供更詳細的上下文信息,通常通過 ELK 技術棧來進行收集、索引和圖形化展示。
指標監控可以說是系統監控最核心的功能。主要有服務器資源、應用監控、數據庫中間件等。
- 服務器資源監控:CPU使用率、內存使用率、磁盤使用率、磁盤讀寫的吞吐量、網絡出入流量等等。
- 數據庫監控:TPS、QPS、數據庫連接數、慢SQL、InnoDB緩沖池命中率等。
- redis監控:內存使用率、緩存命中率、key值總數、Redis響應請求時間、客戶端連接數、持久性指標等。
- MQ消息監控:連接數、隊列數、生產速率、消費速率、消息堆積量等等。
- 應用監控:包括HTTP請求,JVM,線程池等。
1.4 監控系統的架構
一個完整的監控系統通常由數據采集、數據傳輸、數據存儲、數據展示、監控告警等多個模塊組成。
- 數據采集,采集的方式有很多種,包括日志埋點進行采集,JMX標準接口輸出監控指標,被監控對象提供REST API進行數據采集(如Hadoop、ES),系統命令行,統一的SDK進行侵入式的埋點和上報等。
- 數據傳輸,將采集的數據以TCP、UDP或者HTTP協議的形式上報給監控系統,有主動Push模式,也有被動Pull模式。
- 數據存儲,有使用MySQL、Oracle等關系數據庫存儲的,也有使用時序數據庫RRDTool、OpentTSDB、InfluxDB存儲的,還有使用HBase存儲的。
- 數據展示,數據指標的圖形化展示。
- 監控告警,靈活的告警設置,以及支持郵件、短信、IM等多種通知通道。
二、當前流行的監控系統
目前大部分廠商都采用自研或是基于開源組件的方式搭建自己的監控平臺。當然也有很多非常流行的開源監控系統,其中,最流行的莫過于Zabbix和Prometheus。下面就對這兩個監控系統進行介紹,同時總結下各自的優劣勢。
2.1 Zabbix
Zabbix 1998年誕生,核心組件采用C語言開發,Web端采用php開發。它屬于老牌監控系統中的優秀代表,功能全面,使用廣泛,是最優秀的監控解決方案之一。
2.1.1 Zabbix的優勢
- 產品成熟:由于誕生時間長且使用廣泛,擁有豐富的文檔資料以及各種開源的數據采集插件,能覆蓋絕大部分監控場景。
- 采集方式豐富:支持Agent、SNMP、JMX、SSH等多種采集方式,以及主動和被動的數據傳輸方式。
2.1.2 Zabbix的劣勢
Zabbix需要在被監控主機上安裝Agent,所有的數據都存在數據庫里,產生的數據很大,瓶頸主要在數據庫。
2.2 Prometheus
隨著微服務架構和容器的興起,Zabbix對容器監控顯得力不從心。為解決監控容器的問題 Prometheus 應運而生。
Prometheus 是一套開源的系統監控報警框架,采用Go語言開發。得益于google與k8s的強力支持,自帶云原生的光環,天然能夠友好協作,使得Prometheus 在開源社區異常火爆。
2.2.1 Prometheus優點
(1)提供多維度數據模型和靈活的查詢方式
通過將監控指標關聯多個 tag,來將監控數據進行任意維度的組合,并且提供簡單的 PromQL 查詢方式,還提供 HTTP 查詢接口,可以很方便地結合 Grafana 等 GUI 組件展示數據。
(2)基于時序數據庫,支持服務器節點的本地存儲
通過 Prometheus 自帶的時序數據庫,可以完成每秒千萬級的數據存儲;不僅如此,在保存大量歷史數據的場景中,Prometheus 可以對接第三方時序數據庫和 OpenTSDB 等。
(3)定義了開放指標數據標準
以基于 HTTP 的 Pull 方式采集時序數據,只有實現了Prometheus監控數據才可以被 Prometheus 采集、匯總、并支持 Push 方式向中間網關推送時序數據,能更加靈活地應對多種監控場景。
(4)支持通過靜態文件配置和動態發現機制發現監控對象
自動完成數據采集。Prometheus 目前已經支持 Kube.NETes、etcd、Consul 等多種服務發現機制。
(5)易于維護
可以通過二進制文件直接啟動,并且提供了容器化部署鏡像。
(6)集群支持
支持數據的分區采樣和集群部署,支持大規模集群監控。
2.2.2 Prometheus缺點
- Prometheus 是基于 Metric 的監控,不適用于日志(Logs)、事件(Event)、調用鏈(Tracing)。
- 由于Prometheus采用的是Pull模型拉取數據,意味著所有被監控的endpoint必須是可達的,需要合理規劃網絡的安全配置。
- 指標眾多,需進行適當裁剪。
2.3 綜合對比
下表通過多維度展現了各自監控系統的優缺點:
綜合來看,Zabbix 成熟度更高,上手更快,但靈活性較差。而且,監控數據的復雜度增加后,Zabbix 做進一步定制難度很高,即使做好了定制,也沒法利用之前收集到的數據了(關系型數據庫造成的問題)。
Prometheus 基本上是正相反,上手難度大一些,但由于定制靈活度高,數據也有更多的聚合可能,起步后的使用難度遠小于 Zabbix。
如果監控的是物理機,用 Zabbix 沒毛病,Zabbix 在傳統監控系統中,尤其是在服務器相關監控方面,占據絕對優勢;但如果是云環境的話,除非是 Zabbix 玩得非常溜,可以做各種定制,否則還是 Prometheus 吧,畢竟人家就是干這個的。
Prometheus 號稱下一代監控系統,已經成為主導及容器監控方面的標配,并且在未來可見的時間內被廣泛應用。
三、使用Prometheus+grafana搭建監控系統
前面,我們了解了一些監控系統的區別和優缺點,下面我們以Prometheus為例,帶大家一步一步搭建監控系統。
3.1 下載
Prometheus需要下載prometheus(Prometheus主服務)、node_exporter(服務器監控)、mysqld_exporter(Mysql數據庫監控-可選)、pushgateway(數據網關-可選)、alertmanager(告警組件-可選)
下載地址:
https://prometheus.io/download/
Grafana為數據展示界面,下載地址:
https://grafana.com/grafana/download
3.2 架構圖
3.3 安裝 Prometheus Server
Prometheus 的架構設計中,Prometheus Server 主要負責數據的收集,存儲并且對外提供數據查詢支持。下面開始安裝Prometheus Server。
step1:首先,下載prometheus,并上傳到服務器
# 解壓到/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 服務。prometheus啟動非常簡單,只需要一個命令即可,進入到
/usr/local/prometheus/prometheus-2.37.0后執行如下命令:
#進入prometheus目錄
cd /usr/local/prometheus/prometheus-2.37.0
#執行啟動腳本
./prometheus --web.enable-admin-api --config.file=prometheus.yml
step3:驗證prometheus是否啟動成功,prometheus默認端口為:9090,我們在瀏覽器中輸入:
http://10.2.1.231:9090/graph,進入prometheus數據展示頁面,說明prometheus啟動成功。
3.4 安裝 Node Exporter
實際的監控樣本數據的由 Exporter 負責收集,如node_exporter 就是負責服務器的資源信息,同時提供了對外訪問的HTTP服務地址(通常是/metrics)給prometheus拉取監控樣本數據。下面開始安裝node_exporter。
step1:首先,下載node_exporter,并上傳到服務器
# 解壓到/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
#執行啟動命令,指定數據訪問的url
./node_exporter --web.listen-address 10.2.1.231:9527
step3:驗證node_exporler是否啟動成功,我們在瀏覽器中輸入上面指定的地址:
http://10.2.1.231:9527/metrics,可以看到當前 node_exporter 獲取到的當前主機的所有監控數據。說明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監控數據
- job_name: 'node'
static_configs:
- targets: ['10.2.1.231:9527']
修改完prometheus.yml 文件后,重新啟動prometheus。再次訪問prometheus數據展示頁面,選擇status | target,可以看到新的node已經添加進來了。
在Graph 頁面,在查詢框中輸入: process_cpu_seconds_total
3.5 安裝grafana
前面已經把prometheus和node exporter 安裝并集成成功。prometheus雖然有自帶的數據展示界面,但是不夠全面也不直觀。接下來集成grafana 完成數據展示。
下載地址:
https://grafana.com/grafana/download
step1:首先,下載Grafana,并上傳到服務器。
# 下載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
#執行啟動命令,指定數據訪問的url
./grafana-server --homepath /usr/local/prometheus/grafana-9.0.3 web
step3:驗證是否安裝成功,Grafana默認端口:3000。在瀏覽器中輸入:http://10.2.1.231:3000/ 輸入默認賬號密碼:adminadmin。能正常進入Grafana,說明Grafana安裝成功。
step4:配置prometheus數據源,點擊 設置 | Data Sources ,按照操作添加prometheus數據源。
點擊add data source,后選擇prometheus數據源。
輸入data source 的名字以及prometheus的地址:http://10.2.1.231:9090/ 后點擊Save&Test 即可。
step5:創建儀表盤 Dashboard
Grafana 支持手動創建儀表盤 Dashboard 和自動導入Dashboard模板兩種方式,手動一個個添加Dashboard 比較繁瑣,Grafana 社區鼓勵用戶分享 Dashboard,通過
https://grafana.com/dashboards 網站,可以找到大量可直接使用的Dashboard模板。
Grafana 中所有的Dashboard 通過 JSON 進行共享,下載并且導入這些 JSON 文件,就可以直接使用這些已經定義好的 Dashboard。
選擇自己喜歡的模板后,點擊 Download JSON下載對應的json 文件。然后在Grafana系統中導入相應的json即可。
接下來回到Grafana頁面,點擊DashBoards|Import
選擇之前下載好的json文件,導入即可。
點擊Import后,我們就可以看到詳細的服務器資源監控數據。如下圖所示:
最后
以上,我們就把監控系統介紹完了,并使用Prometheus + Grafana 構建了一個初步的監控系統。
監控是運維系統的基礎,在DevOps大行其道的今天,運維監控不再是運維工程師的工作,而是程序員和架構師的必備技能。希望大家能夠熟練掌握。