大數據監控平台實踐之路
綜述
日誌和監控開發人員工作中必不可少的兩隻眼睛,日誌是為了快速定位排查故障,監控是為了發現潛在問題並能及時告警,是故障診斷和分析的重要輔助利器,同樣監控系統對大數據平台重要性不言而喻。在發生事故之前就能預警,最大限度降低系統故障率,是監控的終極目標和價值體現。本文旨在幫助大家了解監控系統,並能快速搭建公司的監控平台。
監控體系
監控粒度、監控指標完整性、監控實時性是評價監控系統的三要素。從分層體系可以把監控系統分為三個層次:
業務層:業務系統本質目的是為了達成業務目標,因此監控業務系統是否正常最有效的方式是從數據上監控業務目標是否達成。對業務運營數據進行監控,可及時發現程序bug或業務邏輯設計缺陷,比如註冊失敗率、登錄失敗率、付款失敗率等。業務系統的多樣性決定了應由各個業務系統實現監控指標開發。
應用層:對應用的整體運行狀況進行了解、把控,如果將應用當成黑盒子,開發、運維就無從知曉應用當前狀態,不能及時發現潛在故障。應用監控不應局限於業務系統,還包括各種中間件、計算引擎,如Spark、Jstorm、redis、zookeeper、kafka等。常用監控數據:JVM堆內存、GC、CPU使用率、線程數、TPS、吞吐量等。一般通過抽象出的統一指標收集組件,收集應用級指標,比如不管是支付系統還是交易系統,都要監控jvm內存使用。
系統層:實時掌握伺服器工作狀態,留意性能、內存消耗、容量和整體系統健康狀態,保證伺服器穩定運行。監控指標:內存、磁碟、CPU、網路流量、系統進程等系統級性能指標
架構設計
工欲善其事必先利其器,根據對現有監控產品的調研,以及我們對監控的分層介紹、所需解決的問題,可以發現監控系統從收集到分析的流程架構:採集-存儲-展示-告警:
Telegraf:插件化的指標收集和指標報告服務,能定製化開發並輕鬆添加所需插件。已經內置了很多常用服務的插件,這也是我們選擇telegraf的原因之一,不用再重複造輪子
InfluxDB:高性能的布式時間序列指標資料庫。監控指標收集是非常頻繁的,否則就失去了實時性,高頻收集的結果就是大數據量,也要對時間序列進行分析,InfluxDB就能滿足這種應用場景
Grafana:時間序列分析和監控的開放平台,支持多種數據源(InfluxDB、OpenTSDB時間序列資料庫)、豐富的展現形式、支持email/dingding報警
Telegraf
go語言編寫的插件化指標收集agent,編譯成一個沒有外部依賴的二進位文件,安裝部署很便捷,直接下載、解壓就行,默認配置文件在$TELEGRAF_HOME/etc/telegraf/telegraf.conf目錄下。telegraf插件分為兩大類:input、output。
input:收集inputs配置的所有指標,已內置的input插件:elasticsearch、redis、jolokia等。也可直接收集運行agent server的各種指標,比如內存、cpu、磁碟、磁碟IO、進程、swap等。input配置都很簡明易用,一般只需配置服務IP地址就可以,如redis指標收集配置:
如果沒有內置收集插件,有兩種實現方案:
開發input插件,但這需要有GO語言基礎
藉助於httpjson input插件,該插件請求http url,返回json格式。url配置為自定義指標收集服務,在指標收集服務內實現指標收集功能,然後指標封裝成json返回或指標數據直接在服務內入庫。我們監控Kettle Carte、spark、jstorm等用的這種實現思路。
output:將收集到的度量數據序列化存儲,Telegraf指標由四個部分組成:度量、標籤、欄位、時間戳。支持以下存儲結構:InfluxDB、Graphite、JSON,比如度量輸出到InfluxDB的配置:
urls:InfluxDB埠
database:存儲的資料庫
retention_policy:數據保留策略
調度頻率:所有指標收集頻率是一樣的,在配置文件agent項下配置:
服務啟動:
--config:配置文件
--config-directory:配置文件目錄,如果有多個配置文件時使用
InfluxDB
InfluxDB是為時間序列構建的高性能數據存儲,提供類SQL的查詢語言、特定分析時間序列的功能。通過設置數據保留策略,自動從系統中刪除過期數據,釋放存儲空間。社區版只支持單台伺服器,會有單點故障風險,商業版版支持高可用,對我們來說,單機InfluxDB已經能滿足需求。選擇InfluxDB的原因:
InflluxDB是用GO寫的,編譯後是一個完全無依賴的二進位文件,安裝部署非常便捷,解壓縮包即可
高性能時間序列專有資料庫,對時間序列的存儲和查詢都做了優化
類SQL查詢語言,降低使用門檻
數據保留策略可以有效的自動清理過期數據
InfluxDB的數據是以shard groups形式存儲,指定時間間隔的數據存儲到一個shard groups里,這個時間間隔稱為shardGroupDuration。
服務啟動:
influx進入shell命令行:
常用命令:
show databases:查看所有資料庫
use db_name:進入資料庫
show measurements:顯示資料庫下所有度量
select *from cpu limit 10:查詢一個度量的數據
Telegraf默認是將收集的數據持久化到telegraf這個資料庫下,每個input對應一個度量表,比如zookeeper的指標數據就在zookeeper這個度量下:
查詢數據保留策略:
duration:數據保留時間,0表示無限制,InfluxDB默認30分鐘檢查一次保留策略。ALTER RETENTION語句修改保留7天數據。
replicaN:每個度量在集群里的副本數,副本保證數據高可用性,社區版(單節點)不支持副本數設置
Java Client:
Java Client對http api進行了封裝,底層用Retrofit框架進行http請求,是線程安全的,只需在一個應用中創建一個InfluxDB Client對象。
client的寫操作支持batch,其實現原理:
1、創建後台單線程定時調度任務,線程每隔一定時間發送請求:
2、每次writer時,把請求放到BlockingQueue隊列里,如果隊列大於batch數,就啟動線程發送請求:
Client Api使用例子:
1、創建資料庫連接:
InfluxDB influxDB= InfluxDBFactory.connect(url, user, password);
url:InfluxDB的地址和埠,比如 http://localhost:8086
user/password:InfluxDB的用戶名/密碼
2、設置訪問的資料庫:
influxDB.setDatabase(database);
3、數據寫入:
Point.Builder builder = Point.measurement(measurement);
builder.tag(tags);
builder.fields(fields);
influxDB.write(builder.build());
Grafana
Grafana是一個指標查詢、可視化、監控的開源應用,有著非常漂亮的圖表和布局展示,功能齊全的度量儀錶盤和圖形編輯器,支持Graphite、zabbix、InfluxDB、Prometheus和OpenTSDB作為數據源。
Grafana主要特性:
靈活豐富的圖形化組件,包括熱力圖、直方圖、地圖等
在同一dashboard內可以混合多種展示組件
開源社區有大量的插件可供選擇,包括數據源插件、圖形插件、通知插件
可以在同一個視圖裡使用多個不同數據源
簡單使用介紹:
安裝:
下載&解壓二進位包
配置:
配置文件:$GRAFANA_HOME$/conf
配置埠號、Email、登錄用戶
start:
命令:/opt/grafana/bin/grafana-server start
訪問:
//ip:port
連接數據源、圖表開發、報警設置可參看官方文檔
本文為原創,歡迎分享到朋友圈。
TAG:data之道 |