監(jiān)控系統(tǒng)選型,這篇不可不讀!
必知必會的監(jiān)控基礎知識 主流監(jiān)控系統(tǒng)介紹 監(jiān)控系統(tǒng)的選型建議

實時采集監(jiān)控數(shù)據(jù):包括硬件、操作系統(tǒng)、中間件、應用程序等各個維度的數(shù)據(jù)。 實時反饋監(jiān)控狀態(tài):通過對采集的數(shù)據(jù)進行多維度統(tǒng)計和可視化展示,能實時體現(xiàn)監(jiān)控對象的狀態(tài)是正常還是異常。 預知故障和告警:能夠提前預知故障風險,并及時發(fā)出告警信息。 輔助定位故障:提供故障發(fā)生時的各項指標數(shù)據(jù),輔助故障分析和定位。 輔助性能調優(yōu):為性能調優(yōu)提供數(shù)據(jù)支持,比如慢SQL,接口響應時間等。 輔助容量規(guī)劃:為服務器、中間件以及應用集群的容量規(guī)劃提供數(shù)據(jù)支撐。 輔助自動化運維:為自動擴容或者根據(jù)配置的SLA進行服務降級等智能運維提供數(shù)據(jù)支撐。

了解監(jiān)控對象的工作原理:要做到對監(jiān)控對象有基本的了解,清楚它的工作原理。比如想對JVM進行監(jiān)控,你必須清楚JVM的堆內存結構和垃圾回收機制。 確定監(jiān)控對象的指標:清楚使用哪些指標來刻畫監(jiān)控對象的狀態(tài)?比如想對某個接口進行監(jiān)控,可以采用請求量、耗時、超時量、異常量等指標來衡量。 定義合理的報警閾值和等級:達到什么閾值需要告警?對應的故障等級是多少?不需要處理的告警不是好告警,可見定義合理的閾值有多重要,否則只會降低運維效率或者讓監(jiān)控系統(tǒng)失去它的作用。 建立完善的故障處理流程:收到故障告警后,一定要有相應的處理流程和oncall機制,讓故障及時被跟進處理。

CPU:單個CPU以及整體的使用情況 內存:已用內存、可用內存 磁盤:磁盤使用率、磁盤讀寫的吞吐量 網絡:出口流量、入口流量、TCP連接狀態(tài)
Nginx:活躍連接數(shù)、等待連接數(shù)、丟棄連接數(shù)、請求量、耗時、5XX錯誤率 Tomcat:最大線程數(shù)、當前線程數(shù)、請求量、耗時、錯誤量、堆內存使用情況、GC次數(shù)和耗時 緩存?:成功連接數(shù)、阻塞連接數(shù)、已使用內存、內存碎片率、請求量、耗時、緩存命中率 消息隊列:連接數(shù)、隊列數(shù)、生產速率、消費速率、消息堆積量
HTTP接口:URL存活、請求量、耗時、異常量 RPC接口:請求量、耗時、超時量、拒絕量 JVM :GC次數(shù)、GC耗時、各個內存區(qū)域的大小、當前線程數(shù)、死鎖線程數(shù) 線程池:活躍線程數(shù)、任務隊列大小、任務執(zhí)行耗時、拒絕任務數(shù) 連接池:總連接數(shù)、活躍連接數(shù) 日志監(jiān)控:訪問日志、錯誤日志 業(yè)務指標:視業(yè)務來定,比如PV、訂單量等

數(shù)據(jù)采集:采集的方式有很多種,包括日志埋點進行采集(通過Logstash、Filebeat等進行上報和解析),JMX標準接口輸出監(jiān)控指標,被監(jiān)控對象提供REST API進行數(shù)據(jù)采集(如Hadoop、ES),系統(tǒng)命令行,統(tǒng)一的SDK進行侵入式的埋點和上報等。 數(shù)據(jù)傳輸:將采集的數(shù)據(jù)以TCP、UDP或者HTTP協(xié)議的形式上報給監(jiān)控系統(tǒng),有主動Push模式,也有被動Pull模式。 數(shù)據(jù)存儲:有使用MySQL、Oracle等RDBMS存儲的,也有使用時序數(shù)據(jù)庫RRDTool、OpentTSDB、InfluxDB存儲的,還有使用HBase存儲的。 數(shù)據(jù)展示:數(shù)據(jù)指標的圖形化展示。 監(jiān)控告警:靈活的告警設置,以及支持郵件、短信、IM等多種通知通道。



