在目前流行的三大開源運維監控工具Zabbix、Nagios、Open-Falcon當中,Open-Falcon屬于后起之秀,由小米團隊提供,可以從運營級別(基本配置即可),以及應用級別(二次開發,通過端口進行日志上報),對服務器、操作系統、中間件、應用進行全面的監控,及報警,對我們的系統正常運行的作用非常重要。由于公司有意采用這款監控,我也專門花時間簡單研究了一下,在這就提供一下如何進行快速部署(分為Docker部署和Linux普通部署):
falcon-plus:https://github.com/open-falcon/falcon-plus
一、部署前準備
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
二、Docker模式部署
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心跳端口),其他需要開放的端口需要時具體配置(主要是分布式部署的情況下)。
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 .
三、linux下構建和部署
以上是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來實現。
四、Windows下構建和使用agent代理
雖然我們把監控系統部署在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服務腳本
@echooffcd/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.gzcdjmxmon-v0.0.2mv 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監聽數據: