redis基础监控

article/2025/8/15 3:15:15

redis监控在这里插入图片描述

redis server 监控:
redis存活判断:ping判断,如果指定时间返回PONG表示存活,否则redis不能响应请求,可能阻塞或死亡
机器端口检查:nc 判断端口是否正常。
连接数:connected_clients >5000 时告警
连接数使用率:connected_clients/maxclients >90% 告警
list阻塞调用被阻塞的连接个数 blocked_clients >0 告警
redis内存使用率 ,占用最大内存使用率 > 80% 告警
最大内存容量限制而被驱逐(evict)的键数量 :evicted_keys>0 说明内存超设置最大内存
因为最大客户端数量限制而被拒绝的连接请求数量: rejected_connections >0
请求键的命中率:keyspace_hits#查找数据库键成功的次数 / 总查询(失败+成功)<50%
redis_cluster 监控
集群健康状态:cluster_state不为OK则告警
集群的节点数 :cluster_known_nodes 集群中redis节点的个数。
检测下线的数据槽slots个数:集群正常运行时,cluster_slots_fail 应该为0. 如果大于0说明集群有slot存在故障

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 功能说明: redis监控
# 创建者: zhouwj
# 创建时间: 2019/12/03
# 修改历史: import redis
import sys
import subprocess
import json
import  logging
import time
import requests
import logging.handlers
data=[]   
log_filename='/home/zhouwj/zhouwj/bin/redis_monitor/redis_monitor.log'
#logging.basicConfig(
#     filename='/home/zhouwj/zhouwj/bin/redis_monitor/redis_monitor.log',
#     level=logging.INFO,
#     format='%(levelname)s:%(asctime)s:%(message)s')
#with open('/home/zhouwj/zhouwj/bin/redis_monitor/nodes_ip.txt','rt') as f:
#        ip_list=f.read().splitlines()
#进入redis集群模式,如果异常,记录到日志中,并终止脚本
localtime = time.strftime("[%H:%M:%S]", time.localtime())
headers={"Content-Type": "application/json"}
dl="\n-------------------------------------\n"
#logging
def loghandler(name):#初始化logginglogging.basicConfig()log=logging.getLogger(name)#设置日志级别log.setLevel(logging.INFO)#添加TimeRoatingFileHandler#定义一个1天换一次log文件的handler#保留7个旧log文件timefilehandler=logging.handlers.TimedRotatingFileHandler(filename=log_filename,when='D',interval=1,backupCount=7)timefilehandler.suffix="%Y-%m-%d.log"#设置log记录输出的格式formatter=logging.Formatter('%(asctime)s %(levelname)s: %(name)s %(message)s')timefilehandler.setFormatter(formatter)#添加到logger中log.addHandler(timefilehandler)return log#调用函数,实现日志输出
log=loghandler('redis')
def nodes_ip():with open('/home/zhouwj/zhouwj/bin/redis_monitor/nodes_ip.txt','rt') as f:lines=[line.split() for line in f]for line  in lines :yield line #获取连接数,>5000 时告警
def redis_connections():try:return info['connected_clients']except Exception, e:return 0#redis的连接使用率
def redis_connections_usage():try:curr_connections = redis_connections()max_clients = parse_config('maxclients')rate = float(curr_connections) / float(max_clients)return "%.2f" % (rate * 100)except Exception, e:return 0#redis内存使用量
def redis_used_memory():try:print info['used_memory']return info['used_memory']except Exception, e:return 0#redis内存使用率
def redis_memory_usage():try:used_memory = info['used_memory']max_memory = info['maxmemory']system_memory = info['total_system_memory']if max_memory:rate = float(used_memory) / float(max_memory)else:rate = float(used_memory) / float(system_memory)return "%.2f" % (rate * 100)except Exception, e:return 0#拒绝连接数
def rejected_connections():try:return info['rejected_connections']except Exception, e:return 999#运行以来删除过的key的数量
def evicted_keys():try:return info['evicted_keys']except Exception, e:return 999#正在等待阻塞客户端数量
def blocked_clients():try:return info['blocked_clients']except Exception, e:return 0#redis的OPS,redis内部较实时的每秒执行的命令数
def ops(self):try:return info['instantaneous_ops_per_sec']except Exception, e:return 0#请求键的命中率,命中率低于50%告警
def hitRate():try:misses = info['keyspace_misses']hits = info['keyspace_hits']rate = float(hits) / float(int(hits) + int(misses))return "%.2f" % (rate * 100)except Exception, e:return 0#获取最大连接数
def parse_config(type):try:return redisconn.config_get(type)[type]except Exception, e:return None
def send_alarm(localtime,dl,headers,param,ip):MSG = localtime+dl+"DCR-db_error:"+paramSecret = '3e15a344-f620-47a6-aa7a-afde087a8104'url = 'https://qyapi.weixin.qq.com'send_msg = '{ "msgtype": "text","text": {"content": "%s"}}' % (MSG)send_url = '%s/cgi-bin/webhok/send?key=%s' % (url,Secret)#print send_url#print headers#print send_msg#p_post=requests.post(url=send_url,headers=headers,data=send_msg)#print p_postalarm_name='DCR_db_error'alarm_cmd='msalarm -h %s -n  %s -p %s' % (ip,alarm_name,param)#alarm_cmd='msalarm -n "%s"-p "%s"' % (alarm_name,param)log.error(MSG)log.error(alarm_cmd)subprocess.call(alarm_cmd,shell=True)
def alarm(ip):if str(redisconn.ping()) != 'True':param=ip+":"+'redis_ping:'+str(redisconn.ping())send_alarm(localtime,dl,headers,param,ip)log.error(param)else:log.info("%s redis_ping: normal",ip)if check_alive(ip, 12201) != 0 :param=ip+":"+'check_alive:'+'port_fail'send_alarm(localtime,dl,headers,param,ip)log.error(param)else:log.info("%s check_alive: normal",ip)if redis_connections() > 5000 :param=ip+":"+'redis_connections:'+str(redis_connections())send_alarm(localtime,dl,headers,param,ip)log.error(param)else:log.info("%s redis_connections: normal",ip)if blocked_clients() > 0 :param=ip+":"+'blocked_clients:'+str(blocked_clients())send_alarm(localtime,dl,headers,param,ip)log.error(param)else:log.info("%s blocked_clients: normal",ip)if float(redis_connections_usage().strip("%"))  > 90 :param=ip+":"+'redis_connections_usage:'+str(redis_connections_usage())send_alarm(localtime,dl,headers,param,ip)log.error(param)else:log.info("%s redis_connections_usage: normal",ip)if float(redis_memory_usage()) > 80 :param=ip+":"+'redis_memory_usage:'+str(redis_memory_usage())send_alarm(localtime,dl,headers,param,ip)log.error(param)else:log.info("%s redis_memory_usage: normal",ip)if evicted_keys() > 0 :param=ip+":"+'evicted_keys:'+str(evicted_keys())send_alarm(localtime,dl,headers,param,ip)log.error(param)else:log.info("%s evicted_keys: normal",ip)if rejected_connections() > 0 :param=ip+":"+'rejected_connections:'+str(rejected_connections())send_alarm(localtime,dl,headers,param,ip)log.error(param)else:log.info("%s rejected_connections: normal",ip)
#        if float(hitRate().strip("%")) < 50 :
#            param=ip+":"+'hitRate:'+str(hitRate())
#            send_alarm(localtime,dl,headers,param,ip)
#            log.error(param)
#        else:
#            log.info("%s is single_mode: normal",ip)
def check_alive(host, port):cmd = 'nc -z %s %s > /dev/null 2>&1' % (host, port)return subprocess.call(cmd, shell=True)
#定义函数,抓取集群infodef clusterstatus(var):if var == 'ok' :item = 0else:item = 1return itemdef clusterslotsfail(var):item = varreturn itemdef clusterknownnodes(var):item = varreturn item
if __name__ == '__main__':for x in  nodes_ip():ip,mode,keyword,nodes= xtry:redisconn=redis.StrictRedis(host=ip,port=12201,password=keyword,socket_connect_timeout=1)#info=redisconn.info()#alarm(ip)except Exception,e:param=ip+":""连接失败"send_alarm(localtime,dl,headers,param,ip)continueinfo=redisconn.info()alarm(ip) if mode == 'cluster':try:cluster_info = redisconn.execute_command('cluster','info')cluster_info = cluster_info.split('\r\n')except:param=ip+":""集群查询失败"send_alarm(localtime,dl,headers,param,ip)continuetry:for i in cluster_info:data.append([i.split(':')[0],i.split(':')[1]])except:passfor key,var in data:if key == 'cluster_state':clusters_status=clusterstatus(var)elif key == 'cluster_slots_fail':clusters_lotsfail=clusterslotsfail(var)elif key == 'cluster_known_nodes':clusters_knownnodes=clusterknownnodes(var)if str(clusters_status) == '0':log.info("%s clusters_status: normal ",ip)else:param='clusters_status:'+ip+":"+clusters_statussend_alarm(localtime,dl,headers,param,ip)if clusters_lotsfail == '0':log.info("%s clusters_lotsfail: normal ",ip)else:param='clusters_lotsfail:'+ip+":"+clusters_lotsfailsend_alarm(localtime,dl,headers,parami,ip)if clusters_knownnodes== nodes:log.info("%s clusters_knownnodes:normal ",ip)else:param='clusters_knownnodes:'+ip+":"+clusters_knownnodessend_alarm(localtime,dl,headers,param,ip)

