组件架构
OpenFalcon组件图.pngtransfer
transfer接收客户端发送的数据,数据规整检查之后,根据一致性hash算法进行数据切片之后转发到judge和graph后端系统,每分钟可以转发超过500万条数据。
transfer的数据来源:
- falcon-agent采集的基础监控数据
- falcon-agent执行用户自定义插件返回的数据
- client library:线上业务系统,嵌入使用了统一的perfcounter.jar,对于业务系统中每个RPC接口的qps、latency都会主动采集并上报
judge
judge组件完成报警判定。用户在web portal配置相关的报警策略存储在MySQL中,heartbeat server定期加载MySQL中内容。judge定期和heartbeat server保持沟通,获取相关报警策略。
hbs
heartbeat sever会根据模板继承、模板项覆盖、报警动作覆盖、模板和hostGroup绑定,计算出最终关联到每个endpoint的告警策略,提供给judge组件使用。
transfer转发到judge的每条数据,都会触发相关策略的判定。
如果满足报警条件,则会发送给alarm,alarm再以邮件、短信、米聊等形式通知相关用户,也可以执行用户预先配置好的callback地址。用户可以灵活配置告警判定策略:如连续n次都满足条件、不同时间段不同阈值、维护周期内忽略等等。也支持突升突降类的判定和告警。
API
graph和API组件实现快速读取存储在graph里的数据。
transfer将数据转发至graph组件,graph收到数据以后,以rrdtool数据归档方式存储,同时提供查询RPC接口。
API面向终端用户,收到查询请求后会去多个graph里查询不同metric数据,汇总后统一返回给用户。
graph
监控系统数据量大、写操作多、查询需要高效率。
open-falcon数据按照用途分成两类:绘图、数据挖掘。
- 对于绘图的数据,查询要快,信息不能丢失。open-falcon参考rrdtool的理念,在数据每次存入的时候,自动采样、归档。归档策略如下,历史数据保存5年;按照平均值采样、最大值采样、最小值采样存三份。
- 对于原始数据,transfer会打一份到hbase,也可以直接使用opentsdb。
数据模型
open-falcon采用和opentsdb相同的数据格式:metric、endpoint、多组key value tags。
{
metric: load.1min,
endpoint: open-falcon-host,
tags: srv=falcon,idc=aws-sgp,group=az1,
value: 1.5,
timestamp: `date +%s`,
counterType: GAUGE,
step: 60
}
- metric: 核心字段,代表采集项具体度量, 比如cpu_idle,还是memory_free, 还是qps
- endpoint: 标明Metric属主,比如metric是cpu_idle,Endpoint就表示这是哪台机器的cpu_idle
- timestamp: 表示汇报该数据时的unix时间戳,注意是整数,代表的是秒
- value: 代表该metric在当前时间点的值,float64
- step: 表示该数据采集项的汇报周期,这对于后续的配置监控策略很重要,必须明确指定。
- counterType: COUNTER或GAUGE之一
• GAUGE:即用户上传什么样的值,就原封不动的存储
• COUNTER:指标在存储和展现的时候,会被计算为speed,即(当前值 - 上次值)/ 时间间隔 - tags: 一组逗号分割的键值对, 对metric进一步描述和细化, 可以是空字符串。如idc=lg。
⚠️说明:这7个字段都是必须指定
Alarm
报警函数
all(#3): 最新的3个点都满足阈值条件则报警
max(#3): 对于最新的3个点,其最大值满足阈值条件则报警
min(#3): 对于最新的3个点,其最小值满足阈值条件则报警
sum(#3): 对于最新的3个点,其和满足阈值条件则报警
avg(#3): 对于最新的3个点,其平均值满足阈值条件则报警
diff(#3): 拿最新push上来的点(被减数),与历史最新的3个点(3个减数)相减,得到3个差,只要有一个差满足阈值条件则报警,设计diff和pdiff是为了解决流量突增突降报警
pdiff(#3): 拿最新push上来的点,与历史最新的3个点相减,得到3个差,再将3个差值分别除以减数,得到3个商值,只要有一个商值满足阈值则报警
lookup(#2,3): 最新的3个点中有2个满足条件则报警;非连续性报警函数,适用于在一定范围内容忍监控指标抖动的场景
stddev(#7) = 3:离群点检测函数,取最新 7 个点的数据分别计算得到他们的标准差和均值,分别计为 σ 和 μ,其中当前值计为 X,那么当 X 落在区间 [μ-3σ, μ+3σ] 之外时,则认为当前值波动过大,触发报警;
服务部署
环境准备
#安装mysql、redis
yum install -y redis mysql-server
#初始化表结构
cd /tmp/ && git clone https://github.com/open-falcon/falcon-plus.git
cd /tmp/falcon-plus/scripts/mysql/db_schema/
mysql -h 127.0.0.1 -u root -p < 1_uic-db-schema.sql
mysql -h 127.0.0.1 -u root -p < 2_portal-db-schema.sql
mysql -h 127.0.0.1 -u root -p < 3_dashboard-db-schema.sql
mysql -h 127.0.0.1 -u root -p < 4_graph-db-schema.sql
mysql -h 127.0.0.1 -u root -p < 5_alarms-db-schema.sql
Openfalcon组件安装
#下载二进制包
https://github.com/open-falcon/falcon-plus/releases
open-falcon-v0.3.tar.gz
export FALCON_HOME=/home/work
export WORKSPACE=$FALCON_HOME/open-falcon
mkdir -p $WORKSPACE
tar -xzvf open-falcon-v0.3.tar.gz -C $WORKSPACE
#确认配置文件中数据库账号密码与实际相同,其中XXXX为访问mysql数据库密码,IP为openfalcon该组件服务所在IP地址。
vim nodata/config/cfg.json
"dsn": "openfalcon:XXXX@tcp(127.0.0.1:3306)/falcon_portal?loc=Local&parseTime=true&wait_timeout=604800",
vim hbs/config/cfg.json
"database": "openfalcon:XXXX@tcp(127.0.0.1:3306)/falcon_portal?loc=Local&parseTime=true",
vim graph/config/cfg.json
"dsn": "openfalcon:XXXX@tcp(127.0.0.1:3306)/graph?loc=Local&parseTime=true",
vim alarm/config/cfg.json
"addr": "openfalcon:XXXX@tcp(127.0.0.1:3306)/alarms?charset=utf8&loc=Local",
vim aggregator/config/cfg.json
"addr": "openfalcon:XXXX@tcp(127.0.0.1:3306)/falcon_portal?loc=Local&parseTime=true",
vim api/config/cfg.json
"db": {
"falcon_portal": "openfalcon:XXXX@tcp(127.0.0.1:3306)/falcon_portal?charset=utf8&parseTime=True&loc=Local",
"graph": "openfalcon:1wsad44FASQ2HJK@tcp(127.0.0.1:3306)/graph?charset=utf8&parseTime=True&loc=Local",
"uic": "openfalcon:XXXX@tcp(127.0.0.1:3306)/uic?charset=utf8&parseTime=True&loc=Local",
"dashboard": "openfalcon:XXXX@tcp(127.0.0.1:3306)/dashboard?charset=utf8&parseTime=True&loc=Local",
"alarms": "openfalcon:XXXX@tcp(127.0.0.1:3306)/alarms?charset=utf8&parseTime=True&loc=Local",
vim agent/config/cfg.json
"heartbeat": {
"enabled": true,
"addr": "IP:6030",
"interval": 60,
"timeout": 1000
},
"transfer": {
"enabled": true,
"addrs": [
"IP:8433"
],
"interval": 60,
"timeout": 1000
},
#在一台机器上启动所有的后端组件
cd $WORKSPACE
./open-falcon start
# 检查所有模块的启动状况
./open-falcon check
falcon-graph UP 53007
falcon-hbs UP 53014
falcon-judge UP 53020
falcon-transfer UP 53026
falcon-nodata UP 53032
falcon-aggregator UP 53038
falcon-agent UP 53044
falcon-gateway UP 53050
falcon-api UP 53056
falcon-alarm UP 53063
debugging , check $WorkDir/$moduleName/log/logs/xxx.log
# ./open-falcon [start|stop|restart|check|monitor|reload] module
#对于只需要agent的功能的节点部署时只启动agent
./open-falcon start agent 启动进程
./open-falcon stop agent 停止进程
./open-falcon monitor agent 查看日志
部署dashboard
用户可以在dashboard首页以多个维度搜索endpoint,即主机列表;
根据上报的tags来搜索关联的endpoint。host group的管理可以和服务树结合,机器进出服务树节点,相关的模板会自动关联或者解除。服务上下线不需要手动来变更监控。模板支持继承和策略覆盖,模板和host group绑定后,host group下的机器会自动应用该模板的所有策略。对于endpoint不是机器名的场景也可以写表达式达到监控的目的。
#下载dashboard包
cd openfalcon/
git clone https://github.com/open-falcon/dashboard.git
yum install -y python-virtualenv python-devel openldap-devel mysql-devel
yum groupinstall "Development tools"
cd openfalcon/dashboard
virtualenv ./env
#修改配置文件
vim rrd/config.py
## API_ADDR 表示后端api组件的地址
API_ADDR = "http://127.0.0.1:8080/api/v1"
## PORTAL_DB_*, 默认用户名为root,默认密码为""
## ALARM_DB_*, 默认用户名为root,默认密码为""
#启动前端
bash control start
#网页浏览
open http://127.0.0.1:8081 in your browser.
#停止运行
bash control stop
#查看日志
bash control tail
dashboard测试环境遇到的问题记录
- 报错404
发现api端口占用,但是修改dashbord配置 中api部分为8081 可以注册,登陆失败
- 报错:No JSON object could be decoded
解决:api8080端口被占用 ,修改dashbord配置 api部分 为8080 重启dashboard
- 报错:HTTPConnectionPool(host='127.0.0.1', port=8080): Max retries exceeded with url: /api/v1/user/login (Caused by : [Errno 111] Connection refused)
解决:重启open-falcon
- 错误:no user
解决:重新注册即可
mymon
mymon是Open-Falcon监控MySQL数据库运行状态的插件,采集global status, global variables, slave status以及innodb status等MySQL运行状态信息。
⚠️ 部署节点的go版本:go version go1.11.5 linux/amd64
go get -u github.com/open-falcon/mymon
cd $GOPATH/src/github.com/open-falcon/mymon
make
#修改配置文件
[default]
basedir = . # 工作目录
log_dir = ./fixtures # 日志目录,默认日志文件为myMon.log,旧版本有log_file项,如果同时设置了,会优先采用log_file
ignore_file = ./falconignore # 配置忽略的metric项
snapshot_dir = ./snapshot # 保存快照(process, innodb status)的目录
snapshot_day = 10 # 保存快照的时间(日)
log_level = 5 # 日志级别[RFC5424]
# 0 LevelEmergency
# 1 LevelAlert
# 2 LevelCritical
# 3 LevelError
# 4 LevelWarning
# 5 LevelNotice
# 6 LevelInformational
# 7 LevelDebug
falcon_client=http://127.0.0.1:1988/v1/push # falcon agent连接地址
[mysql]
user=root # 数据库用户名
password=1tIsB1g3rt # 您的数据库密码
host=127.0.0.1 # 数据库连接地址
port=3306 # 数据库端口
* * * * * cd ${WORKPATH} && ./mymon -c etc/myMon.cfg
#ignore项
ignore项配置,是用来屏蔽之前在falcon中设好的报警项,会将原有的metric更改名称之后上传,使原有的报警策略不再生效。由于falcon中的屏蔽策略,只能屏蔽endpoint级别,所以在mymon中的ignore功能是帮助提高了报警屏蔽粒度,而非忽略该metric的上报。
#同步延迟
关于同步延迟检测的metric有两个: Seconds_Behind_Master、Heartbeats_Behind_Master。
Seconds_Behind_Master是MySQLSHOW SLAVE STATUS输出的状态变量。由于低版本的MySQL还不支持HEARTBEAT_EVENT,在低版本的MySQL中该状态可能会由于IO线程假死导致测量不准确,因此mymon增加了Heartbeats_Behind_Master。它依赖于pt-heartbeat,统计基于pt-heartbeat生成的mysql.heartbeat表中的ts字段值与从库当前时间差。如果未配置pt-heartbeat,则该项上报-1值。
关于pt-heartbeat的配置使用: https://www.percona.com/doc/percona-toolkit/LATEST/pt-heartbeat.html
告警列表.png
绘图.png
网友评论