5. falcon-hbs模块

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 总结

  1. hbs是open-falcon中管理配置信息的服务,为其他模块提供获取配置缓存的接口。
  2. hbs负责存储agent相关元信息,提供agent获取自身信息的缓存。
  3. 综上:hbs是一个缓存配置文件的服务,为下游agent,以及其他需要读取配置缓存的模块,提供统一的数据库查询,与缓存的更新。
  4. 这样设计的好处是:能够将所有与配置信息的同步都在hbs做掉,不用每个模版都去完成自身相关配置信息的维护,简化了系统的复杂性。

你可能感兴趣的:(5. falcon-hbs模块)