Redis的监控一直是重点中的重点,市面上开源的Redis界面监控也不在少数了,但是自己做一个监控页面更加有针对性,而且更加有逼格。我们主要监控redis除了常规的cpu、内存、Key数之外,还有如下几个方面:阻塞客户端数量、使用内存峰值、内存碎片率、缓存命中率、失效KEY、慢日志和连接数。这里挑几个简单的说。
获取连接细节情况
首先先来搞定“获取redis的连接细节”。在django里先做一个model,如下:
1 | class redisconnection(models.Model): |
可见我们只是需要排名、具体的IP、当时有多少连接以及当时时间这4个指标而已。
我承认我道行不够,捅咕两个小时也没有研究出来怎么用python2.7去获取redis的连接数细节,于是乎就用shell写了一个简单的脚本。如下:
1 | #!/bin/bash |
这里先简单解释一下:
1.client list
是查看redis连接细节的命令,然后通过awk获取第二列,再分别通过“=”和“,”来分割两次,排序去重统计个数最后取出前五名输入到clientip.txt
这个文件里;
2.连接mysql,-A的含义是不去预读全部数据表信息;-N的含义是获取数据信息省去列名称;
3.使用cat -n
自动获取到行号当做排名,循环赋值;
4.curdate()
,now()
这俩是sql,但是需要shell里正确使用sql就要-e
;
执行效果如下: akb48
剩下的内容就是在views.py
里拿值然后通过render
反馈到前端页面,这里不说了。
如果使用了Redis中间件,那么就不能统计redis的client list
了,而是到中间件服务器里,使用ss -art | awk '{print $5}' | grep '^[1-9]' | cut -d : -f 1 | sort | uniq -dc | sort -nr
获取详细连接情况。
获取缓存命中率
缓存命中率是 akb48info Stats
命令里keyspace_hits/(keyspace_hits+keyspace_misses)
的值,比如我这个redis:
这个值正常来说应该是90%以上,如果缓存命中率过低,那么要排查对缓存的用法是否有问题,我这个就很不合格…
获取缓存命中率的shell脚本如下:
1 | #!/bin/bash |
这里要注意!hit
和miss
结果是自带”\r”的,所以要去掉。不然的话就会有expr: non-numeric argument
。而且如果用bc命令获取除法结果的话,低于1的值是不会出现整数0,即如果得到的结果是0.97,那么只会显示.97,至于如何出现这个0,可以去看 http://www.361way.com/linux-bc-point-zero/4960.html 。
现在已经通过脚本取到了值,那么剩下的内容就是django去弄一个model,之后在 akb48views.py
里拿值然后通过render
反馈到前端页面,这里不说了。执行效果如下:
其他补充
redis的慢日志操作也是我们比较关注的一点。一般来说我们使用slowlog len
来获取当前慢日志的总条数,而是用slowlog reset
对其进行清理工作。获取它的shell脚本跟上面两个大同小异,这里也略过不表了。
如果要是想获取redis的cpu和内存,最好的方法通过zabbix拿值,CPU使用率的item是:system.cpu.util[]
,内存使用率的item是:vm.memory.size[pavailable]
。
整个页面做完的效果如下: akb48
参考资料
https://segmentfault.com/a/1190000009915519
https://blog.csdn.net/secretx/article/details/73498148
http://www.cnblogs.com/iforever/p/4459857.html
https://morrisjs.github.io/morris.js/lines.html