Zabbix Server:核心組件,C語言編寫,負責接收Agent、Proxy發(fā)送的監(jiān)控數(shù)據(jù),也支持JMX、SNMP等多種協(xié)議直接采集數(shù)據(jù)。同時,它還負責數(shù)據(jù)的匯總存儲以及告警觸發(fā)等。 Zabbix Proxy:可選組件,對于被監(jiān)控機器較多的情況下,可使用Proxy進行分布式監(jiān)控,它能代理Server收集部分監(jiān)控數(shù)據(jù),以減輕Server的壓力。 Zabbix Agentd:部署在被監(jiān)控主機上,用于采集本機的數(shù)據(jù)并發(fā)送給Proxy或者Server,它的插件機制支持用戶自定義數(shù)據(jù)采集腳本。Agent可在Server端手動配置,也可以通過自動發(fā)現(xiàn)機制被識別。數(shù)據(jù)收集方式同時支持主動Push和被動Pull 兩種模式。 Database:用于存儲配置信息以及采集到的數(shù)據(jù),支持MySQL、Oracle等關系型數(shù)據(jù)庫。同時,最新版本的Zabbix已經開始支持時序數(shù)據(jù)庫,不過成熟度還不高。 Web Server:Zabbix的GUI組件,PHP編寫,提供監(jiān)控數(shù)據(jù)的展現(xiàn)和告警配置。
產品成熟:由于誕生時間長且使用廣泛,擁有豐富的文檔資料以及各種開源的數(shù)據(jù)采集插件,能覆蓋絕大部分監(jiān)控場景。 采集方式豐富:支持Agent、SNMP、JMX、SSH等多種采集方式,以及主動和被動的數(shù)據(jù)傳輸方式。 較強的擴展性:支持Proxy分布式監(jiān)控,有agent自動發(fā)現(xiàn)功能,插件式架構支持用戶自定義數(shù)據(jù)采集腳本。 配置管理方便:能通過Web界面進行監(jiān)控和告警配置,操作方便,上手簡單。
性能瓶頸:機器量或者業(yè)務量大了后,關系型數(shù)據(jù)庫的寫入一定是瓶頸,官方給出的單機上限是5000臺,個人感覺達不到,尤其現(xiàn)在應用層的指標越來越多。雖然最新版已經開始支持時序數(shù)據(jù)庫,不過成熟度還不高。 應用層監(jiān)控支持有限:如果想對應用程序做侵入式的埋點和采集(比如監(jiān)控線程池或者接口性能),zabbix沒有提供對應的sdk,通過插件式的腳本也能曲線實現(xiàn)此功能,個人感覺zabbix就不是做這個事的。 數(shù)據(jù)模型不強大:不支持tag,因此沒法按多維度進行聚合統(tǒng)計和告警配置,使用起來不靈活。 方便二次開發(fā)難度大:Zabbix采用的是C語言,二次開發(fā)往往需要熟悉它的數(shù)據(jù)表結構,基于它提供的API更多只能做展示層的定制。


Falcon-agent:數(shù)據(jù)采集器和收集器,Go開發(fā),部署在被監(jiān)控的機器上,支持3種數(shù)據(jù)采集方式。首先它能自動采集單機200多個基礎監(jiān)控指標,無需做任何配置;同時支持用戶自定義的plugin獲取監(jiān)控數(shù)據(jù);此外,用戶可通過http接口,自主push數(shù)據(jù)到本機的proxy-gateway,由gateway轉發(fā)到server. Transfer:數(shù)據(jù)分發(fā)組件,接收客戶端發(fā)送的數(shù)據(jù),分別發(fā)送給數(shù)據(jù)存儲組件Graph和告警判定組件Judge,Graph和Judge均采用一致性hash做數(shù)據(jù)分片,以提高橫向擴展能力。同時Transfer還支持將數(shù)據(jù)分發(fā)到OpenTSDB,用于歷史歸檔。 Graph:數(shù)據(jù)存儲組件,底層使用RRDTool(時序數(shù)據(jù)庫)做單個指標的存儲,并通過緩存、分批寫入磁盤等方式進行了優(yōu)化。據(jù)說一個graph實例能夠處理8W+每秒的寫入速率。 Judge和Alarm:告警組件,Judge對Transfer組件上報的數(shù)據(jù)進行實時計算,判斷是否要產生告警事件,Alarm組件對告警事件進行收斂處理后,將告警消息推送給各個消息通道。 API:面向終端用戶,收到查詢請求后會去Graph中查詢指標數(shù)據(jù),匯總結果后統(tǒng)一返回給用戶,屏蔽了存儲集群的分片細節(jié)。
自動采集能力:Falcon-agent 能自動采集服務器的200多個基礎指標(比如CPU、內存等),無需在server上做任何配置,這一點可以秒殺Zabbix. 強大的存儲能力:底層采用RRDTool,并且通過一致性hash進行數(shù)據(jù)分片,構建了一個分布式的時序數(shù)據(jù)存儲系統(tǒng),可擴展性強。 靈活的數(shù)據(jù)模型:借鑒OpenTSDB,數(shù)據(jù)模型中引入了tag,這樣能支持多維度的聚合統(tǒng)計以及告警規(guī)則設置,大大提高了使用效率。 插件統(tǒng)一管理:Open-Falcon的插件機制實現(xiàn)了對用戶自定義腳本的統(tǒng)一化管理,可通過HeartBeat Server分發(fā)給agent,減輕了使用者自主維護腳本的成本。 個性化監(jiān)控支持:基于Proxy-gateway,很容易通過自主埋點實現(xiàn)應用層的監(jiān)控(比如監(jiān)控接口的訪問量和耗時)和其他個性化監(jiān)控需求,集成方便。
整體發(fā)展一般:社區(qū)活躍度不算高,同時版本更新慢,有些大廠是基于它的穩(wěn)定版本直接做二次開發(fā)的,關于以后的前景其實有點擔憂。 UI不夠友好:對于業(yè)務線的研發(fā)來說,可能只想便捷地完成告警配置和業(yè)務監(jiān)控,但是它把機器分組、策略模板、模板繼承等概念全部暴露在UI上,感覺在圍繞這幾個概念設計UI,理解有點費勁。 安裝比較復雜:個人的親身感受,由于它是從小米內部衍生出來的,雖然去掉了對小米內部系統(tǒng)的依賴,但是組件還是比較多,如果對整個架構不熟悉,安裝很難一蹴而就。