nodes_ip.txt 格式:
ip single/cluster null/槽数
1.1.1.1 single null
2.2.2.2 cluster 100


http://chatgpt.dhexx.cn/article/2PrjVGyv.shtml

相关文章

【23种设计模式】设计模式介绍与分类

前言 本文为 【23种设计模式】设计模式介绍与分类 相关知识介绍&#xff0c;下边将对什么是设计模式&#xff0c;设计模式的分类与23种设计模式的关键点进行详尽介绍~ &#x1f4cc;博主主页&#xff1a;小新要变强 的主页 &#x1f449;Java全栈学习路线可参考&#xff1a;【…

Java之美[从菜鸟到高手演变]之设计模式

设计模式&#xff08;Design Patterns&#xff09; ——可复用面向对象软件的基础 设计模式&#xff08;Design pattern&#xff09;是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可…

23 种设计模式详解(全23种)

设计模式的分类 总体来说设计模式分为三大类&#xff1a; 创建型模式&#xff0c;共五种&#xff1a;工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式&#xff0c;共七种&#xff1a;适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合…

23种设计模式汇总整理

设计模式分为三大类&#xff1a; 创建型模式&#xff0c;共五种&#xff1a;工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式 结构型模式&#xff0c;共七种&#xff1a;适配器模式、装饰者模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模…

