zabbix + python 监控redis集群

目录

  • 监控需求
  • 监控脚本
  • 监控界面
  • 总结

监控需求

公司部署了套redis集群,三主三从,虽然是高可用,但是还是要做好监控,即时发现问题。网上虽然有zabbix的redis监控模板,监控项不够简练,于是自己用python写了个。

监控脚本

pip install rediscluster

#!/usr/local/python/shims/python
from rediscluster import StrictRedisCluster


import redis
import sys
import mylog
redis_nodes =  [{'host':'ip','port':port},
                {'host':'ip','port':port},
                {'host':'ip','port':port},
                {'host':'ip','port':port},
                {'host':'ip','port':port},
                {'host':'ip','port':port},
                   ]

###
进入redis集群模式,如果异常,记录到日志中,并终止脚本
###

try:
    redisconn = StrictRedisCluster(startup_nodes=redis_nodes,password='pwd')
    
except Exception,e:
    mylog.logging.error('%s' %e )
    sys.exit(0)

###
定义参数
###


data = {}
NodeData = {}
hit = 0
misshit = 0
hitrate = 0.00

###
定义函数,抓取监控项
###


def ClusterState(item):
    cluster_state = redisconn.execute_command('cluster','info')
    cluster_state = cluster_state.split('\r\n')
    try:
        for i in cluster_state:
            data[i.split(':')[0]] = i.split(':')[1]
    except:
        pass
    if  item == 'clusterstatus':
        state = data['cluster_state']
        if state == 'ok' :
            item = 1
        else:
            item = 0
        return item

    elif item == 'clusterslotsfail':
        item = data['cluster_slots_fail']
        return item  

    elif item == 'clusterknownnodes':
        item = data['cluster_known_nodes']
        return item
    else:
        return 9999
def NodeInfoServer(item):
    node_info = redisconn.info('Server')
    NodeData = node_info['ip:port']
    if item == 'uptime_in_days':
        item = NodeData['uptime_in_days']
        return item
    else:
        return 9999   
    
def NodeInfoClients(item):
    node_info = redisconn.info('Clients')
    NodeData = node_info['ip:port']
    if item == 'connected_clients':
        item = NodeData['connected_clients']
        return item
    else:
        return 9999

def NodeInfoMemory(item):
    node_info = redisconn.info('Memory')
    NodeData = node_info['ip:port']
    if item == 'used_memory_human':
        item = NodeData['used_memory_human']
        return item
    elif item == 'total_system_memory_human':
        item = NodeData['total_system_memory_human']
        return item
    else:
        return 9999

def NodeInfoPersistence(item):
    node_info = redisconn.info('Persistence')
    NodeData = node_info['ip:port']
    
    if item == 'rdb_last_bgsave_status':
        item = NodeData['rdb_last_bgsave_status']    
        if item == 'ok' :
            item = 1
        else:
            item = 0
        return item
    else:
        return 9999

def NodeInfoStats(item):
    node_info = redisconn.info('Stats')
    NodeData = node_info['ip:port']
    if item == 'instantaneous_ops_per_sec':
        item = NodeData['instantaneous_ops_per_sec']
        return item
    elif item == 'instantaneous_input_kbps':
        item = NodeData['instantaneous_input_kbps']
        return item
    elif item == 'instantaneous_output_kbps':
        item = NodeData['instantaneous_output_kbps']
        return item
    elif item == 'hit':
        hit =  NodeData['keyspace_hits'] 
        misshit = NodeData['keyspace_misses']
        hitrate = round((float(hit) / float(hit + misshit)) ,3)
        item = hitrate
        return item        
    else:
        return 9999

###
脚本传参,zabbix获取监控项
###

if sys.argv[1] == 'status':
     print ClusterState('clusterstatus')
elif sys.argv[1] == 'slotsfail': 
     print ClusterState('clusterslotsfail')
elif sys.argv[1] == 'nodes':
     print ClusterState('clusterknownnodes')
elif sys.argv[1] == 'day':
     print NodeInfoServer('uptime_in_days')
elif sys.argv[1] == 'clients':
     print NodeInfoClients('connected_clients')
elif sys.argv[1] == 'usememory':
     print NodeInfoMemory('used_memory_human')
elif sys.argv[1] == 'sysmemory':
     print NodeInfoMemory('total_system_memory_human')
elif sys.argv[1] == 'rdb':
     print NodeInfoPersistence('rdb_last_bgsave_status')
elif sys.argv[1] == 'ops':
     print NodeInfoStats('instantaneous_ops_per_sec')
elif sys.argv[1] == 'input_kbps':
     print NodeInfoStats('instantaneous_input_kbps')
elif sys.argv[1] == 'output_kbps':
     print NodeInfoStats('instantaneous_output_kbps')
elif sys.argv[1] == 'hit':
     print NodeInfoStats('hit')

监控界面

1513862328(1).jpg

监控的参数有input_kps、output_kps、ops、redis运行天数、占用系统内存、失败的槽数、客户端数、持久化状态、缓存命中率、集群状态等等,结合生产情况设置阈值告警

总结

由于个人对redis理解有限,暂时只监控了这些参数。python写的也不够简洁,很多需要优化的地方。先暂时实现了功能,有空再优化

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容

  • Zabbix简介 Zabbix官方网站Zabbix中文文档 本文系统环境是CentOS7x86_64, Zabbi...
    Zhang21阅读 7,969评论 0 37
  • 前言介绍 监控是整个运维乃至整个产品生命周期中最重要的一环,事前及时预警发现故障,事后提供详实的数据用于追查定位问...
    oldxu_linux阅读 5,237评论 1 76
  • 早上我说,我想洗头,但是就不能送你了。 女儿说,你既想洗头,又想送我上学还能顺便吃个早点,好矛盾啊,是不是? 嗯是...
    王敏敏_5f02阅读 73评论 0 0
  • 幸福的洺铭 臧明魁 你和春天结伴而来 走过 万物复苏 迎来 百花争艳 九月九 重阳登高到...
    日月鬼斗阅读 404评论 0 1