开源监控解决方案OpenFalcon系列(一)
OpenFalcon是由小米的運(yùn)維團(tuán)隊(duì)開源的一款企業(yè)級、高可用、可擴(kuò)展的開源監(jiān)控解決方案,,在眾多開源愛好者的支持下,功能越來越豐富,文檔更加的完善,OpenFalcon 已經(jīng)成為國內(nèi)最流行的監(jiān)控系統(tǒng)之一。小米、美團(tuán)、金山云、快網(wǎng)、宜信、七牛、又拍云、趕集、滴滴、金山辦公、愛奇藝、一點(diǎn)資訊、快牙、開心網(wǎng)、借貸寶、百度、迅雷等公司使用,如果關(guān)注招聘網(wǎng)站的話會發(fā)現(xiàn)非常多的崗位要求熟悉openfalcon,這也意味著OpenFalcon的使用非常廣泛。還是非常值得花費(fèi)一些精力去研究一下Openfalcon的架構(gòu)以及使用等知識。
官網(wǎng):http://www.open-falcon.org/
GitHub 地址:https://github.com/open-falcon
文檔地址:https://book.open-falcon.org/zh_0_2/
API文檔:http://open-falcon.org/falcon-plus/
Openfalcon是采取了前后端分離的架構(gòu),后端用Go語言開發(fā),前端用Python開發(fā)。編譯后的后端程序運(yùn)行時(shí),不再需要Go語言環(huán)境,直接將可執(zhí)行文件拷貝到某臺機(jī)器上面運(yùn)行就可以了,而前端是需要python環(huán)境。當(dāng)機(jī)器數(shù)量比較大的時(shí)候,一般會預(yù)先將Agent安裝到機(jī)器上(物理機(jī)標(biāo)準(zhǔn)化裝機(jī)時(shí)安裝,虛擬機(jī)可以封裝到鏡像中,私有云或者公有云都支持主要都是網(wǎng)絡(luò)問題)。當(dāng)Agent運(yùn)行時(shí)就會上報(bào)數(shù)據(jù)。
Openfalcon架構(gòu):
整個(gè)后端采用模塊化設(shè)計(jì),包含agent、aggregator、alarm、api、gateway、graph、hbs、judge、nodata、transfer等模塊。接下來再介紹一下每個(gè)模塊的功能和特點(diǎn)。
(1) agent: 用于采集機(jī)器負(fù)載監(jiān)控指標(biāo),比如cpu.idle、load.1min、disk.io.util等等,每隔60秒push給Transfer。agent與Transfer建立了長連接,數(shù)據(jù)發(fā)送速度比較快,agent提供了一個(gè)http接口/v1/push用于接收用戶手工push的一些數(shù)據(jù),然后通過長連接迅速轉(zhuǎn)發(fā)給Transfer。agent是需要部署到所有要被監(jiān)控的機(jī)器上,比如公司有10萬臺機(jī)器,那就要部署10萬個(gè)agent。agent本身資源消耗很少,不用擔(dān)心。小米開源的Agent只包含Linux,汽車之家等公司相繼開源了Windows的Agent。
? ?被監(jiān)控機(jī)Agent提供一個(gè)默認(rèn)監(jiān)聽的1988端口的HTTP服務(wù),提供了一個(gè)UI設(shè)計(jì)不錯(cuò)的Web界面,在該頁面上能夠展示內(nèi)核、運(yùn)行時(shí)間、主機(jī)名、負(fù)載情況、內(nèi)存使用,磁盤使用等基礎(chǔ)監(jiān)控?cái)?shù)據(jù)。此外還提供了一些接口,通過這些接口獲取一些基礎(chǔ)監(jiān)控?cái)?shù)據(jù)。
(2)aggregator?集群聚合模塊。聚合某集群下的所有機(jī)器的某個(gè)指標(biāo)的值,提供一種集群視角的監(jiān)控體驗(yàn)。這種視角下能更好的體現(xiàn)整個(gè)集群的某個(gè)監(jiān)控指標(biāo),但是該模塊目前不是非常完善,我們在生產(chǎn)環(huán)境中沒并沒有使用該模塊。
(3)alarm?是處理報(bào)警event的,judge產(chǎn)生的報(bào)警event寫入redis,alarm從redis讀取處理,報(bào)警event的處理邏輯并非僅僅是發(fā)郵件、發(fā)短信這么簡單。為了能夠自動化對event做處理,alarm需要支持在產(chǎn)生event的時(shí)候回調(diào)用戶提供的接口;有的時(shí)候報(bào)警短信、郵件太多,對于優(yōu)先級比較低的報(bào)警,希望做報(bào)警合并,這些邏輯都是在alarm中做的。
? 在配置報(bào)警策略的時(shí)候配置了報(bào)警級別,比如P0/P1/P2等等,每個(gè)及別的報(bào)警都會對應(yīng)不同的redis隊(duì)列 alarm去讀取這個(gè)數(shù)據(jù)的時(shí)候希望先讀取P0的數(shù)據(jù),再讀取P1的數(shù)據(jù),最后讀取P5的數(shù)據(jù),因?yàn)橄M忍幚韮?yōu)先級高的。于是:用了redis的brpop指令。
?注意事項(xiàng):alarm是個(gè)單點(diǎn)。對于未恢復(fù)的告警是放到alarm的內(nèi)存中的,alarm還需要做報(bào)警合并,故而alarm只能部署一個(gè)實(shí)例。后期需要想辦法改進(jìn)。
報(bào)警合并:如果某個(gè)核心服務(wù)掛了,可能會造成大面積報(bào)警,為了減少報(bào)警短信數(shù)量,我們做了報(bào)警合并功能。把報(bào)警信息寫入links模塊,然后links返回一個(gè)url地址給alarm,alarm將這個(gè)url鏈接發(fā)給用戶,這樣用戶只要收到一條短信(里邊是個(gè)url地址),點(diǎn)擊url進(jìn)去就是多條報(bào)警內(nèi)容。
highQueues中配置的幾個(gè)event隊(duì)列中的事件是不會做報(bào)警合并的,因?yàn)槟切┦歉邇?yōu)先級的報(bào)警,報(bào)警合并只是針對lowQueues中的事件。如果所有的事件都不想做報(bào)警合并,就把所有的event隊(duì)列都配置到highQueues中即可
(4)api組件,提供統(tǒng)一的restAPI操作接口。比如:api組件接收查詢請求,根據(jù)一致性哈希算法去相應(yīng)的graph實(shí)例查詢不同metric的數(shù)據(jù),然后匯總拿到的數(shù)據(jù),最后統(tǒng)一返回給用戶。具體的可以參考http://api.open-falcon.org 的接口文檔,注意有模板用戶、管理等接口,支持post、get等方法。
(5)gateway 模塊主要是為了解決機(jī)房分區(qū),試用與異地多活、混合云、多云環(huán)境的解決方案。Falcon多數(shù)據(jù)中心時(shí),提供數(shù)據(jù)路由功能。多IDC時(shí),可能面對 "分區(qū)到中心的專線網(wǎng)絡(luò)質(zhì)量較差&公網(wǎng)ACL不通" 等問題。這時(shí),可以在分區(qū)內(nèi)部署一套數(shù)據(jù)路由服務(wù),接收本分區(qū)內(nèi)的所有流量(包括所有的agent流量),然后通過公網(wǎng)(開通ACL),將數(shù)據(jù)push給中心的Transfer。如下圖,?
? ?從client端的角度來看,gateway和transfer提供了完全一致的功能和接口。只有遇到網(wǎng)絡(luò)分區(qū)的情況時(shí),才有必要使用gateway組件。服務(wù)啟動后,可以通過日志查看服務(wù)的運(yùn)行狀態(tài),日志文件地址為./var/app.log。可以通過調(diào)試腳本./test/debug查看服務(wù)器的內(nèi)部狀態(tài)數(shù)據(jù),如 運(yùn)行 bash ./test/debug 可以得到服務(wù)器內(nèi)部狀態(tài)的統(tǒng)計(jì)信息。
gateway組件,部署于分區(qū)中。單個(gè)gateway實(shí)例的轉(zhuǎn)發(fā)能力,為 {1核, 500MB內(nèi)存, Qps不小于1W/s};官方建議,一個(gè)分區(qū)至少部署兩個(gè)gateway實(shí)例,來實(shí)現(xiàn)高可用。在我們內(nèi)部新加坡、雅加達(dá)、華盛頓、深圳、廣州、北京等公有云區(qū)域。每個(gè)區(qū)域部署一個(gè)gateway(2C4G),然后分別通過跨區(qū)域帶寬將數(shù)據(jù)回傳到我們上海、杭州IDC內(nèi)。
(6)graph 是存儲繪圖數(shù)據(jù)、歷史數(shù)據(jù)的組件。graph組件 接收transfer組件推送上來的監(jiān)控?cái)?shù)據(jù),同時(shí)處理query組件的查詢請求、返回繪圖數(shù)據(jù)。
(7)hbs(Heartbeat Server)?心跳服務(wù)器,公司所有agent都會連到HBS,每分鐘發(fā)一次心跳請求。
? Portal的數(shù)據(jù)庫中有一個(gè)host表,維護(hù)了公司所有機(jī)器的信息,比如hostname、ip等等。這個(gè)表中的數(shù)據(jù)通常是從公司CMDB中同步過來的。但是有些規(guī)模小一些的公司是沒有CMDB的,那此時(shí)就需要手工往host表中錄入數(shù)據(jù),這很麻煩。于是我們賦予了HBS第一個(gè)功能:agent發(fā)送心跳信息給HBS的時(shí)候,會把hostname、ip、agent version、plugin version等信息告訴HBS,HBS負(fù)責(zé)更新host表。
????falcon-agent有一個(gè)很大的特點(diǎn),就是自發(fā)現(xiàn),不用配置它應(yīng)該采集什么數(shù)據(jù),就自動去采集了。比如cpu、內(nèi)存、磁盤、網(wǎng)卡流量等等都會自動采集。我們除了要采集這些基礎(chǔ)信息之外,還需要做端口存活監(jiān)控和進(jìn)程數(shù)監(jiān)控。那我們是否也要自動采集監(jiān)聽的端口和各個(gè)進(jìn)程數(shù)目呢?我們沒有這么做,因?yàn)檫@個(gè)數(shù)據(jù)量比較大,匯報(bào)上去之后用戶大部分都是不關(guān)心的,太浪費(fèi)。于是我們換了一個(gè)方式,只采集用戶配置的。比如用戶配置了對某個(gè)機(jī)器80端口的監(jiān)控,我們才會去采集這個(gè)機(jī)器80端口的存活性。那agent如何知道自己應(yīng)該采集哪些端口和進(jìn)程呢?向HBS要,HBS去讀取Portal的數(shù)據(jù)庫,返回給agent。
之后我們會介紹一個(gè)用于判斷報(bào)警的組件:Judge,Judge需要獲取所有的報(bào)警策略,讓Judge去讀取Portal的DB么?不太好。因?yàn)镴udge的實(shí)例數(shù)目比較多,如果公司有幾十萬機(jī)器,Judge實(shí)例數(shù)目可能會是幾百個(gè),幾百個(gè)Judge實(shí)例去訪問Portal數(shù)據(jù)庫,也是一個(gè)比較大的壓力。既然HBS無論如何都要訪問Portal的數(shù)據(jù)庫了,那就讓HBS去獲取所有的報(bào)警策略緩存在內(nèi)存里,然后Judge去向HBS請求。這樣一來,對Portal DB的壓力就會大大減小
hbs是可以水平擴(kuò)展的,至少部署兩個(gè)實(shí)例以保證可用性。一般一個(gè)實(shí)例可以搞定5000臺機(jī)器,所以說,如果公司有10萬臺機(jī)器,可以部署20個(gè)hbs實(shí)例,前面架設(shè)lvs,agent中就配置上lvs vip即可。
(8)judge?Judge用于告警判斷,agent將數(shù)據(jù)push給Transfer,Transfer不但會轉(zhuǎn)發(fā)給Graph組件來繪圖,還會轉(zhuǎn)發(fā)給Judge用于判斷是否觸發(fā)告警。
? ?因?yàn)楸O(jiān)控系統(tǒng)數(shù)據(jù)量比較大,一臺機(jī)器顯然是搞不定的,所以必須要有個(gè)數(shù)據(jù)分片方案。Transfer通過一致性哈希來分片,每個(gè)Judge就只需要處理一小部分?jǐn)?shù)據(jù)就可以了。所以判斷告警的功能不能放在直接的數(shù)據(jù)接收端:Transfer,而應(yīng)該放到Transfer后面的組件里。
Judge監(jiān)聽了一個(gè)http端口,提供了一個(gè)http接口:/count,訪問之,可以得悉當(dāng)前Judge實(shí)例處理了多少數(shù)據(jù)量。推薦的做法是一個(gè)Judge實(shí)例處理50萬~100萬數(shù)據(jù),用個(gè)5G~10G內(nèi)存,如果所用物理機(jī)內(nèi)存比較大,比如有128G,可以在一個(gè)物理機(jī)上部署多個(gè)Judge實(shí)例。
(9)nodata? 用于檢測監(jiān)控?cái)?shù)據(jù)的上報(bào)異常。nodata和實(shí)時(shí)報(bào)警judge模塊協(xié)同工作,過程為: 配置了nodata的采集項(xiàng)超時(shí)未上報(bào)數(shù)據(jù),nodata生成一條默認(rèn)的模擬數(shù)據(jù);用戶配置相應(yīng)的報(bào)警策略,收到mock數(shù)據(jù)就產(chǎn)生報(bào)警。采集項(xiàng)上報(bào)異常檢測,作為judge模塊的一個(gè)必要補(bǔ)充,能夠使judge的實(shí)時(shí)報(bào)警功能更加可靠、完善。
? ? 此功能還是可能會出現(xiàn)較多的誤報(bào)現(xiàn)象,例如網(wǎng)絡(luò)異常,導(dǎo)致數(shù)據(jù)無法上傳,這時(shí)候就會檢測到數(shù)據(jù)異常。?
(10)transfer?transfer是數(shù)據(jù)轉(zhuǎn)發(fā)服務(wù)。它接收agent上報(bào)的數(shù)據(jù),然后按照哈希規(guī)則進(jìn)行數(shù)據(jù)分片、并將分片后的數(shù)據(jù)分別push給graph&judge等組件。
以上內(nèi)容是falcon后端程序中比較核心的模塊,同時(shí)也可以根據(jù)自己的需求去定制一些模塊。
轉(zhuǎn)載于:https://blog.51cto.com/dreamlinux/2385745
總結(jié)
以上是生活随笔為你收集整理的开源监控解决方案OpenFalcon系列(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: react学习(35)----getFi
- 下一篇: 前端学习(3294):effect ho