徹底吃透監(jiān)控系統(tǒng),就這一篇!
經(jīng)濟高速發(fā)展的今天,我們處于信息大爆炸的時代。隨著經(jīng)濟發(fā)展,信息借助互聯(lián)網(wǎng)的力量在全球自由地流動,于是就催生了各種各樣的服務(wù)平臺和軟件系統(tǒng)。

監(jiān)控系統(tǒng)的功能
某個業(yè)務(wù)模塊出現(xiàn)問題,運維人員并不知道,發(fā)現(xiàn)的時候問題已經(jīng)很嚴重了。
系統(tǒng)出現(xiàn)瓶頸了,CPU 占用持續(xù)升高,內(nèi)存不足,磁盤被寫滿;網(wǎng)絡(luò)請求突增,超出網(wǎng)關(guān)承受的壓力。

對服務(wù),系統(tǒng),平臺的運行狀態(tài)實時監(jiān)控。
收集服務(wù),系統(tǒng),平臺的運行信息。
通過收集信息的分析結(jié)果,預(yù)知存在的故障風險,并采取行動。
根據(jù)對風險的評估,進行故障預(yù)警。
一旦發(fā)生故障,第一時間發(fā)出告警信息。
通過監(jiān)控數(shù)據(jù),定位故障,協(xié)助生成解決方案。
最終保證系統(tǒng)持續(xù)、穩(wěn)定、安全運行。
監(jiān)控數(shù)據(jù)可視化,便于統(tǒng)計,按照一定周期導出、歸檔,用于數(shù)據(jù)分析和問題復盤。
監(jiān)控系統(tǒng)的分類
日志類
調(diào)用鏈類
度量類
日志類

調(diào)用鏈類



Server Received 是服務(wù)器接受,也就是服務(wù)端接受到請求的意思。
Client Sent 是客戶端發(fā)送,也就是這個服務(wù)本身不提供響應(yīng),需要調(diào)用其他的服務(wù)提供該響應(yīng),所以這個時候是作為客戶端發(fā)起請求的。
Server Sent 是服務(wù)端發(fā)送,看上圖SERVICE 3 收到請求后,由于他是最終的服務(wù)提供者,所以作為服務(wù)端,他需要把請求發(fā)送給調(diào)用者。
Client Received 是客戶端接受,作為發(fā)起調(diào)用的客戶端接受到服務(wù)端返回的請求。

度量類
整個監(jiān)控的數(shù)據(jù)庫稱為“Metric”,它包含了所有監(jiān)控的數(shù)據(jù)。類似關(guān)系型數(shù)據(jù)庫中的 Table。
每條監(jiān)控數(shù)據(jù),稱為“Point”,類似于關(guān)系型數(shù)據(jù)庫中的 Row 的概念。
每個“Point”都會定義一個時間戳“Timestamp”,將其作為索引,表明數(shù)據(jù)采集的時間。
“Tag”作為維度列,表示監(jiān)控數(shù)據(jù)的屬性。
“Field”作為指標列,作為測量值,也就是測量的結(jié)果。

接收寫入請求的 memtable 文件(內(nèi)存中)
不可修改的 immutable memtable?文件(內(nèi)存中)
磁盤上的 SStable文件(Sorted String Table),有序字符串表,這個有序的字符串就是數(shù)據(jù)的key。SStable 一共有七層(L0 到 L6)。下一層的總大小限制是上一層的 10 倍。

將數(shù)據(jù)追加到日志 WAL(Write Ahead Log)中,寫入日志的目的是為了防止內(nèi)存數(shù)據(jù)丟失,可以及時恢復。
把數(shù)據(jù)寫到 memtable 中。
當 memtable 滿了(超過一定閥值),就將這個 memtable 轉(zhuǎn)入 immutable memtable 中,用新的 memtable 接收新的數(shù)據(jù)請求。
immutablememtable 一旦寫滿了, 就寫入磁盤。并且先存儲 L0 層的 ?SSTable 磁盤文件,此時還不需要做文件的合并。
每層的所有文件總大小是有限制的(8MB,10MB,100MB… 1TB)。從 L1 層往后,每下一層容量增大十倍。
某一層的數(shù)據(jù)文件總量超過閾值,就在這一層中選擇一個文件和下一層的文件進行合并。
如此這般上層的數(shù)據(jù)都是較新的數(shù)據(jù),查詢可以從上層開始查找,依次往下,并且這些數(shù)據(jù)都是按照時間序列存放的。
監(jiān)控系統(tǒng)的分層

