前言

本文算是一篇how to文档,介绍如何利用zabbix监控redis(正好有同学问我,顺手写一篇)。 大致的过程是:

在zabbix创建redis host组以及对应的template

利用zabbix agent 收集并上传监控数据到zabbix server.

准备监控脚本

  1. 对于单机多实例的redis而言,需要先获取所有redis实例的port。 

    redis.port.discovery.py

    import os
    import json
    res=os.popen("""sudo netstat -tlpn |grep redis-server|grep 0.0.0.0|awk '{print $4}'|awk -F: '{print $2}' """)
    ports = []
    for port in  res.readlines():
        r = os.path.basename(port.strip())
        ports += [{'{#PORT}':r}]
    print json.dumps({'data':ports},sort_keys=True,indent=1,separators=(',',':'))

    该脚本有一定的限制,如果redis的 conf文件写死了bind ip ,获取redis端口的命令就不能运行了。

  2. 收集redis info信息脚本

    /usr/local/bin/redis-cli -h 127.0.0.1 -a redis_passwd -p $1 info |grep $2 | cut -d : -f2

    没有密码的情况

    /usr/local/bin/redis-cli -h 127.0.0.1 -p $1 info |grep $2 | cut -d : -f2

配置zabbix_agent调用的配置文件

在路径/opt/zabbix/etc/zabbix_agentd.conf.d/(不同公司配置可能不同),配置文件 redis.conf

UserParameter=redis.port.discovery,/opt/zabbix/share/zabbix/scripts/redis.port.discovery.py
UserParameter=redis.collect[*],/usr/local/bin/redis-cli -h 127.0.0.1 -p $1 info |grep $2|cut -d : -f2

或者使用具体的脚本来收集redis的统计信息。

UserParameter=redis.port.discovery,/opt/zabbix/share/zabbix/scripts/redis.port.discovery.py
UserParameter=redis[*],(/opt/zabbix/share/zabbix/scripts/redis_stat.sh $1 > /dev/null; echo $?)

Note

其实我们可以自己编写脚本来收集redis相关的信息,计算内存命中率,get,set次数。

redis.port.discovery是发现规则,需要在模板里面用的。

配置zabbix

  1. 创建redis host group,并添加对应的redis机器

  2. 创建监控模板

    可以从网上(文末会给出url)下载,然后在zabbix监控的网页选择configuration--> templates 导入。

    a 需要注意的是模板的template的名称需要自己定义,trigger定义依赖template的名称

    <template>redis_template</template>
    <name>redis_template</name>

    b discovery_rule 的名称必须和zabbix_agent config文件配置的一致。

    ....
    <discovery_rule>
         <name>cip-redis.port.discovery</name>
          ....
          <key>cip-redis.port.discovery</key>          
    </discovery_rule>
  3. 绑定机器和监控模板。

最后

  1. 重启angent,检查监控输出。 在zabbix server服务器上执行如下命令 

    /opt/zabbix/bin/zabbix_get -s 被监控机器的ip -p zabbix监听的端口 -k key的名称 (比如 redis[6379,used_memory])

    key的名称和zabbix_agent中配置的获取监控值的名称redis[*]有关。

  2. 可以结合grafna监控来配置监控项的图形展示,具体大家自己调研吧。


自己写了一个redis工具集放在github上面。

https://github.com/yangql/redis-tools

里面有redis监控模板和收集redis的统计信息脚本,有兴趣的朋友可以看看。

https://github.com/yangql/redis-tools/blob/master/zbx_redis_template.xml

https://github.com/yangql/redis-tools/blob/master/redis_stat.sh