在Zabbix的監控系統中通常是由Zabbix Server與Zabbix Agent一起配合實現監控,在Zabbix Agent內置了很多監控基礎的監控項。
這些監控項都是CPU, 文件系統, 網絡,磁盤等基礎的監控項,對於自己開發服務的監控,Zabbix提供了良好框架為用戶實現監控和報警,下面將以為MySQL添加監控為例,介紹如何添加自定義監控。
實驗環境
1.NySQL 192.168.2.6 (agent)
2.Zabbix Server 172.30.1.208
角色:Zabbix Agent, Zabbix Server, MySQL, 模板
第一步,監控規划
在創建監控項之前要盡量考慮清楚要監控什么,怎么監控,監控數據如何存儲,監控數據如何展現,如何處理報警等。要進行監控的系統規划需要對Zabbix很了解,這里只是提出監控的需求。
Zabbix Server與Agent之間監控數據的采集主要是通過Zabbix Server主動向Agent詢問某個Key的值,Agent會根據Key去調用相應的函數去獲取這個值並返回給Server端。Zabbix 2.4.7的Agent本並沒有內置MySQL的監控功能(但是Server端提供了相應的Template配置),所以我們需要使用Zabbix的User Parameters功能,為MySQL添加監控腳本。
Trapper工作原理:
被監控主機根據用戶設定的時間間隔定期將數據push到Zabbix Server.這里主要介紹Agent.
Agent工作原理:
- Agent 安裝在被監控主機上,定期主動的監控本機的資源和應用,然后將數據進行處理發送給ZabbixServer. Agent工作方式又分為Passive Check 和 Active Check。
- Passive Check: Zabbix Server 發起數據索取請求,Agent響應對應的數據.
- Active Check: Agent首先從Zabbix Server 檢索監控項列表,然后定期將對應的數據主動的發送到.Zabbix ServerZabbix Agent 本身預定義了一些監控類型,而對於沒有預定義的需要管理員自行定義.因此,Zabbix提供了”UserParameter”參數,以方便用戶根據自己的需求自定義想要獲取的數據.
“UserParameter” 語法:
用戶自定義一個key; 為命令,該命令用來獲取用戶想要監控的數據,也就是key的值;
定好UserParameter參數后,在為主機或者模板配置監控項的時候,在”key”中輸入上面自定義的key的
名字就可以了.
假如我要獲取Mysql Server的版本,我可以這樣定義”UserParameter”:
打開 Zabbix Agent安裝路徑下的 ../etc/zabbix_agentd.conf 配置文件,翻頁到最后頁面,鍵入如下
行:
UserParameter=mysql.version,mysql -V
這里我們自定義的key名就是"mysql.version"
,命令"mysql -V"
用來獲取Mysql 版本號,其實就是key對
應的值.
UserParameter參數實現的原理通俗來講,就是我們先要熟悉Mysql命令,通過Mysql的命令獲取想要的
數據,然后賦值給自定義的key,最后通過Zabbix Server獲取這個值通過圖像等方式展示出來.
下面利用Agent來實現對mysql性能的監控。
授權mysql登錄用戶(agent端):
mysql> grant usage on *.* to zabbix@127.0.0.1 identified by '123456'; mysql> flush privileges;
agent端:
1.利用UserParameter參數自定義Agent Key。
對於需求一 ,我們采用mysqladmin這個工具來實現,命令如下:
linux:/etc/zabbix/zabbix-agentd.conf.d # mysqladmin -uzabbix -p'123456' -h127.0.0.1 ping mysqld is alive
如果MySQL狀態正常,會顯示mysqld is alive,否則會提示連接不上。對於服務器端,mysqld is alive這樣的句子不好理解,服務器端最好只接收1和0,1表示服務可用,0表示服務不可用。那么再改進一下這個命令,如下:
linux:/etc/zabbix/zabbix-agentd.conf.d # mysqladmin -uzabbix -p'123456' -h127.0.0.1 ping | grep -c alive 1
用戶名和密碼放在命令中對於以后的維護不好,所以我們在/etc/zabbix/下創建一個包含MySQL用戶名和密碼的配置文件“.my.cnf”,如下:(我這里沒有這么做)
[client] user=zabbix host=192.168.2.6 password=123456
linux:/etc/zabbix/zabbix-agentd.conf.d # HOME=/etc/zabbix/ mysqladmin ping | grep -c alive
做完這一步后需要做的就是,將這個監控命令添加到Zabbix Agent中,並與一個Key對應,這樣Zabbox Server就能通過這個Key獲取MySQL的狀態了。我們使用mysql.ping作為MySQL狀態的Key。
首先在去除/etc/zabbix/zabbix-agentd.conf中 包含子配置文件路徑的注釋,並修改
Include=/etc/zabbix/zabbix-agentd.conf.d/ (這里根據自己情況取名就行,別忘了創建這個目錄)
其次,在etc/zabbix/zabbix_agentd.conf.d/目錄下創建userparameter_mysql.conf文件。在文件中添加如下命令:
linux:/etc/zabbix/zabbix-agentd.conf.d # cat userparameter_mysql.conf UserParameter=mysql.ping,mysqladmin -uzabbix -p'123456' -h127.0.0.1 ping | grep -c alive
這個命令中”UserParameter”表示這是一個用戶自定義的腳本;“=”號后是腳本的內容;“mysql.ping”是Key,“,”號后的命令會在Zabbix Server向Agent發起獲取“mysql.ping”這個key的請求時被調用,並將返回值返回給Server。
保存並退出后可以使用下面的命令測試是否正常工作。
linux:/etc/zabbix # /usr/sbin/zabbix-agentd -t mysql.ping -c /etc/zabbix/zabbix-agentd.conf.d/userparameter_mysql.conf (正常工作) mysql.ping [t|1]
這里zabbix_agentd使用方法可參考:
http://www.ttlsa.com/zabbix/zabbix-command-zabbix_agentd/
同時,在Server端也可以使用使用zabbix_get命令來測試從Server端獲取指定的Client端的數據,如下:
[root@Zabbixserver alertscripts]# zabbix_get -s192.168.2.6 -p 10050 -k mysql.ping 1
這里如果操作是跟我一樣,但你是有錯誤的
可能跟你安裝版本不統一有問題。
這里zabbix_get使用方法可參考: http://www.ttlsa.com/zabbix/zabbix-zabbix_get-get-items/
也可以參考官網方法:
https://www.zabbix.com/documentation/3.0/manual/config/items/userparameters/extending_agent
然后下載安裝MySQL監控的模板 (我這里使用腳本監控+zabbix自帶MySQL模板)
https://github.com/yangcvo/zabbix.2.4/
我這里使用的是zabbix 自帶模板 Template App MySQL
創建主機 192.168.2.6
關聯模板
創建監控項
創建圖形
查看監控圖像
設置報警,創建觸發器,動作(當STATUS=0時,報警)
進行測試
停掉數據庫(測試環境)
linux:~ # /etc/init.d/mysql stop
查看郵件
郵件提示我數據庫STATUS=0 也就是down了
恢復數據庫
linux:~ # /etc/init.d/mysql start
郵件提示我數據庫STATUS=1也就是UP了
zabbix監控mysql性能
通過獲取mysql狀態值將這些狀態值傳遞給服務器並繪制成圖片,這樣可以觀察mysql的工作情況,通常需要獲得狀態變量有以下
Com_update:mysql執行的更新個數
Com_select:mysql執行的查詢個數
Com_insert:mysql執行插入的個數
Com_delete:執行刪除的個數
Com_rollback:執行回滾的操作個數
Bytes_received:接受的字節數
Bytes_sent:發送的字節數
Slow_queries:慢查詢語句的個數
監控mysql腳本(chk_mysql.sh 在客戶端編寫)
linux:/etc/zabbix # cat chk_mysql.sh
#!/bin/bash # ------------------------------------------------------------------------------- # FileName: check_mysql.sh # Revision: 1.0 # ------------------------------------------------------------------------------- # Copyright: # License: GPL # 用戶名 MYSQL_USER='zabbix' # 密碼 MYSQL_PWD='123456' # 主機地址/IP MYSQL_HOST='127.0.0.1' # 端口 MYSQL_PORT='3306' # 數據連接 MYSQL_CONN="/usr/bin/mysqladmin -u${MYSQL_USER} -p${MYSQL_PWD} -h${MYSQL_HOST} -P${MYSQL_PORT}" # 參數是否正確 if [ $# -ne "1" ];then echo "arg error!" fi # 獲取數據 case $1 in Uptime) result=`${MYSQL_CONN} status|cut -f2 -d":"|cut -f1 -d"T"` echo $result ;; Com_update) result=`${MYSQL_CONN} extended-status |grep -w "Com_update"|cut -d"|" -f3` echo $result ;; Slow_queries) result=`${MYSQL_CONN} status |cut -f5 -d":"|cut -f1 -d"O"` echo $result ;; Com_select) result=`${MYSQL_CONN} extended-status |grep -w "Com_select"|cut -d"|" -f3` echo $result ;; Com_rollback) result=`${MYSQL_CONN} extended-status |grep -w "Com_rollback"|cut -d"|" -f3` echo $result ;; Questions) result=`${MYSQL_CONN} status|cut -f4 -d":"|cut -f1 -d"S"` echo $result ;; Com_insert) result=`${MYSQL_CONN} extended-status |grep -w "Com_insert"|cut -d"|" -f3` echo $result ;; Com_delete) result=`${MYSQL_CONN} extended-status |grep -w "Com_delete"|cut -d"|" -f3` echo $result ;; Com_commit) result=`${MYSQL_CONN} extended-status |grep -w "Com_commit"|cut -d"|" -f3` echo $result ;; Bytes_sent) result=`${MYSQL_CONN} extended-status |grep -w "Bytes_sent" |cut -d"|" -f3` echo $result ;; Bytes_received) result=`${MYSQL_CONN} extended-status |grep -w "Bytes_received" |cut -d"|" -f3` echo $result ;; Com_begin) result=`${MYSQL_CONN} extended-status |grep -w "Com_begin"|cut -d"|" -f3` echo $result ;; *) echo "Usage:$0(Uptime|Com_update|Slow_queries|Com_select|Com_rollback|Questions|Com_insert|Com_delete|Com_commit|Bytes_sent|Bytes_received|Com_begin)" ;; esac
重啟zabbix客戶端
linux:/etc/zabbix # /etc/init.d/zabbix-agentd restart
在userparameter_mysql.conf 增加自定義key
linux:/etc/zabbix # cat zabbix-agentd.conf.d/userparameter_mysql.conf
UserParameter=mysql.ping,mysqladmin -uzabbix -p'123456' -h127.0.0.1 ping | grep -c alive UserParameter=mysql.version,mysql -V UserParameter=mysql.status[*],/etc/zabbix/chk_mysql.sh $1
在zabbix服務器端測試
[root@Zabbixserver alertscripts]# zabbix_get -s 192.168.2.6 -p10050 -k mysql.status[Com_insert] 121354 [root@Zabbixserver alertscripts]# zabbix_get -s 192.168.2.6 -p10050 -k mysql.status[Uptime] 62602
在zabbix客戶端測試是否能獲取到信息
linux:/etc/zabbix/zabbix-agentd.conf.d # zabbix-agentd -tmysql.status[Uptime] -c /etc/zabbix/zabbix-agentd.conf.d/userparameter_mysql.conf mysql.status[Uptime] [t|62325]
創建圖形(步驟就不演示了)
查看圖形
zabbix配置文件詳解
zabbix的配置文件一般有三種:
zabbixserver的配置文件zabbix_server.conf
zabbixproxy的配置文件zabbix_proxy.conf
zabbix_agentd的配置文件zabbix_agentd.conf
1.zabbixserver的配置文件:
NodeID=0 #分布式節點id號,0代表是獨立服務器,默認是被注釋掉的,不強制配置
ListenPort=10051 #zabbix server的端口,默認是10051,可以自行修改,
范圍是1024-32767 ,一般默認即可
SourceIP= #連接的源ip地址,默認為空,默認即可
LogFile=/tmp/zabbix_server.log #日志文件的存放位置
LogFileSize=1 #日志文件的大小,單位為MB,當設置為0時,表示不僅行日志輪詢,
默認設置為1,默認即可
DebugLevel=3 #指定調試級別,默認即可
PidFile=/tmp/zabbix_server.pid #pid文件的存放位置
DBHost=localhost #數據庫主機名,當設置為localhost時,連接mysql通過sock
DBName=zabbix #指定存放zabbix數據數據庫的名字
DBUser=zabbix #指定連接數據庫的用戶名
DBPassword=123456 #用戶連接數據庫需要的密碼
DBSocket=/var/lib/mysql/mysql.sock #前文主機設置為localhost,用戶
連接數據庫所用的sock位置,
DBPort=3306 #數據庫的端口號,當用sock連接時,無關緊要,當通過網絡連接時需設置
StartPollers=5 #默認即可
StartIPMIPollers=0 #使用IPMI協議時,用到的參數
StartTrappers=5 #打開的進程數,
StartPingers=1 同上
StartDiscoverers=1
StartHTTPPollers=1
JavaGateway=127.0.0.1 #JavaGateway的ip地址或主機名
JavaGatewayPort=10052 #JavaGateway的端口號
StartJavaPollers=5 #開啟連接javagatey的進程數
SNMPTrapperFile=/tmp/zabbix_traps.tmp
StartSNMPTrapper=0 #如果設置為1,snmp trapper進程就會開啟
ListenIP=0.0.0.0 #監聽來自trapper的ip地址
ListenIP=127.0.0.1
HousekeepingFrequency=1 #zabbix執行Housekeeping的頻率,單位為hours
MaxHousekeeperDelete=500 #每次最多刪除歷史數據的行
SenderFrequency=30 #zabbix試圖發送未發送的警報的時間,單位為秒
CacheSize=8M #緩存的大小
CacheUpdateFrequency=60#執行更新緩存配置的時間,單位為秒數
StartDBSyncers=4
HistoryCacheSize=8M
TrendCacheSize=4M
HistoryTextCacheSize=16M
NodeNoEvents=0
NodeNoHistory=0
Timeout=3
TrapperTimeout=300
UnreachablePeriod=45
UnavailableDelay=60
UnreachableDelay=15
AlertScriptsPath=/usr/local/zabbix/shell #腳本的存放路徑
FpingLocation=/usr/local/sbin/fping #fping指令的絕對路徑
SSHKeyLocation=
LogSlowQueries=0
TmpDir=/tmp
Include=/usr/local/etc/zabbix_server.general.conf
Include=/usr/local/etc/zabbix_server.conf.d/ #子配置文件路徑
StartProxyPollers=1 #在zabbix proxy被動模式下用此參數
ProxyConfigFrequency=3600#同上
ProxyDataFrequency=1
zabbixagentd的配置文件
啊別必須
PidFile=/tmp/zabbix_agentd.pid #pid文件的存放位置
LogFile=/tmp/zabbix_agentd.log #日志文件的位置
LogFileSize=1 #當日志文件達到多大時進行輪詢操作
DebugLevel=3 #日志信息級別
SourceIP= #連接的源ip地址,默認為空,即可
EnableRemoteCommands=0 #是否允許zabbix server端的遠程指令,
0表示不允許,
1表示允許
LogRemoteCommands=0 #是否開啟日志記錄shell命令作為警告 0表示不允許,1表示允許
Server=127.0.0.1 #zabbix server的ip地址或主機名,可同時列出多個,需要用逗號隔開
ListenPort=10050 #zabbix agent監聽的端口
ListenIP=0.0.0.0 #zabbix agent監聽的ip地址
StartAgents=3 #zabbix agent開啟進程數
ServerActive=127.0.0.1 #開啟主動檢查
Hostname=Zabbix server#在zabbix server前端配置時指定的主機名要相同,最重要的配置
RefreshActiveChecks=120 #主動檢查刷新的時間,單位為秒數
BufferSend=5 #數據緩沖的時間
BufferSize=100 #zabbix agent數據緩沖區的大小,當達到該值便會發送所有的數據到zabbix server
MaxLinesPerSecond=100 #zabbix agent發送給zabbix server最大的數據行
AllowRoot=0 #是否允許zabbix agent 以root用戶運行
Timeout=3 #設定處理超時的時間
Include=/usr/local/etc/zabbix_agentd.userparams.conf
Include=/usr/local/etc/zabbix_agentd.conf.d/ #包含子配置文件的路徑
UnsafeUserParameters=0 #是否允許所有字符參數的傳遞
UserParameter= #指定用戶自定義參數
zabbixproxy的配置文件
Server=192.168.70.133 #指定zabbix server的ip地址或主機名
Hostname=zabbix-proxy-1.35 #定義監控代理的主機名,需和zabbix server前端配置時指定的節點名相同
LogFile=/tmp/zabbix_proxy.log #指定日志文件的位置
PidFile=/tmp/zabbix_proxy.pid #pid文件的位置
DBName=zabbix_proxy #數據庫名
DBUser=zabbix #連接數據庫的用戶
DBPassword=123456#連接數據庫用戶的密碼
ConfigFrequency=60 #zabbix proxy從zabbix server取得配置數據的頻率
DataSenderFrequency=60 #zabbix proxy發送監控到的數據給zabbix server的頻率