在目前流行的三大開源運(yùn)維監(jiān)控工具Zabbix想许、Nagios阴挣、Open-Falcon當(dāng)中,Open-Falcon屬于后起之秀登钥,由小米團(tuán)隊(duì)提供畔师,可以從運(yùn)營級(jí)別(基本配置即可),以及應(yīng)用級(jí)別(二次開發(fā)牧牢,通過端口進(jìn)行日志上報(bào))看锉,對(duì)服務(wù)器、操作系統(tǒng)塔鳍、中間件伯铣、應(yīng)用進(jìn)行全面的監(jiān)控,及報(bào)警轮纫,對(duì)我們的系統(tǒng)正常運(yùn)行的作用非常重要懂傀。由于公司有意采用這款監(jiān)控,我也專門花時(shí)間簡(jiǎn)單研究了一下蜡感,在這就提供一下如何進(jìn)行快速部署(分為Docker部署和Linux普通部署):
falcon-plus:https://github.com/open-falcon/falcon-plus
一蹬蚁、部署前準(zhǔn)備
1、在Centos7系統(tǒng)上安裝Docker(如果不在docker下部署可以省略這一步)
yum update -y
yum install docker epel-release -y
啟動(dòng)docker
systemctl enable docker
systemctl start docker
2郑兴、安裝GO(用于編譯falcon-plus)
上網(wǎng)獲取最新版本的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
配置環(huán)境變量
在/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下載出錯(cuò),還需要更新一下curl(因?yàn)間it下載本質(zhì)上用的是curl):yum update -y nss curl libcurl
二情连、Docker模式部署
1叽粹、部署mysql
## 創(chuàng)建mysql卷目錄
mkdir -p? /home/work/mysql-data
chmod -R 666 /home/work/mysql-data
## 啟動(dòng)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數(shù)據(jù)并運(yùn)行
? ? 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
## 運(yùn)行 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
## 啟動(dòng)所有 falcon 后臺(tái)模塊, 如 graph,api,agent等
? ? docker exec falcon-plus sh ctrl.sh start \
? ? ? ? ? ? graph hbs judge transfer nodata aggregator agent gateway api alarm
以上運(yùn)行容器只放開了三個(gè)端口8433(transfer服務(wù)端口)?虫几、8080(Falcon的http端口)锤灿、6030(heartbeat心跳端口),其他需要開放的端口需要時(shí)具體配置(主要是分布式部署的情況下)辆脸。
4但校、分布式啟用部分模塊(如agent)
docker exec falcon-plus sh ctrl.sh start/stop/restart agent
適用于集群部署的docker環(huán)境,一個(gè)docker實(shí)例就啟用一個(gè)模塊的情況啡氢。
5状囱、查看模塊狀態(tài)及日志
## 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防火墻不限制端口的情況下倘是,應(yīng)該就能看到Falcon服務(wù)的啟動(dòng)(訪問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'
現(xiàn)在就可以訪問頁面了,第一次登錄需要注冊(cè)賬號(hào)搀崭,登錄后的效果如下(默認(rèn)只顯示一個(gè)Endpoints):
?7叨粘、構(gòu)建docker鏡像
以上是直接用網(wǎng)上提供的鏡像,你也可以將最新的源碼構(gòu)建成最新的鏡像:
## 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下構(gòu)建和部署
以上是Docker情況下部署升敲,但我們需要注意,像代理agent模塊不是所有情況都適合用docker部署的默蚌,比如我們就需要在linux下部署代理以監(jiān)控linux機(jī)器冻晤。這時(shí)候我們可以編譯源碼并生成安裝包苇羡,將安裝包拷到不同的機(jī)器上進(jìn)行模塊部署绸吸。
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设江、安裝數(shù)據(jù)庫并初始化
# 安裝數(shù)據(jù)庫
yum install -y redis
yum install -y mysql-server
# 初始化數(shù)據(jù)
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
# 如果只是在原有數(shù)據(jù)庫升級(jí)版本就用
mysql -h 127.0.0.1 -u root -p < 5_alarms-db-schema.sql
3锦茁、編譯打包相關(guān)模塊
cd $GOPATH/src/github.com/open-falcon/falcon-plus/
# make編譯所有模塊
make all
# make編譯其中一個(gè)模塊(如只編譯agent)
make agent
# pack打包所有模塊
make pack
# 打完包的格式為open-falcon-vx.x.x.tar.gz
4、安裝及使用相關(guān)模塊
# 解壓和創(chuàng)建工作目錄
export WorkDir="$HOME/open-falcon"
mkdir -p $WorkDir
tar -xzvf open-falcon-vx.x.x.tar.gz -C $WorkDir
cd $WorkDir
# 啟動(dòng)和檢查模塊狀態(tài)
cd $WorkDir
# 啟動(dòng)所有模塊(如需修改配置文件請(qǐng)先設(shè)置后啟動(dòng)叉存,在相應(yīng)模塊目錄的config目錄下)
./open-falcon start
# 只啟動(dòng)指定模塊(如agent)
# ./open-falcon [start|stop|restart|check|monitor|reload] module
./open-falcon start agent
# 檢查模塊status
./open-falcon check
5码俩、單模塊編譯和使用(如agent)
以上是整體模塊編譯,其實(shí)還支持只編譯和使用一個(gè)模塊的情況
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
#本質(zhì)上啟動(dòng)進(jìn)程 ./falcon-agent -c cfg.json > var/app.log
#啟動(dòng)完后通過訪問 http://localhost:1988
?所以調(diào)用agent模塊歼捏,也別忘了先設(shè)置好配置文件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
這個(gè)部署過程內(nèi)容比較多,在這就不細(xì)說了瞳秽,可以參照官網(wǎng)https://github.com/open-falcon/dashboard瓣履,但是既然部署麻煩,dashboard完全就可以通過docker來實(shí)現(xiàn)练俐。
四袖迎、Windows下構(gòu)建和使用agent代理
雖然我們把監(jiān)控系統(tǒng)部署在linux環(huán)境或Docker中,但是要監(jiān)控Windows,還得有windows代理燕锥,網(wǎng)上有提供編譯好的包:
https://github.com/freedomkk-qfeng/windows-agent/releases
但我們有時(shí)候還得親力親為辜贵,因?yàn)閯e人編譯好的包可能不是最新版本的。
關(guān)于windows的代理網(wǎng)上有四種方案(http://book.open-falcon.org/zh_0_2/usage/win.html)归形,我們選擇最后一種方案托慨,原因是支持go,并且是最新維護(hù)的(汽車之家提供的那一版我也編譯通過并使用成功连霉,但是只支持Python2.7或更早版的岭辣,而且編譯過程會(huì)復(fù)雜一些)。下面介紹具體步驟:
1匪蝙、下載golang windows版和git的windows版吓著,然后安裝。
https://studygolang.com/dl
https://git-scm.com/download/win
2歉井、安裝GOLANG到D:\Go柿祈,配置環(huán)境變量(goroot和gopath要不同路徑)
我的是GOROOT為D:\Go,GOPATH為D:\User\GOPATH 哩至,在系統(tǒng)變量Path中添加 %GOROOT%\bin;
3躏嚎、再下載依賴包(正常沒有這一步,但由于我無法翻墻到google菩貌,這就需要手動(dòng)下載以下包卢佣,以下命令可以在CMD中進(jìn)行)
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
不出意外就可以編譯成功虚茶,如果提示還缺包,那就繼續(xù)上網(wǎng)找仇参。
6嘹叫、編譯完后,就可以使用windows-agent.exe诈乒,具體怎么用可以看https://github.com/freedomkk-qfeng/windows-agent
由于網(wǎng)上的使用過程我覺得不夠自動(dòng)罩扇,我自己又寫了個(gè)批處理,調(diào)用也是nssm.exe(一個(gè)注冊(cè)windows服務(wù)的工具)怕磨,需要將批處理腳本喂饥、nssm.exe、windows-agent.exe肠鲫、配置文件cfg.json放在一個(gè)目錄下员帮。
(1)install安裝agent服務(wù)腳本
@echooffcd/d %~dp0.\nssm.exe install windows-agent %~dp0windows-agent.exe %~dp0
(2)start啟動(dòng)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服務(wù)腳本
@echo off
cd /d %~dp0
.\nssm.exe stop windows-agent
.\nssm.exe remove windows-agent confirm
pause
如果是windows7/10,運(yùn)行以上腳本都需要以管理員身份運(yùn)行滩届。
五集侯、其他監(jiān)控插件
? ? ? ?以上提到監(jiān)控都是針對(duì)OS(Linux/Windows)被啼,而Open-falcon強(qiáng)大的一點(diǎn)是有著大量的監(jiān)控插件支持,所有的第三方監(jiān)控插件只要連通agent代理服務(wù)(監(jiān)控插件或程序最好與本機(jī)agent服務(wù)連通棠枉,否則push可能會(huì)被拒絕連接)浓体,就能獲取更多的監(jiān)控?cái)?shù)據(jù),如Mysql辈讶、Redis命浴、Java JMX、Nginx贱除、Docker等生闲。本文只舉例JMX和Mysql,其他的監(jiān)控插件原理一樣月幌。
1碍讯、Java JMX監(jiān)控
(1)編譯前準(zhǔn)備工作
需要準(zhǔn)備JDK環(huán)境,并配置JAVA_HOME環(huán)境變量扯躺,在這就不細(xì)說了捉兴。
準(zhǔn)備Maven環(huán)境:到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 添加環(huán)境變量
export M2_HOME=/usr/local/maven3
export PATH=$PATH:$JAVA_HOME/bin:$M2_HOME/bin
# 讓環(huán)境變量立即生效
source /etc/profile
# 確認(rèn)maven生效,驗(yàn)證版本
mvn -v
(2)下載并編譯jmxmon插件源碼:
git clone https://github.com/toomanyopenfiles/jmxmon.git
cd jmxmon
# 編譯(強(qiáng)制更新依賴包录语,并生成jar文件)
mvn -U clean package
開始編譯倍啥,一個(gè)漫長(zhǎng)的等待:
編譯完后,生成target目錄澎埠,將主要文件(conf.properties虽缕、control、jar包蒲稳、log4j.properties)打包jar.gz包氮趋,就能到對(duì)應(yīng)環(huán)境去部署,如果認(rèn)為編譯麻煩弟塞,網(wǎng)上也提供了編譯好的包:https://github.com/toomanyopenfiles/jmxmon/releases/tag/v0.0.2
(3)使用jmxmon插件
首先需要在Java服務(wù)中開放JMX監(jiān)聽端口凭峡,我們以linux下的tomcat為例拙已,在catalina.sh啟動(dòng)文件中添加JMX監(jiān)控配置:
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决记,內(nèi)容說明如下:
# 工作目錄用來存放jmxmon的臨時(shí)緩存文件,注意不要修改此目錄下的文件
workDir=./
# 需要監(jiān)聽的本地jmx端口倍踪,支持監(jiān)聽多個(gè)端口系宫,多端口用逗號(hào)分隔
jmx.ports=9008
# 本地agent的上報(bào)url,如果使用open-falcon的默認(rèn)配置建车,則這里不需要改變
agent.posturl=http://localhost:1988/v1/push
# 可選項(xiàng):上報(bào)給open-falcon的endpoint扩借,默認(rèn)值為本機(jī)hostname。不建議修改
#hostname=
# 可選項(xiàng):上報(bào)給open-falcon的上報(bào)間隔缤至,默認(rèn)值60潮罪,單位秒。不建議修改
#step=
啟動(dòng)監(jiān)聽(前掉是本機(jī)的agent模塊已啟動(dòng)):
./control start
# 查看日志,或者cat var/app.log以確認(rèn)程序是否正常啟動(dòng)
sh control tail
過幾分鐘后嫉到,通過前端頁面就能看到新獲取的JMX監(jiān)聽數(shù)據(jù):
2沃暗、Mysql監(jiān)控
mymon(MySQL-Monitor) 是Open-Falcon用來監(jiān)控MySQL數(shù)據(jù)庫運(yùn)行狀態(tài)的一個(gè)插件,采集包括global status, global variables, slave status以及innodb status等MySQL運(yùn)行狀態(tài)信息何恶。
(1)獲取源碼進(jìn)行編譯
# 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 # 日志目錄孽锥,默認(rèn)日志文件為myMon.log,舊版本有l(wèi)og_file項(xiàng),如果同時(shí)設(shè)置了细层,會(huì)優(yōu)先采用log_file
ignore_file = ./falconignore # 配置忽略的metric項(xiàng)
snapshot_dir = ./snapshot # 保存快照(process, innodb status)的目錄
snapshot_day = 10 # 保存快照的時(shí)間(日)
log_level? = 5 #? 日志級(jí)別[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 # 數(shù)據(jù)庫用戶名
password=1tIsB1g3rt # 修改為您的數(shù)據(jù)庫密碼
host=127.0.0.1 # 數(shù)據(jù)庫連接地址
port=3306 # 數(shù)據(jù)庫端口
(3)加入定時(shí)器
# Add to crontab
echo '* * * * * cd $(WORKPATH) && ./mymon -c etc/myMon.cfg' > /etc/cron.d/mymon
表示每分鐘執(zhí)行一次mymon(即每分鐘push一次數(shù)據(jù)到agent服務(wù))惜辑。需要強(qiáng)調(diào)的是$(WORKPATH)要換成具體路徑,這個(gè)路徑不要用環(huán)境變量疫赎,因?yàn)閏rontab默認(rèn)不加載/etc/profile和~/.bash_profile盛撑,既不識(shí)別用戶級(jí)的環(huán)境變量。
過幾分鐘后捧搞,通過前端頁面就能看到新獲取的mysql監(jiān)聽數(shù)據(jù):