设计模式的作用

这几天一边搞论文&#xff0c;一边学设计模式。真的是搞得我头昏脑胀&#xff0c;隐约明白设计模式是一种规范&#xff0c;一种体系。接到一个棘手或大型的项目&#xff0c;通过经验丰富或者领导的拆解&#xff0c;拆成一个个小的项目模块。然后让其他人去实现。会有一些约定俗…

设计模式概述 以及 23种设计模式的介绍

设计模式概述&#xff08;Design pattern&#xff09;&#xff1a; 设计模式&#xff1a;代表了最佳的实践&#xff0c;通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相…

设计模式(一)设计模式的分类与区别

文章目录 一、设计模式的六大原则1.1 开闭原则&#xff08;总原则&#xff09;1.2 里氏替换原则1.3 依赖倒置原则1.4 单一职责原则1.5 接口隔离原则1.6 迪米特法则1.7 合成复用原则 二、设计模式的三大类别2.1 创建型模式2.2 结构型模式2.3 行为型模式 三、设计模式的使用3.1 设…

Java中常用的设计模式

文章转载借鉴&#xff1a;http://blog.csdn.net/zhangerqing 一、什么是设计模式 设计模式&#xff08;Design pattern&#xff09;是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可…

23种设计模式概述

设计模式共有23种&#xff0c;创建型模式5种&#xff0c;结构型模式7种&#xff0c;行为型模式11种&#xff0c;本章只做概念性说明。 &#xff08;一&#xff09; 创建型模式 01 工厂模式 定义&#xff1a;又叫做静态工厂方法&#xff0c;定义一个用于创建对象的接口&#…

常用的几种设计模式详解

设计模式的概述 设计模式分类 创建型模式 特点是将对象的创建与使用分离&#xff08;解耦&#xff09;&#xff0c;有 单例、原型、工厂方法、抽象工厂、建造者等5种。 结构型模式 用于描述如何将类或对象按某种布局组成更大的结构&#xff0c;代理、适配器、桥接、装饰、享元…

深度学习之对抗网络

