運(yùn)維架構(gòu)服務(wù)監(jiān)控Open-Falcon

一、 介紹

監(jiān)控系統(tǒng)是整個(gè)運(yùn)維環(huán)節(jié),乃至整個(gè)產(chǎn)品生命周期中最重要的一環(huán),事前及時(shí)預(yù)警發(fā)現(xiàn)故障,事后提供翔實(shí)的數(shù)據(jù)用于追查定位問題。監(jiān)控系統(tǒng)作為一個(gè)成熟的運(yùn)維產(chǎn)品,業(yè)界有很多開源的實(shí)現(xiàn)可供選擇。當(dāng)公司剛剛起步,業(yè)務(wù)規(guī)模較小,運(yùn)維團(tuán)隊(duì)也剛剛建立的初期,選擇一款開源的監(jiān)控系統(tǒng),是一個(gè)省時(shí)省力,效率最高的方案。之后,隨著業(yè)務(wù)規(guī)模的持續(xù)快速增長,監(jiān)控的對(duì)象也越來越多,越來越復(fù)雜,監(jiān)控系統(tǒng)的使用對(duì)象也從最初少數(shù)的幾個(gè)SRE,擴(kuò)大為更多的DEVS,SRE。這時(shí)候,監(jiān)控系統(tǒng)的容量和用戶的“使用效率”成了最為突出的問題。

監(jiān)控系統(tǒng)業(yè)界有很多杰出的開源監(jiān)控系統(tǒng)。我們?cè)谠缙冢恢痹谟脄abbix,不過隨著業(yè)務(wù)的快速發(fā)展,以及互聯(lián)網(wǎng)公司特有的一些需求,現(xiàn)有的開源的監(jiān)控系統(tǒng)在性能、擴(kuò)展性、和用戶的使用效率方面,已經(jīng)無法支撐了。

因此,我們?cè)谶^去的一年里,從互聯(lián)網(wǎng)公司的一些需求出發(fā),從各位SRE、SA、DEVS的使用經(jīng)驗(yàn)和反饋出發(fā),結(jié)合業(yè)界的一些大的互聯(lián)網(wǎng)公司做監(jiān)控,用監(jiān)控的一些思考出發(fā),設(shè)計(jì)開發(fā)了小米的監(jiān)控系統(tǒng):open-falcon。

二、 特點(diǎn)

1、強(qiáng)大靈活的數(shù)據(jù)采集:自動(dòng)發(fā)現(xiàn),支持falcon-agent、snmp、支持用戶主動(dòng)push、用戶自定義插件支持、opentsdb data model like(timestamp、endpoint、metric、key-value tags)

2、水平擴(kuò)展能力:支持每個(gè)周期上億次的數(shù)據(jù)采集、告警判定、歷史數(shù)據(jù)存儲(chǔ)和查詢

3、高效率的告警策略管理:高效的portal、支持策略模板、模板繼承和覆蓋、多種告警方式、支持callback調(diào)用

4、人性化的告警設(shè)置:最大告警次數(shù)、告警級(jí)別、告警恢復(fù)通知、告警暫停、不同時(shí)段不同閾值、支持維護(hù)周期

5、高效率的graph組件:單機(jī)支撐200萬metric的上報(bào)、歸檔、存儲(chǔ)(周期為1分鐘)

6、高效的歷史數(shù)據(jù)query組件:采用rrdtool的數(shù)據(jù)歸檔策略,秒級(jí)返回上百個(gè)metric一年的歷史數(shù)據(jù)

7、dashboard:多維度的數(shù)據(jù)展示,用戶自定義Screen

8、高可用:整個(gè)系統(tǒng)無核心單點(diǎn),易運(yùn)維,易部署,可水平擴(kuò)展

9、開發(fā)語言: 整個(gè)系統(tǒng)的后端,全部golang編寫,portal和dashboard使用python編寫。

三、 架構(gòu)

每臺(tái)服務(wù)器,都有安裝falcon-agent,falcon-agent是一個(gè)golang開發(fā)的daemon程序,用于自發(fā)現(xiàn)的采集單機(jī)的各種數(shù)據(jù)和指標(biāo),這些指標(biāo)包括不限于以下幾個(gè)方面,共計(jì)200多項(xiàng)指標(biāo)。

CPU相關(guān)

磁盤相關(guān)

IO

Load

內(nèi)存相關(guān)

網(wǎng)絡(luò)相關(guān)

端口存活、進(jìn)程存活

ntp offset(插件)

某個(gè)進(jìn)程資源消耗(插件)

netstat、ss 等相關(guān)統(tǒng)計(jì)項(xiàng)采集

機(jī)器內(nèi)核配置參數(shù)