Prometheus Server:核心組件,用于收集、存儲監(jiān)控數(shù)據(jù)。它同時支持靜態(tài)配置和通過Service Discovery動態(tài)發(fā)現(xiàn)來管理監(jiān)控目標,并從監(jiān)控目標中獲取數(shù)據(jù)。此外,Prometheus Server 也是一個時序數(shù)據(jù)庫,它將監(jiān)控數(shù)據(jù)保存在本地磁盤中,并對外提供自定義的 PromQL 語言實現(xiàn)對數(shù)據(jù)的查詢和分析。 Exporter:用來采集數(shù)據(jù),作用類似于agent,區(qū)別在于Prometheus是基于Pull方式拉取采集數(shù)據(jù)的,因此,Exporter通過HTTP服務的形式將監(jiān)控數(shù)據(jù)按照標準格式暴露給Prometheus Server,社區(qū)中已經有大量現(xiàn)成的Exporter可以直接使用,用戶也可以使用各種語言的client library自定義實現(xiàn)。 Push gateway:主要用于瞬時任務的場景,防止Prometheus Server來pull數(shù)據(jù)之前此類Short-lived jobs就已經執(zhí)行完畢了,因此job可以采用push的方式將監(jiān)控數(shù)據(jù)主動匯報給Push gateway緩存起來進行中轉。 Alert Manager:當告警產生時,Prometheus Server將告警信息推送給Alert Manager,由它發(fā)送告警信息給接收方。 Web UI:Prometheus內置了一個簡單的web控制臺,可以查詢配置信息和指標等,而實際應用中我們通常會將Prometheus作為Grafana的數(shù)據(jù)源,創(chuàng)建儀表盤以及查看指標。
輕量管理:架構簡單,不依賴外部存儲,單個服務器節(jié)點可直接工作,二進制文件啟動即可,屬于輕量級的Server,便于遷移和維護。 較強的處理能力:監(jiān)控數(shù)據(jù)直接存儲在Prometheus Server本地的時序數(shù)據(jù)庫中,單個實例可以處理數(shù)百萬的metrics。 靈活的數(shù)據(jù)模型:同Open-Falcon,引入了tag,屬于多維數(shù)據(jù)模型,聚合統(tǒng)計更方便。 強大的查詢語句:PromQL允許在同一個查詢語句中,對多個metrics進行加法、連接和取分位值等操作。 很好地支持云環(huán)境:能自動發(fā)現(xiàn)容器,同時k8s和etcd等項目都提供了對Prometheus的原生支持,是目前容器監(jiān)控最流行的方案。
功能不夠完善:Prometheus從一開始的架構設計就是要做到簡單,不提供集群化方案,長期的持久化存儲和用戶管理,而這些是企業(yè)變大后所必須的特性,目前要做到這些只能在Prometheus之上進行擴展。 網絡規(guī)劃變復雜:由于Prometheus采用的是Pull模型拉取數(shù)據(jù),意味著所有被監(jiān)控的endpoint必須是可達的,需要合理規(guī)劃網絡的安全配置。
最后的話

有道無術,術可成;有術無道,止于術
歡迎大家關注Java之道公眾號
好文章,我在看??
評論
圖片
表情
