5.1 介绍
Heartbeat Server. 所有Agent都会连到hbs,每分钟发一次心跳,汇报自己的hostname、ip、agent version、plugin version,hbs据此
填充host表。agent还会通过hbs拿到应该监控的端口、进程,应该执行的插件等信息。
hbs要能够处理agent的上述请求,就需要与portal的数据库打交道,这是无论如何无法避免的,那就为hbs再赋予一个功能:DB的缓存器。judge
也需要通过portal的DB拿到策略列表,在一个大点的公司,judge实例可能比较多,几十个、甚至上百个,有了hbs这个DB缓存器在这了,judge就
无需直接访问DB了,从hbs获取策略列表即可。如此一来,hbs可以每分钟从DB读取一次数据,这一分钟内所有judge的请求都可以直接读取内存。
另外,DB存的是关系型数据,需要做一些转换才能被judge使用,hbs从DB中读取到数据之后顺便把转换也做了,这样所有judge就无需再做转换了。
所以hbs的逻辑就变成了:每分钟从DB中load各种数据,处理后放到内存里,静待agent、judge的请求。
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: 数据库连接池的MaxIdle配置
- listen: 监听的rpc端口,judge要通过这个端口拿到策略列表
- trustable: 可信ip列表,安全起见留空即可
- http: 监听的http地址,主要是做调试
# 配置说明
{
"debug": true,
"database": "root:password@tcp(127.0.0.1:3306)/falcon_portal?loc=Local&parseTime=true", # Portal的数据库地址
"hosts": "", # portal数据库中有个host表,如果表中数据是从其他系统同步过来的,此处配置为sync,否则就维持默认,留空即可
"maxIdle": 100,
"listen": ":6030", # hbs监听的rpc地址
"trustable": [""],
"http": {
"enabled": true,
"listen": "0.0.0.0:6031" # hbs监听的http地址
}
}
5.4 执行流程
1. 解析配置文件
2. db初始化
将数据库打开并将打开的链接,一直放在db模块,不用关闭
3. cache初始化
初始化,并开启定期初始化任务
GroupPlugins.Init():从plugin_dir查询并且初始化GroupPlugins,此数据结构以grp_id为key,插件目录列表为value
GroupTemplates.Init():从grp_tpl查询并且初始化GroupTemplates,此数据结构以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():一个host对应多个模版id
ExpressionCache.Init():表达式列表
MonitoredHosts.Init():初始化监控的机器列表
4. 删除旧的angents
删除24小时没有上报状态的agent信息
5. http服务启动
涉及通用路由、产品相关的路由
6. rpc服务启动
涉及hbs、agent两类rpc服务
7. 监测中断和正常退出信号,关闭数据库并且退出
5.5 源码分析
1. 数据库与缓存
******缓存*******
- 组插件:map[组id][]插件目录
- hostname:map[hostname]hostid
- 主机到组:map[hostid][]grp_id
- 组模版:map[grp_id][]tpl_id
- 模版: map[tpl_id]模版引用
- 策略:map[策略id]策略
- 主机模版:map[主机id] []模版id
- 表达式:[]表达式
- 被监控的主机:map[主机id]主机
# 每一分钟更新缓存
******数据表*****
- 插件目录表:plugin_dir (grp_id, dir)
- 主机表: host (id, hostname)
- 组模版表: grp_tpl (grp_id, tpl_id)
- 组主机表: 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) 多个策略对应一个模版
- 表达式:expression(id, expression, func, op, right_value, max_step, priority, note, action_id)
2. http接口
*********通用接口***************
/health 健康状态检查
/version 版本信息
/workdir 获取当前目录
/config/reload 重新导入配置
*********业务接口***************
/expressions 返回缓存中的表达式
/agents 返回所有的agent
/hosts 返回所有被监控的主机
/strategies 返回所有的策略
/templates 返回所有的模版
/plugins 获取摸个host对应的插件
3. grpc接口
*************agent相关************
MinePlugins #根据hostname获取plugins列表
ReportStatus #状态汇报
TrustableIps #返回允许登录的白名单
BuitinMetrics #根据host那么获取需要采集的metric
*************hbs相关************
GetExpressions #获取表达式列表
GetStrategies #获取配置列表
5.6 总结
- hbs是open-falcon中管理配置信息的服务,为其他模块提供获取配置缓存的接口。
- hbs负责存储agent相关元信息,提供agent获取自身信息的缓存。
- 综上:hbs是一个缓存配置文件的服务,为下游agent,以及其他需要读取配置缓存的模块,提供统一的数据库查询,与缓存的更新。
- 这样设计的好处是:能够将所有与配置信息的同步都在hbs做掉,不用每个模版都去完成自身相关配置信息的维护,简化了系统的复杂性。