只要安裝了falcon-agent的機(jī)器,就會(huì)自動(dòng)開始采集各項(xiàng)指標(biāo),主動(dòng)上報(bào),不需要用戶在server做任何配置(這和zabbix有很大的不同),這樣做的好處,就是用戶維護(hù)方便,覆蓋率高。當(dāng)然這樣做也會(huì)server端造成較大的壓力,不過open-falcon的服務(wù)端組件單機(jī)性能足夠高,同時(shí)都可以水平擴(kuò)展,所以自動(dòng)多采集足夠多的數(shù)據(jù),反而是一件好事情,對(duì)于SRE和DEV來講,事后追查問題,不再是難題。

另外,falcon-agent提供了一個(gè)proxy-gateway,用戶可以方便的通過http接口,push數(shù)據(jù)到本機(jī)的gateway,gateway會(huì)幫忙高效率的轉(zhuǎn)發(fā)到server端。

四、 數(shù)據(jù)模型

Data Model是否強(qiáng)大,是否靈活,對(duì)于監(jiān)控系統(tǒng)用戶的“使用效率”至關(guān)重要。比如以zabbix為例,上報(bào)的數(shù)據(jù)為hostname(或者ip)、metric,那么用戶添加告警策略、管理告警策略的時(shí)候,就只能以這兩個(gè)維度進(jìn)行。舉一個(gè)最常見的場景:

hostA的磁盤空間,小于5%,就告警。一般的服務(wù)器上,都會(huì)有兩個(gè)主要的分區(qū),根分區(qū)和home分區(qū),在zabbix里面,就得加兩條規(guī)則;如果是hadoop的機(jī)器,一般還會(huì)有十幾塊的數(shù)據(jù)盤,還得再加10多條規(guī)則,這樣就會(huì)痛苦,不幸福,不利于自動(dòng)化(當(dāng)然zabbix可以通過配置一些自動(dòng)發(fā)現(xiàn)策略來搞定這個(gè),不過比較麻煩)。

五、 數(shù)據(jù)收集

transfer,接收客戶端發(fā)送的數(shù)據(jù),做一些數(shù)據(jù)規(guī)整,檢查之后,轉(zhuǎn)發(fā)到多個(gè)后端系統(tǒng)去處理。在轉(zhuǎn)發(fā)到每個(gè)后端業(yè)務(wù)系統(tǒng)的時(shí)候,transfer會(huì)根據(jù)一致性hash算法,進(jìn)行數(shù)據(jù)分片,來達(dá)到后端業(yè)務(wù)系統(tǒng)的水平擴(kuò)展。

transfer 提供jsonRpc接口和telnet接口兩種方式,transfer自身是無狀態(tài)的,掛掉一臺(tái)或者多臺(tái)不會(huì)有任何影響,同時(shí)transfer性能很高,每分鐘可以轉(zhuǎn)發(fā)超過500萬條數(shù)據(jù)。

transfer目前支持的業(yè)務(wù)后端,有三種,judge、graph、opentsdb。judge是我們開發(fā)的高性能告警判定組件,graph是我們開發(fā)的高性能數(shù)據(jù)存儲(chǔ)、歸檔、查詢組件,opentsdb是開源的時(shí)間序列數(shù)據(jù)存儲(chǔ)服務(wù)。可以通過transfer的配置文件來開啟。

transfer的數(shù)據(jù)來源,一般有三種:

1、falcon-agent采集的基礎(chǔ)監(jiān)控?cái)?shù)據(jù)

2、falcon-agent執(zhí)行用戶自定義的插件返回的數(shù)據(jù)

3、client library:線上的業(yè)務(wù)系統(tǒng),都嵌入使用了統(tǒng)一的perfcounter.jar,對(duì)于業(yè)務(wù)系統(tǒng)中每個(gè)RPC接口的qps、latency都會(huì)主動(dòng)采集并上報(bào)

說明:上面這三種數(shù)據(jù),都會(huì)先發(fā)送給本機(jī)的proxy-gateway,再由gateway轉(zhuǎn)發(fā)給transfer。

基礎(chǔ)監(jiān)控是指只要是個(gè)機(jī)器(或容器)就能加的監(jiān)控,比如cpu mem net io disk等,這些監(jiān)控采集的方式固定,不需要配置,也不需要用戶提供額外參數(shù)指定,只要agent跑起來就可以直接采集上報(bào)上去; 非基礎(chǔ)監(jiān)控則相反,比如端口監(jiān)控,你不給我端口號(hào)就不行,不然我上報(bào)所有65535個(gè)端口的監(jiān)聽狀態(tài)你也用不了,這類監(jiān)控需要用戶配置后才會(huì)開始采集上報(bào)的監(jiān)控(包括類似于端口監(jiān)控的配置觸發(fā)類監(jiān)控,以及類似于mysql的插件腳本類監(jiān)控),一般就不算基礎(chǔ)監(jiān)控的范疇了。

六、 報(bào)警

