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