客戶端監(jiān)控,用戶行為信息,業(yè)務(wù)返回碼,客戶端性能,運營商,版本,操作系統(tǒng)等。
業(yè)務(wù)層監(jiān)控,核心業(yè)務(wù)的監(jiān)控,例如:登錄,注冊,下單,支付等等。
應(yīng)用層監(jiān)控,相關(guān)的技術(shù)參數(shù),例如:URL 請求次數(shù),Service 請求數(shù)量,SQL 執(zhí)行的結(jié)果,Cache 的利用率,QPS 等等。
系統(tǒng)層監(jiān)控,物理主機,虛擬主機以及操作系統(tǒng)的參數(shù)。例如:CPU 利用率,內(nèi)存利用率,磁盤空間情況。
網(wǎng)絡(luò)層監(jiān)控,網(wǎng)絡(luò)情況參數(shù)。例如:網(wǎng)關(guān)流量情況,丟包率,錯包率,連接數(shù)等等。
流行的監(jiān)控系統(tǒng)
Zabbix
Prometheus
Zabbix
Agent 負責收集數(shù)據(jù),并且傳輸給 Server。
Server 負責接受 Agent 的數(shù)據(jù),進行保存或者告警。
Proxy 負責代理 Server 收集 Agent 傳輸?shù)臄?shù)據(jù),并且轉(zhuǎn)發(fā)給 Server。Proxy 是安裝在被監(jiān)控的服務(wù)器上的,用來和 Server 端進行通信,從而傳輸數(shù)據(jù)。

Prometheus(普羅米修斯)
Prometheus Server,用于收集和存儲時間序列數(shù)據(jù),負責監(jiān)控數(shù)據(jù)的獲取,存儲以及查詢。
監(jiān)控目標配置,Prometheus Server 可以通過靜態(tài)配置管理監(jiān)控目標,也可以配合 Service Discovery(K8s,DNS,Consul)實現(xiàn)動態(tài)管理監(jiān)控目標。
監(jiān)控目標存儲,Prometheus Server 本身就是一個時序數(shù)據(jù)庫,將采集到的監(jiān)控數(shù)據(jù)按照時間序列存儲在本地磁盤中。
監(jiān)控數(shù)據(jù)查詢,Prometheus Server 對外提供了自定義的 PromQL 語言,實現(xiàn)對數(shù)據(jù)的查詢以及分析。
Client Library,客戶端庫。為需要監(jiān)控的服務(wù)生成相應(yīng)的 Metrics 并暴露給 Prometheus Server。
當 Prometheus Server 來 Pull 時,直接返回實時狀態(tài)的 Metrics。通常會和 Job 一起合作。
Push Gateway,主要用于短期的 Jobs。由于這類 Jobs 存在時間較短,可能在 Prometheus 來 Pull 之前就消失了。為此,這些 Jobs 可以直接向 Prometheus Server 端推送它們的 Metrics。
Exporters,第三方服務(wù)接口。將 Metrics(數(shù)據(jù)集合)發(fā)送給 Prometheus。
Exporter 將監(jiān)控數(shù)據(jù)采集的端點,通過 HTTP 的形式暴露給 Prometheus Server,使其通過 Endpoint 端點獲取監(jiān)控數(shù)據(jù)。
Alertmanager,從 Prometheus Server 端接收到 Alerts 后,會對數(shù)據(jù)進行處理。例如:去重,分組,然后根據(jù)規(guī)則,發(fā)出報警。
Web UI,Prometheus Server 內(nèi)置的 Express Browser UI,通過 PromQL 實現(xiàn)數(shù)據(jù)的查詢以及可視化。

Prometheus Server 定期從 Jobs/Exporters 中拉 Metrics。同時也可以接收來自 Pushgateway 發(fā)過來的 Metrics。
Prometheus Server 將接受到的數(shù)據(jù)存儲在本地時序數(shù)據(jù)庫,并運行已定義好的 alert.rules(告警規(guī)則),一旦滿足告警規(guī)則就會向 Alertmanager 推送警報。
Alertmanager 根據(jù)配置文件,對接收到的警報進行處理,例如:發(fā)出郵件告警,或者借助第三方組件進行告警。
WebUI/Grafana/APIclients,可以借助 PromQL 對監(jiān)控數(shù)據(jù)進行查詢。

Zabbix 的成熟度更高,上手更快。高集成度導致靈活性較差,在監(jiān)控復雜度增加后,定制難度會升高。而且使用的關(guān)系型數(shù)據(jù)庫,對于大規(guī)模的監(jiān)控數(shù)據(jù)插入和查詢是個問題。
Prometheus 上手難度大,定制靈活度高,有較多數(shù)據(jù)聚合的可能,而且有時序數(shù)據(jù)庫的加持。
對于監(jiān)控物理機或者監(jiān)控環(huán)境相對穩(wěn)定的情況,Zabbix 有明顯優(yōu)勢。如果監(jiān)控場景多是云環(huán)境的話,推薦使用 Prometheus。
總結(jié)

