5.1 介紹
Heartbeat Server. 所有Agent都會(huì)連到hbs吁讨,每分鐘發(fā)一次心跳髓迎,匯報(bào)自己的hostname、ip建丧、agent version排龄、plugin version,hbs據(jù)此
填充host表翎朱。agent還會(huì)通過(guò)hbs拿到應(yīng)該監(jiān)控的端口橄维、進(jìn)程,應(yīng)該執(zhí)行的插件等信息拴曲。
hbs要能夠處理agent的上述請(qǐng)求争舞,就需要與portal的數(shù)據(jù)庫(kù)打交道,這是無(wú)論如何無(wú)法避免的疗韵,那就為hbs再賦予一個(gè)功能:DB的緩存器兑障。judge
也需要通過(guò)portal的DB拿到策略列表,在一個(gè)大點(diǎn)的公司蕉汪,judge實(shí)例可能比較多,幾十個(gè)逞怨、甚至上百個(gè)者疤,有了hbs這個(gè)DB緩存器在這了,judge就
無(wú)需直接訪問DB了叠赦,從hbs獲取策略列表即可驹马。如此一來(lái),hbs可以每分鐘從DB讀取一次數(shù)據(jù)除秀,這一分鐘內(nèi)所有judge的請(qǐng)求都可以直接讀取內(nèi)存糯累。
另外,DB存的是關(guān)系型數(shù)據(jù)册踩,需要做一些轉(zhuǎn)換才能被judge使用泳姐,hbs從DB中讀取到數(shù)據(jù)之后順便把轉(zhuǎn)換也做了,這樣所有judge就無(wú)需再做轉(zhuǎn)換了暂吉。
所以hbs的邏輯就變成了:每分鐘從DB中l(wèi)oad各種數(shù)據(jù)胖秒,處理后放到內(nèi)存里缎患,靜待agent、judge的請(qǐng)求阎肝。
5.2 安裝Installation
# set $GOPATH and $GOROOT
mkdir -p $GOPATH/src/github.com/open-falcon
cd $GOPATH/src/github.com/open-falcon
git clone https://github.com/open-falcon/hbs.git
cd hbs
go get ./...
./control build
./control start
5.3 配置 Configuration
- database: portal的db連接地址
- maxIdle: 數(shù)據(jù)庫(kù)連接池的MaxIdle配置
- listen: 監(jiān)聽的rpc端口挤渔,judge要通過(guò)這個(gè)端口拿到策略列表
- trustable: 可信ip列表,安全起見留空即可
- http: 監(jiān)聽的http地址风题,主要是做調(diào)試
# 配置說(shuō)明
{
"debug": true,
"database": "root:password@tcp(127.0.0.1:3306)/falcon_portal?loc=Local&parseTime=true", # Portal的數(shù)據(jù)庫(kù)地址
"hosts": "", # portal數(shù)據(jù)庫(kù)中有個(gè)host表判导,如果表中數(shù)據(jù)是從其他系統(tǒng)同步過(guò)來(lái)的,此處配置為sync沛硅,否則就維持默認(rèn)骡楼,留空即可
"maxIdle": 100,
"listen": ":6030", # hbs監(jiān)聽的rpc地址
"trustable": [""],
"http": {
"enabled": true,
"listen": "0.0.0.0:6031" # hbs監(jiān)聽的http地址
}
}
5.4 執(zhí)行流程
1. 解析配置文件
2. db初始化
將數(shù)據(jù)庫(kù)打開并將打開的鏈接,一直放在db模塊稽鞭,不用關(guān)閉
3. cache初始化
初始化鸟整,并開啟定期初始化任務(wù)
GroupPlugins.Init():從plugin_dir查詢并且初始化GroupPlugins,此數(shù)據(jù)結(jié)構(gòu)以grp_id為key朦蕴,插件目錄列表為value
GroupTemplates.Init():從grp_tpl查詢并且初始化GroupTemplates篮条,此數(shù)據(jù)結(jié)構(gòu)以grp_id為key,模版目錄為value
HostGroupsMap.Init():host_id為key吩抓,grp_id列表為value
HostMap.Init():key: hostname value: hostid
TemplateCache.Init():key:grp_id value: 策略模板列表
Strategies.Init(TemplateCache.GetMap()):策略初始化
HostTemplateIds.Init():一個(gè)host對(duì)應(yīng)多個(gè)模版id
ExpressionCache.Init():表達(dá)式列表
MonitoredHosts.Init():初始化監(jiān)控的機(jī)器列表
4. 刪除舊的angents
刪除24小時(shí)沒有上報(bào)狀態(tài)的agent信息
5. http服務(wù)啟動(dòng)
涉及通用路由涉茧、產(chǎn)品相關(guān)的路由
6. rpc服務(wù)啟動(dòng)
涉及hbs、agent兩類rpc服務(wù)
7. 監(jiān)測(cè)中斷和正常退出信號(hào)疹娶,關(guān)閉數(shù)據(jù)庫(kù)并且退出
5.5 源碼分析
1. 數(shù)據(jù)庫(kù)與緩存
******緩存*******
- 組插件:map[組id][]插件目錄
- hostname:map[hostname]hostid
- 主機(jī)到組:map[hostid][]grp_id
- 組模版:map[grp_id][]tpl_id
- 模版: map[tpl_id]模版引用
- 策略:map[策略id]策略
- 主機(jī)模版:map[主機(jī)id] []模版id
- 表達(dá)式:[]表達(dá)式
- 被監(jiān)控的主機(jī):map[主機(jī)id]主機(jī)
# 每一分鐘更新緩存
******數(shù)據(jù)表*****
- 插件目錄表:plugin_dir (grp_id, dir)
- 主機(jī)表: host (id, hostname)
- 組模版表: grp_tpl (grp_id, tpl_id)
- 組主機(jī)表: grp_host(grp_id伴栓,host_id)
- 模版表: tpl(id, tpl_name, parent_id, action_id, create_user)
- 策略表: strategy(id,metric,tags,func,op,right_value,max_step,priority,note,tpl_id) 多個(gè)策略對(duì)應(yīng)一個(gè)模版
- 表達(dá)式:expression(id, expression, func, op, right_value, max_step, priority, note, action_id)
2. http接口
*********通用接口***************
/health 健康狀態(tài)檢查
/version 版本信息
/workdir 獲取當(dāng)前目錄
/config/reload 重新導(dǎo)入配置
*********業(yè)務(wù)接口***************
/expressions 返回緩存中的表達(dá)式
/agents 返回所有的agent
/hosts 返回所有被監(jiān)控的主機(jī)
/strategies 返回所有的策略
/templates 返回所有的模版
/plugins 獲取摸個(gè)host對(duì)應(yīng)的插件
3. grpc接口
*************agent相關(guān)************
MinePlugins #根據(jù)hostname獲取plugins列表
ReportStatus #狀態(tài)匯報(bào)
TrustableIps #返回允許登錄的白名單
BuitinMetrics #根據(jù)host那么獲取需要采集的metric
*************hbs相關(guān)************
GetExpressions #獲取表達(dá)式列表
GetStrategies #獲取配置列表
5.6 總結(jié)
- hbs是open-falcon中管理配置信息的服務(wù),為其他模塊提供獲取配置緩存的接口雨饺。
- hbs負(fù)責(zé)存儲(chǔ)agent相關(guān)元信息钳垮,提供agent獲取自身信息的緩存。
- 綜上:hbs是一個(gè)緩存配置文件的服務(wù)额港,為下游agent饺窿,以及其他需要讀取配置緩存的模塊,提供統(tǒng)一的數(shù)據(jù)庫(kù)查詢移斩,與緩存的更新肚医。
- 這樣設(shè)計(jì)的好處是:能夠?qū)⑺信c配置信息的同步都在hbs做掉,不用每個(gè)模版都去完成自身相關(guān)配置信息的維護(hù)向瓷,簡(jiǎn)化了系統(tǒng)的復(fù)雜性肠套。