在目前流行的三大开源运维监控工具Zabbix、Nagios、Open-Falcon当中,Open-Falcon属于后起之秀,由小米团队提供,可以从运营级别(基本配置即可),以及应用级别(二次开发,通过端口进行日志上报),对服务器、操作系统、中间件、应用进行全面的监控,及报警,对我们的系统正常运行的作用非常重要。由于公司有意采用这款监控,我也专门花时间简单研究了一下,在这就提供一下如何进行快速部署(分为Docker部署和Linux普通部署):
falcon-plus:https://github.com/open-falcon/falcon-plus
中文社区:http://book.open-falcon.org/zh_0_2/
事先放一张Open-Falcon的监控效果图,监控效果不错,但都是需要自己动手配置出来的:
1、在Centos7系统上安装Docker(如果不在docker下部署可以省略这一步)
yum update -y
yum install docker epel-release -y
启动docker
systemctl enable docker
systemctl start docker
2、安装GO(用于编译falcon-plus)
上网获取最新版本的go程序包:https://studygolang.com/dl
下载并安装
mkdir -p /usr/local/gopath
cd /usr/local
wget https://studygolang.com/dl/golang/go1.11.linux-amd64.tar.gz
tar -xvf go1.11.linux-amd64.tar.gz
配置环境变量
在/etc/profile中添加
export GOROOT=/usr/local/go
export GOPATH=/usr/local/gopath
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
3、安装git:yum -y install git
如果git clone下载出错,还需要更新一下curl(因为git下载本质上用的是curl):yum update -y nss curl libcurl
1、部署mysql
## 创建mysql卷目录
mkdir -p /home/work/mysql-data
chmod -R 666 /home/work/mysql-data
## 启动mysql容器
docker run -itd \
--name falcon-mysql \
-v /home/work/mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=test123456 \
-p 3306:3306 \
mysql:5.7
## 初始化mysql数据并运行
cd /tmp && \
git clone --depth=1 https://github.com/open-falcon/falcon-plus && \
cd /tmp/falcon-plus/ && \
for x in `ls ./scripts/mysql/db_schema/*.sql`; do
echo init mysql table $x ...;
docker exec -i falcon-mysql mysql -uroot -ptest123456 < $x;
done
rm -rf /tmp/falcon-plus/
2、部署redis
docker run --name falcon-redis -p6379:6379 -d redis:4-alpine3.8
3、部署falcon-plus组合模块
## 拉取镜像 hub.docker.com/openfalcon
docker pull openfalcon/falcon-plus:v0.2.1
## 运行 falcon-plus 容器
docker run -itd --name falcon-plus \
--link=falcon-mysql:db.falcon \
--link=falcon-redis:redis.falcon \
-p 8433:8433 \
-p 8080:8080 \
-p 6030:6030 \
-e MYSQL_PORT=root:test123456@tcp\(db.falcon:3306\) \
-e REDIS_PORT=redis.falcon:6379 \
-v /home/work/open-falcon/data:/open-falcon/data \
-v /home/work/open-falcon/logs:/open-falcon/logs \
openfalcon/falcon-plus:v0.2.1
## 启动所有 falcon 后台模块, 如 graph,api,agent等
docker exec falcon-plus sh ctrl.sh start \
graph hbs judge transfer nodata aggregator agent gateway api alarm
以上运行容器只放开了三个端口8433(transfer服务端口) 、8080(Falcon的http端口)、6030(heartbeat心跳端口),其他需要开放的端口需要时具体配置(主要是分布式部署的情况下)。
补充说明:其实将源码https://github.com/open-falcon/falcon-plus下载,也能看到Dockerfile文件,如果想将最新源码构建docker镜像也是很方便的,如:docker build -t falcon-plus:v0.2.2 .
4、分布式启用部分模块(如agent)
docker exec falcon-plus sh ctrl.sh start/stop/restart agent
适用于集群部署的docker环境,一个docker实例就启用一个模块的情况。
5、查看模块状态及日志
## check status of backend modules
docker exec falcon-plus ./open-falcon check
## or you can check logs at /home/work/open-falcon/logs/ in your host
ls -l /home/work/open-falcon/logs/
以上部署完成后,在linux防火墙不限制端口的情况下,应该就能看到Falcon服务的启动(访问http://{IP}:8080)
6、部署falcon-dashboard(前端页面)
docker run -itd --name falcon-dashboard \
-p 8081:8081 \
--link=falcon-mysql:db.falcon \
--link=falcon-plus:api.falcon \
-e API_ADDR=http://api.falcon:8080/api/v1 \
-e PORTAL_DB_HOST=db.falcon \
-e PORTAL_DB_PORT=3306 \
-e PORTAL_DB_USER=root \
-e PORTAL_DB_PASS=test123456 \
-e PORTAL_DB_NAME=falcon_portal \
-e ALARM_DB_HOST=db.falcon \
-e ALARM_DB_PORT=3306 \
-e ALARM_DB_USER=root \
-e ALARM_DB_PASS=test123456 \
-e ALARM_DB_NAME=alarms \
-w /open-falcon/dashboard openfalcon/falcon-dashboard:v0.2.1 \
'./control startfg'
现在就可以访问页面了,第一次登录需要注册账号,登录后的效果如下(默认只显示一个Endpoints):
7、构建docker镜像
以上是直接用网上提供的镜像,你也可以将最新的源码构建成最新的镜像:
## Building falcon-plus
cd /tmp && \
git clone https://github.com/open-falcon/falcon-plus && \
cd /tmp/falcon-plus/ && \
docker build -t falcon-plus:v0.2.1 .
##Building falcon-dashboard
cd /tmp && \
git clone https://github.com/open-falcon/dashboard && \
cd /tmp/dashboard/ && \
docker build -t falcon-dashboard:v0.2.1 .
以上是Docker情况下部署,但我们需要注意,像代理agent模块不是所有情况都适合用docker部署的,比如我们就需要在linux下部署代理以监控linux机器。这时候我们可以编译源码并生成安装包,将安装包拷到不同的机器上进行模块部署。
1、下载源码
mkdir -p $GOPATH/src/github.com/open-falcon
cd $GOPATH/src/github.com/open-falcon
git clone https://github.com/open-falcon/falcon-plus.git
2、安装数据库并初始化
# 安装数据库
yum install -y redis
yum install -y mysql-server
# 初始化数据
cd $GOPATH/src/github.com/open-falcon/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
# 如果只是在原有数据库升级版本就用
mysql -h 127.0.0.1 -u root -p < 5_alarms-db-schema.sql
3、编译打包相关模块
cd $GOPATH/src/github.com/open-falcon/falcon-plus/
# make编译所有模块
make all
# make编译其中一个模块(如只编译agent)
make agent
# pack打包所有模块
make pack
# 打完包的格式为open-falcon-vx.x.x.tar.gz
4、安装及使用相关模块
# 解压和创建工作目录
export WorkDir="$HOME/open-falcon"
mkdir -p $WorkDir
tar -xzvf open-falcon-vx.x.x.tar.gz -C $WorkDir
cd $WorkDir
# 启动和检查模块状态
cd $WorkDir
# 启动所有模块(如需修改配置文件请先设置后启动,在相应模块目录的config目录下)
./open-falcon start
# 只启动指定模块(如agent)
# ./open-falcon [start|stop|restart|check|monitor|reload] module
./open-falcon start agent
# 检查模块status
./open-falcon check
5、单模块编译和使用(如agent)
以上是整体模块编译,其实还支持只编译和使用一个模块的情况
mkdir -p $GOPATH/src/github.com/open-falcon
cd $GOPATH/src/github.com/open-falcon
git clone https://github.com/open-falcon/falcon-plus.git
cd falcon-plus/modules/agent
go get
./control build
./control start
#本质上启动进程 ./falcon-agent -c cfg.json > var/app.log
#启动完后通过访问 http://localhost:1988
所以调用agent模块,也别忘了先设置好配置文件cfg.json
{
"debug": true,
"hostname": "",
"ip": "",
"plugin": {
"enabled": false,
"dir": "./plugin",
"git": "https://github.com/open-falcon/plugin.git",
"logs": "./logs"
},
"heartbeat": {
"enabled": true,
"addr": "172.16.1.162:6030",
"interval": 60,
"timeout": 1000
},
"transfer": {
"enabled": true,
"addrs": [
"172.16.1.162:8433"
],
"interval": 10,
"timeout": 1000
},
"http": {
"enabled": true,
"listen": ":1988",
"backdoor": false
},
"collector": {
"ifacePrefix": ["eth", "em"],
"mountPoint": []
},
"default_tags": {
},
"ignore": {
"cpu.busy": true,
"df.bytes.free": true,
"df.bytes.total": true,
"df.bytes.used": true,
"df.bytes.used.percent": true,
"df.inodes.total": true,
"df.inodes.free": true,
"df.inodes.used": true,
"df.inodes.used.percent": true,
"mem.memtotal": true,
"mem.memused": true,
"mem.memused.percent": true,
"mem.memfree": true,
"mem.swaptotal": true,
"mem.swapused": true,
"mem.swapfree": true
}
}
6、部署dashboard
这个部署过程内容比较多,在这就不细说了,可以参照官网https://github.com/open-falcon/dashboard ,但是既然部署麻烦,dashboard完全就可以通过docker来实现。
虽然我们把监控系统部署在linux环境或Docker中,但是要监控Windows,还得有windows代理,网上有提供编译好的包:
https://github.com/freedomkk-qfeng/windows-agent/releases
但我们有时候还得亲力亲为,因为别人编译好的包可能不是最新版本的。
关于windows的代理网上有四种方案(http://book.open-falcon.org/zh_0_2/usage/win.html),我们选择最后一种方案,原因是支持go,并且是最新维护的(汽车之家提供的那一版我也编译通过并使用成功,但是只支持Python2.7或更早版的,而且编译过程会复杂一些)。下面介绍具体步骤:
1、下载golang windows版和git的windows版,然后安装。
https://studygolang.com/dl
https://git-scm.com/download/win
2、安装GOLANG到D:\Go,配置环境变量(goroot和gopath要不同路径)
我的是GOROOT为D:\Go,GOPATH为D:\User\GOPATH ,在系统变量Path中添加 %GOROOT%\bin;
3、再下载依赖包(正常没有这一步,但由于我无法到google,这就需要手动下载以下包,以下命令可以在CMD中进行)
git clone https://github.com/googleapis/google-cloud-go.git %GOPATH%/src/cloud.google.com
xcopy "%GOPATH%/src/cloud.google.com/civil" "%GOPATH%/src/cloud.google.com/go/civil" /y /e /i /q
git clone https://github.com/golang/net.git %GOPATH%/src/golang.org/x/net
git clone https://github.com/golang/sys.git %GOPATH%/src/golang.org/x/sys
git clone https://github.com/golang/tools.git %GOPATH%/src/golang.org/x/tools
git clone https://github.com/golang/text.git %GOPATH%/src/golang.org/x/text
git clone https://github.com/golang/crypto.git %GOPATH%/src/golang.org/x/crypto
4、下载要编译的windows-agent源码
git clone https://github.com/freedomkk-qfeng/windows-agent %GOPATH%/src/github.com/freedomkk-qfeng/windows-agent
5、编译
cd %GOPATH%/src/github.com/freedomkk-qfeng/windows-agent
go get ./...
go build -o windows-agent.exe
不出意外就可以编译成功,如果提示还缺包,那就继续上网找。
6、编译完后,就可以使用windows-agent.exe,具体怎么用可以看https://github.com/freedomkk-qfeng/windows-agent
由于网上的使用过程我觉得不够自动,我自己又写了个批处理,调用也是nssm.exe(一个注册windows服务的工具),需要将批处理脚本、nssm.exe、windows-agent.exe、配置文件cfg.json放在一个目录下。
(1)install安装agent服务脚本
@echo off
cd /d %~dp0
.\nssm.exe install windows-agent %~dp0windows-agent.exe %~dp0
(2)start启动agent脚本
@echo off
cd /d %~dp0
.\nssm.exe start windows-agent
(3)stop停止agent脚本
@echo off
cd /d %~dp0
.\nssm.exe stop windows-agent
(4)uninstall卸载agent服务脚本
@echo off
cd /d %~dp0
.\nssm.exe stop windows-agent
.\nssm.exe remove windows-agent confirm
pause
如果是windows7/10,运行以上脚本都需要以管理员身份运行。
以上提到监控都是针对OS(Linux/Windows),而Open-falcon强大的一点是有着大量的监控插件支持,所有的第三方监控插件只要连通agent代理服务(监控插件或程序最好与本机agent服务连通,否则push可能会被拒绝连接),就能获取更多的监控数据,如Mysql、Redis、Java JMX、Nginx、Docker等。本文只举例JMX和Mysql,其他的监控插件原理一样。
1、Java JMX监控
(1)编译前准备工作
需要准备JDK环境,并配置JAVA_HOME环境变量,在这就不细说了。
准备Maven环境:到http://maven.apache.org/download.cgi中找到最新版的Maven包
cd /usr/local/src/
wget http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.0/binaries/apache-maven-3.6.0-bin.tar.gz
tar zxf apache-maven-3.6.0-bin.tar.gz
mv apache-maven-3.6.0 /usr/local/maven3
# vi /etc/profile 添加环境变量
export M2_HOME=/usr/local/maven3
export PATH=$PATH:$JAVA_HOME/bin:$M2_HOME/bin
# 让环境变量立即生效
source /etc/profile
# 确认maven生效,验证版本
mvn -v
(2)下载并编译jmxmon插件源码:
git clone https://github.com/toomanyopenfiles/jmxmon.git
cd jmxmon
# 编译(强制更新依赖包,并生成jar文件)
mvn -U clean package
开始编译,一个漫长的等待:
编译完后,生成target目录,将主要文件(conf.properties、control、jar包、log4j.properties)打包jar.gz包,就能到对应环境去部署,如果认为编译麻烦,网上也提供了编译好的包:https://github.com/toomanyopenfiles/jmxmon/releases/tag/v0.0.2
(3)使用jmxmon插件
首先需要在Java服务中开放JMX监听端口,我们以linux下的tomcat为例,在catalina.sh启动文件中添加JMX监控配置:
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9008 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"
解压jmxmon插件包
tar -xvf jmxmon-v0.0.2.tar.gz
cd jmxmon-v0.0.2
mv conf.example.properties conf.properties
修改配置文件conf.properties,内容说明如下:
# 工作目录用来存放jmxmon的临时缓存文件,注意不要修改此目录下的文件
workDir=./
# 需要监听的本地jmx端口,支持监听多个端口,多端口用逗号分隔
jmx.ports=9008
# 本地agent的上报url,如果使用open-falcon的默认配置,则这里不需要改变
agent.posturl=http://localhost:1988/v1/push
# 可选项:上报给open-falcon的endpoint,默认值为本机hostname。不建议修改
#hostname=
# 可选项:上报给open-falcon的上报间隔,默认值60,单位秒。不建议修改
#step=
启动监听(前掉是本机的agent模块已启动):
./control start
# 查看日志,或者cat var/app.log以确认程序是否正常启动
sh control tail
过几分钟后,通过前端页面就能看到新获取的JMX监听数据:
2、Mysql监控
mymon(MySQL-Monitor) 是Open-Falcon用来监控MySQL数据库运行状态的一个插件,采集包括global status, global variables, slave status以及innodb status等MySQL运行状态信息。
(1)获取源码进行编译
# Build
go get -u github.com/open-falcon/mymon
cd $GOPATH/src/github.com/open-falcon/mymon
make
(2)修改配置文件
cd $GOPATH/src/github.com/open-falcon/mymon/etc/
vim myMon.cfg
[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 # 数据库端口
(3)加入定时器
# Add to crontab
echo '* * * * * cd $(WORKPATH) && ./mymon -c etc/myMon.cfg' > /etc/cron.d/mymon
表示每分钟执行一次mymon(即每分钟push一次数据到agent服务)。需要强调的是$(WORKPATH)要换成具体路径,这个路径不要用环境变量,因为crontab默认不加载/etc/profile和~/.bash_profile,既不识别用户级的环境变量。
过几分钟后,通过前端页面就能看到新获取的mysql监听数据: