刘宇,甜橙金融创新中心基础技术架构师,拥有9年IT从业经验、9年数据库开发运维经验、4次大型营销活动经验。目前关注容器、分布式数据库技术等基础技术。
在线上排查redis性能问题时,从redis中找进行优化是一种常规手段。
redis slowlog被设计成内存中一个先进先出的队列结构,在慢日志较多的情况下,旧命令就会被刷新出slowlog,从而无法跟踪。
为了解决历史慢日志跟踪问题,需要将redis slowlog转储,本文介绍使用改造后的rsbeat将slowlog转储到Elasticsearch,进行分析的设计实现。
一、Redis slowlog简介
slowlog核心配置参数及命令
slowlog-log-slower-than:slowlog的阈值,只有query执行时间大于slowlog-log-slower-than的记录慢查询,设置的单位是微秒,默认是10000微秒,也就是10ms。
slowlog-max-len:表示慢查询最大的条数,默认值为128。当slowlog超过设定的最大值后,会将最早的slowlog删除。
Slowlog get N:用来获取指定的条数可以使用SLOWLOG GET N命令。
rsbeat简介
rsbeat来源于官方的Beats平台,Beats集合了多种单一用途数据采集器。它们从成百上千或成千上万台机器和系统向Logstash或Elasticsearch发送数据。
地址:
https://www.elastic.co/guide/en/beats/libbeat/current/community-beats.html
本次用到Elasticsearch、kibana和rsbeat三款产品。Elasticsearch用来存储解析后的redis slowlog,kibana用于图形化分析,rsbeat用于收集redis slowlog。
rsbeat的收集原理如下:
二、rsbeat改造
因为社区的rsbeat只支持ipPort的方式进行检索。不支持redis sentinel还有redis cluster,为了满足我们的需要,这里对rsbeat进行了部分改造。改造点如下:
1、增加支持sentinel及redis cluster
rsbeat的关于原始配置如下:
其中redis参数配置为ipPort形式的redis实例list,我们这个改造成ipPortName的形式:
对于redis sentinel这里的myredis使用注册到sentinel里的master name来进行检索。
对于redis cluster这里的myredis可使用自定义的集群名称,或者是cmdb中的集群名称来进行检索。一般redis cluster节点都比较多,这样可以避免手工需要登陆多个节点来获取慢查询,从而提高效率。
改造rsbeat.go的代码如下所示,增加一个ipPortName字符串的处理函数:
在poolList这个map结构中处理:
2、记录redis实例的角色信息
前面使用到了master name检索,又想对redis的角色进行筛选,需要记录角色信息。则在rebeat中slowlog get、slowlog reset后面增加role命令来获取角色信息。
在func (bt *rsbeat) redisc(beatname string, init bool, c redis.Conn, ipPort string){...}函数中修改
以及beats的event中:
然后在修改poolInit函数,增加slowerLen参数:
3、Slowlog-max-len可配置
修改Slowlog-max-len可配置在config.go 文件中,Config结构中增加SlowerLen属性,以及默认值:
三、使用Kibana中检索
1、通过master name或者是redis cluster的name进行检索:
2、使用master name以及角色检索:
在Add a filter中添加role的过滤:
然后检索master name:
3、在DASHBOARD中检索:
四、总结
Elastic Stack有着强大的开源社区支持。通过简单的改造和折腾,即可扩展rsbeat功能,使其更满足redis sentinel、redis cluster等更灵活的查询检索需要。本文通过对改造内容进行说明,希望能给大家提供帮助及思路。
如果字段的最大可能长度超过255字节,那么长度值可能…
只能说作者太用心了,优秀
感谢详解
一般干个7-8年(即30岁左右),能做到年入40w-50w;有…
230721