報(bào)警判定,是由judge組件來完成。用戶在web portal來配置相關(guān)的報(bào)警策略,存儲(chǔ)在MySQL中。heartbeat server 會(huì)定期加載MySQL中的內(nèi)容。judge也會(huì)定期和heartbeat server保持溝通,來獲取相關(guān)的報(bào)警策略。

heartbeat sever不僅僅是單純的加載MySQL中的內(nèi)容,根據(jù)模板繼承、模板項(xiàng)覆蓋、報(bào)警動(dòng)作覆蓋、模板和hostGroup綁定,計(jì)算出最終關(guān)聯(lián)到每個(gè)endpoint的告警策略,提供給judge組件來使用。

transfer轉(zhuǎn)發(fā)到j(luò)udge的每條數(shù)據(jù),都會(huì)觸發(fā)相關(guān)策略的判定,來決定是否滿足報(bào)警條件,如果滿足條件,則會(huì)發(fā)送給alarm,alarm再以郵件、短信、米聊等形式通知相關(guān)用戶,也可以執(zhí)行用戶預(yù)先配置好的callback地址。

用戶可以很靈活的來配置告警判定策略,比如連續(xù)n次都滿足條件、連續(xù)n次的最大值滿足條件、不同的時(shí)間段不同的閾值、如果處于維護(hù)周期內(nèi)則忽略 等等。

另外也支持突升突降類的判定和告警。

七、 API

到這里,數(shù)據(jù)已經(jīng)成功的存儲(chǔ)在了graph里。如何快速的讀出來呢,讀過去1小時(shí)的,過去1天的,過去一月的,過去一年的,都需要在1秒之內(nèi)返回。

這些都是靠graph和API組件來實(shí)現(xiàn)的,transfer會(huì)將數(shù)據(jù)往graph組件轉(zhuǎn)發(fā)一份,graph收到數(shù)據(jù)以后,會(huì)以rrdtool的數(shù)據(jù)歸檔方式來存儲(chǔ),同時(shí)提供查詢RPC接口。

API面向終端用戶,收到查詢請(qǐng)求后,會(huì)去多個(gè)graph里面,查詢不同metric的數(shù)據(jù),匯總后統(tǒng)一返回給用戶。

八、 面板

九、 存儲(chǔ)

對(duì)于監(jiān)控系統(tǒng)來講,歷史數(shù)據(jù)的存儲(chǔ)和高效率查詢,永遠(yuǎn)是個(gè)很難的問題!

數(shù)據(jù)量大:目前我們的監(jiān)控系統(tǒng),每個(gè)周期,大概有2000萬次數(shù)據(jù)上報(bào)(上報(bào)周期為1分鐘和5分鐘兩種,各占50%),一天24小時(shí)里,從來不會(huì)有業(yè)務(wù)低峰,不管是白天和黑夜,每個(gè)周期,總會(huì)有那么多的數(shù)據(jù)要更新。

寫操作多:一般的業(yè)務(wù)系統(tǒng),通常都是讀多寫少,可以方便的使用各種緩存技術(shù),再者各類數(shù)據(jù)庫,對(duì)于查詢操作的處理效率遠(yuǎn)遠(yuǎn)高于寫操作。而監(jiān)控系統(tǒng)恰恰相反,寫操作遠(yuǎn)遠(yuǎn)高于讀。每個(gè)周期幾千萬次的更新操作,對(duì)于常用數(shù)據(jù)庫(MySQL、postgresql、mongodb)都是無法完成的。

高效率的查:我們說監(jiān)控系統(tǒng)讀操作少,是說相對(duì)寫入來講。監(jiān)控系統(tǒng)本身對(duì)于讀的要求很高,用戶經(jīng)常會(huì)有查詢上百個(gè)meitric,在過去一天、一周、一月、一年的數(shù)據(jù)。如何在1秒內(nèi)返回給用戶并繪圖,這是一個(gè)不小的挑戰(zhàn)。

open-falcon在這塊,投入了較大的精力。我們把數(shù)據(jù)按照用途分成兩類,一類是用來繪圖的,一類是用戶做數(shù)據(jù)挖掘的。

對(duì)于繪圖的數(shù)據(jù)來講,查詢要快是關(guān)鍵,同時(shí)不能丟失信息量。對(duì)于用戶要查詢100個(gè)metric,在過去一年里的數(shù)據(jù)時(shí),數(shù)據(jù)量本身就在那里了,很難1秒之類能返回,另外就算返回了,前端也無法渲染這么多的數(shù)據(jù),還得采樣,造成很多無謂的消耗和浪費(fèi)。我們參考rrdtool的理念,在數(shù)據(jù)每次存入的時(shí)候,會(huì)自動(dòng)進(jìn)行采樣、歸檔。我們的歸檔策略如下,歷史數(shù)據(jù)保存5年。同時(shí)為了不丟失信息量,數(shù)據(jù)歸檔的時(shí)候,會(huì)按照平均值采樣、最大值采樣、最小值采樣存三份。

原文鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容