zabbix監控redis資料庫狀態兩種方法

來源:互聯網
上載者:User

方法一,zabbix監控redis

1、匯入模板

同樣,模板我已上傳到 github項目 上 。直接下載,通過下面的步驟匯入模板:點擊configuration ----> templates ------> import -------> 匯入下載的xml檔案 。

2、用戶端key配置

在被監控的主機上,開啟/etc/zabbix/zabbix_agentd.conf 設定檔,在最後一行加入:

UserParameter=redis_stats[*],redis-cli -h 127.0.0.1 -p $1 info|grep $2|cut -d : -f2
配置完成後通過/etc/init.d/zabbix_agentd restart 重啟服務並應用最新的設定檔。

註:在該檔案中還要確認UnsafeUserParameters=1 。

3、服務端驗證

驗證方式還是通過zabbix_get 程式去擷取資料,能正常得到資料,證明通訊正常。

 代碼如下 複製代碼
# zabbix_get -s 172.20.0.20 -k redis_stats[6379,total_connections_received]

上面正常從被監控主機上取得了資料,c/s通訊正常 。

4、添加主機關聯模板

通過configuration ------> hosts ------> create host 建立新的主機,並在templates項中,尋找Templates Redis_6379 模板,並link 該模板 。就可以正常擷取資料了。同樣,驗證資料使用 monitoring ----- lastest data ---- 打到剛剛添加的主機,查看是否有資料 。

5、查看監控圖

通過monitoring ----- graphs 可以查看剛剛添加的監控項的監控圖,這裡只截下記憶體使用量情況圖,

方法二,利用zabbix low level discovery 自動探索監控redis

 一、伺服器配置

 
1)配置Regex,在後面添加discovery rules時會用到
#這裡是個坑,我這裡正則匹配的是連接埠號碼,剛開始寫的是”d+”測試也通過了,全部都配置好了,在服務端通過zabbix_get也能正常擷取到client的值,無奈就是不自動上報,檢查了一個中午,後來問了幾個群友,終於找到原因了,正則要用^(8899|10000)$ 類似這種格式,說多了都是淚呀
最後再查閱官方文檔,原來對zabbix的正則沒有理解清楚,它的正則是對上報結果的二次處理,其實如果上報的就是準確的,就不用進行二次過濾,最終採用正則一處留空,不進行二次匹配處理
 
 
 
2)建立模板

 

點擊Discovery rules 建立自訂規則
 
點擊  Item prototypes添加監控項
 
 
我這裡需要監控4個指標,建立4個item

Key值在用戶端定義

二、用戶端配置:

 

先看zabbix_agentd.conf設定檔

 代碼如下 複製代碼
UnsafeUserParameters=1   #允許zabbix使用者運行root命令
UserParameter=redis.discovery,/usr/local/zabbix/bin/redis_port.py  #擷取json格式資料,上報連接埠
UserParameter=redis[*],/usr/local/zabbix/bin/redis_stats.sh $1 $2    #自訂Key值

需要兩個指令碼:

 代碼如下 複製代碼
ll /usr/local/zabbix/bin/
total 516
-rwxr-xr-x 1 root root    342 Oct 25 16:56 redis_port.py
-rwxr-xr-x 1 root root    773 Oct 25 14:59 redis_stats.sh
-rwxr-xr-x 1 root root 236737 Jul 23  2012 zabbix_get
-rwxr-xr-x 1 root root 278582 Jul 23  2012 zabbix_sender
JSON格式指令碼
[root@ ~]# cat /usr/local/zabbix/bin/redis_port.py   ##json串
#!/usr/bin/env python
import os
import json
t=os.popen("""netstat -natp|awk -F: '/redis-server/&&/LISTEN/{print $2}'|awk '{print $1}' """)
ports = []
for port in  t.readlines():
        r = os.path.basename(port.strip())
        ports += [{'{#REDISPORT}':r}]
print json.dumps({'data':ports},sort_keys=True,indent=4,separators=(',',':'))

擷取連接埠資料狀態指令碼:

 代碼如下 複製代碼

[root@ ~]# cat /usr/local/zabbix/bin/redis_stats.sh    ##擷取狀態

 #!/bin/bash
METRIC="$1"
HOSTNAME=127.0.0.1
PORT="${2:-6379}"
CACHE_FILE="/tmp/redis_$PORT.cache"

    (echo -en "INFOrn"; sleep 1;) | nc $HOSTNAME $PORT > $CACHE_FILE 2>/dev/null || exit 1

grep "^$METRIC:" $CACHE_FILE |awk -F':|,' '{print $2}'|sed "s/[^0-9]//g"


以上是全部配置完成,下來進行測試

在zabbix_server上進行測試,執行以下命令:

 代碼如下 複製代碼

 

zabbix_get -s 192.168.250.206 -k redis.discovery

 

 得到如下結果:
{
       ”data”:[
              {
                     "{#REDISPORT}":"10000"
              },
              {
                     "{#REDISPORT}":"8899"
              }
       ]
}
OK,自動探索連接埠成功!

 

zabbix_get -s 192.168.250.206 -k redis[used_memory,8899]

 

4834072
OK,得到所需要的值!

然後將模板添加到所需要監控的機器上,這個就不上圖了
添加完模版以後,查看資料:

在做的過程中遇到以下問題:
1.關於正則的問題
正則匹配不同於普通的正則,多個之間的匹配正則要用^(8899|10000)$ 類似這種格式
或者正則留空
2.許可權問題,zabbix_agentd是zabbix使用者啟動的,預設不能執行netstat -p等命令,導致從伺服器取到的自動探索指令碼為空白

 代碼如下 複製代碼
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
解決方案 :
chmod +s /bin/netstat

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.