一. 对抗网络的由来 对抗网络 是个新词,全名叫 生成式对抗网络(Generative adversarial nets),就像深度学习一样,发明时间并不长。 Ian Goodfellow(生成对抗性网络的发明者)定义了 对抗网络; Yann LeCun(三巨头之一)在Quora上直播时表示生成对抗性网络近期人工智能最…

[论文]鲁棒的对抗性强化学习

[论文]鲁棒的对抗性强化学习 摘要1.简介1.1RARL综述 2.背景2.1 MDPs中的标准强化学习2.2 两人零和折扣游戏 3.鲁棒的对抗式RL3.1 对抗智能体的鲁棒控制3.2 提出方法:RARL 结论 摘要 深度神经网络与快速模拟和改进的计算相结合&#xff0c;导致了最近在强化学习领域的成功。然而…

融合transformer和对抗学习的多变量时间序列异常检测算法TranAD论文和代码解读...

一、前言 今天的文章来自VLDB TranAD: Deep Transformer Networks for Anomaly Detection in Multivariate Time Series Data 论文链接&#xff1a;https://arxiv.org/pdf/2201.07284v6.pdf代码地址&#xff1a;https://github.com/imperial-qore/TranAD 二、问题 在文章中提出…

【深度学习】深入浅出对抗机器学习(AI攻防)

【深度学习】深入浅出对抗机器学习(AI攻防) 文章目录 1 Attack ML Model概述 2 基本概念 3 攻击分类 4 经典的对抗性样本生成算法 5 经典的对抗防御方法 6 人工智能安全现状概析1 Attack ML Model概述 随着AI时代机器学习模型在实际业务系统中愈发无处不在,模型的安全性也变…

基于噪声伪标签和对抗学习的医学图像分割标注高效学习

目录 背景&#xff1a; 面临问题&#xff1a; 解决方案&#xff1a; 一 没有图像标注对的学习 二 为训练图像生成伪标签 2.1 为训练图像生成伪标签 2.2 VAE-Based鉴别器 2.3 鉴别器引导的发生器信道校准 这里有不太理解 &#xff08;未写完&#xff09; 三 从嘈杂的伪标…

【论文推荐】了解《对抗学习》必看的6篇论文(附打包下载地址)

论文推荐 “SFFAI139期来自美国莱斯大学的傅泳淦推荐的文章主要关注于基础研究的对抗学习领域&#xff0c;你可以认真阅读讲者推荐的论文&#xff0c;来与讲者及同行线上交流哦。” 关注文章公众号 回复"SFFAI139"获取本主题精选论文 01 The Lottery Ticket Hypothes…

对抗机器学习——Universal adversarial perturbations

代码地址&#xff1a; https://github.com/LTS4/universal 核心思想&#xff1a; 本文提出一种 universal对抗扰动&#xff0c;universal是指同一个扰动加入到不同的图片中&#xff0c;能够使图片被分类模型误分类&#xff0c;而不管图片到底是什么。示意图&#xff1a; 形…

【强化学习】模仿学习:生成式对抗模仿学习

★★★ 本文源自AI Studio社区精品项目&#xff0c;【点击此处】查看更多精品内容 >>> 模仿学习– 生成式对抗模仿学习 1. 模仿学习 模仿学习&#xff08;imitation learning&#xff09;不是强化学习&#xff0c;而是强化学习的一种替代品。模仿学习与强化学习有相同…

最新综述:图像分类中的对抗机器学习

目录 1.引言 2.论文贡献 3.卷积神经网络简介 4.对抗样本和对抗攻击 4.1.1 对抗扰动范围 4.1.2 对抗扰动的可见性 4.1.3 对抗扰动的测量 4.2 对抗攻击的分类 4.2.1 攻击者的影响力 4.2.2 攻击者的知识 4.2.3 安全入侵 4.2.4 攻击的特异性 4.2.5 攻击方法 5.2 防御…

对抗学习DCGAN网络

文章目录 DCGAN教程1. 简介2. 生成对抗网络&#xff08;Generative Adversarial Networks&#xff09;2.1 什么是 GAN2.2 什么是 DCGAN 3. DCGAN实现过程3.1 输入3.2 数据3.3 实现3.3.1 权重初始化3.3.2 生成器3.3.3 判别器3.3.4 损失函数和优化器3.3.4 训练3.3.5 结果 DCGAN教…