热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

用elasticstack来分析下你的redisslowlog

redis是目前最流行的NoSQL内存数据库,然而如果在使用过程中出现滥用、乱用的情况,很容易发生性能问题,此时我们就要去关注慢查询日志&

redis是目前最流行的 NoSQL 内存数据库,然而如果在使用过程中出现滥用、乱用的情况,很容易发生性能问题,此时我们就要去关注慢查询日志,本文尝试给大家介绍一种通过 elastic stack 来快速分析 redis 慢查询日志的方法,希望能给大家提供帮助。


redis slowlog简介

redis是目前最流行的缓存系统,因其丰富的数据结构和良好的性能表现,被各大公司广泛使用。尽管redis性能极佳,但若不注意使用方法,极容易出现慢查询,慢查询多了或者一个20s的慢查询会导致操作队列(redis是单进程)堵塞,最终引起雪崩甚至整个服务不可用。对于慢查询语句,redis提供了相关的配置和命令。
配置有两个:slowlog-log-slower-thanslowlog-max-lenslowlog-log-slower-than是指当命令执行时间(不包括排队时间)超过该时间时会被记录下来,单位为微秒,比如通过下面的命令,就可以记录执行时长超过20ms的命令了。


 

config set slowlog-log-slower-than 20000

slowlog-max-len是指redis可以记录的慢查询命令的总数,比如通过下面的命令,就可以记录最近100条慢查询命令了。

config set slowlog-max-len 100

操作慢查询的命令有两个:slowlog get [len] 和 slowlog resetslowlog get [len]命令获取指定长度的慢查询列表。

redis 127.0.0.1:6379> slowlog get 2
1) 1) (integer) 142) (integer) 13094482213) (integer) 154) 1) "ping"
2) 1) (integer) 132) (integer) 13094481283) (integer) 304) 1) "slowlog"2) "get"3) "100"

上面返回了两个慢查询命令,其中每行的含义如下:


  1. 第一行是一个慢查询id。该id是自增的,只有在 redis server 重启时该id才会重置。
  2. 第二行是慢查询命令执行的时间戳
  3. 第三行是慢查询命令执行耗时,单位为微秒
  4. 第四行是慢查询命令的具体内容。

slowlog reset命令是清空慢日志队列。


elastic stack

elastic stack是elastic公司的一系列软件产品,包括elasticsearch、kibana、logstash、beats等,感兴趣的可以去官网看各个产品的详细介绍,此次不再做详细的讲解。本次分析过程中,我们会用到elasticsearchkibanabeats三款产品。elasticsearch用来存储解析后的redis slowlog,kibana用于图形化分析,beats用于收集redis slowlog。
这里着重讲一下beats,它是一系列轻量级的数据收集产品统称,目前官方提供了filebeatpacketbeatheartbeatmetricbeat等,可以用来收集日志文件、网络包、心跳包、各类指标数据等。像我们这次要收集的redis slowlog,官方还没有提供相关工具,需要我们自己实现,但借助beats的一系列脚手架工具,我们可以方便快速的创建自己的rsbeat---redis slowlog beat


rsbeat原理简介

接下来我们先讲解一下rsbeat的实现原理,一图胜千言,我们先来看下它的工作流。

我们由下往上分析:


  1. 最下面是我们要分析的redis server列表
  2. 再往上便是rsbeat,它会与这些redis server建立连接并定期去拉取 slowlog
  3. 在启动时,rsbeat会发送下面的命令到每一台redis server,来完成slowlog的配置,这里设置记录最近执行时长超过20ms的500条命令。

config set slowlog-log-slower-than 20000
config set slowlog-max-len 500
slowlog reset

然后rsbeat会定时去拉取每台redis server的慢查询命令

slowlog get 500
slowlog reset

注意之类slowlog reset是因为此次已经将所有的慢日志都取出了,下次获取时取最新生成的,防止重复计算。


  1. rsbeat将解析的慢日志发布到elasticsearch中进行存储
  2. 通过kibana进行slowlog的图形化分析

rsbeat的整个工作流到这里已经介绍完毕了,是不是很简单呢?下面我们来简单看一下rsbeat的核心代码实现。


rsbeat核心代码讲解

rsbeat已经在github上开源了,感兴趣的同学可以自己去下下来使用。下面我们分析的代码位于beater/rsbeat.go,这也是rsbeat的核心文件。

func poolInit(server string, slowerThan int) *redis.Pool {return &redis.Pool{MaxIdle: 3,MaxActive: 3,IdleTimeout: 240 * time.Second,Dial: func() (redis.Conn, error) {c, err := redis.Dial("tcp", server, redis.DialConnectTimeout(3*time.Second), redis.DialReadTimeout(3*time.Second))if err != nil {logp.Err("redis: error occurs when connect %v", err.Error())return nil, err}c.Send("MULTI")c.Send("CONFIG", "SET", "slowlog-log-slower-than", slowerThan)c.Send("CONFIG", "SET", "slowlog-max-len", 500)c.Send("SLOWLOG", "RESET")r, err := c.Do("EXEC")if err != nil {logp.Err("redis: error occurs when send config set %v", err.Error())return nil, err}logp.Info("redis: config set %v", r)return c, err},TestOnBorrow: func(c redis.Conn, t time.Time) error {_, err := c.Do("PING")logp.Info("redis: PING")return err},}
}

 

poolInit方法是rsbeat初始化时进行的操作,这里也就是发送slowlog配置的地方,代码很简单,就不展开解释了。

func (bt *Rsbeat) redisc(beatname string, init bool, c redis.Conn, ipPort string) {defer c.Close()logp.Info("conn:%v", c)c.Send("SLOWLOG", "GET")c.Send("SLOWLOG", "RESET")logp.Info("redis: slowlog get. slowlog reset")c.Flush()reply, err := redis.Values(c.Receive()) // reply from GETc.Receive() // reply from RESETlogp.Info("reply len: %d", len(reply))for _, i := range reply {rp, _ := redis.Values(i, err)var itemLog itemLogvar args []stringredis.Scan(rp, &itemLog.slowId, &itemLog.timestamp, &itemLog.duration, &args)argsLen := len(args)if argsLen >= 1 {itemLog.cmd = args[0]}if argsLen >= 2 {itemLog.key = args[1]}if argsLen >= 3 {itemLog.args = args[2:]}logp.Info("timestamp is: %d", itemLog.timestamp)t := time.Unix(itemLog.timestamp, 0).UTC()event := common.MapStr{"type": beatname,"@timestamp": common.Time(time.Now()),"@log_timestamp": common.Time(t),"slow_id": itemLog.slowId,"cmd": itemLog.cmd,"key": itemLog.key,"args": itemLog.args,"duration": itemLog.duration,"ip_port": ipPort,}bt.client.PublishEvent(event)}
}

redisc方法实现了定时从redis server拉取最新的slowlog列表,并将它们转化为elasticsearch中可以存储的数据后,发布到elasticsearch中。这里重点说下每一个字段的含义:


  1. @timestamp是指当前时间戳。
  2. @log_timestamp是指慢日志命令执行的时间戳。
  3. slow_id是该慢日志的id。
  4. cmd是指执行的 redis 命令,比如saddscard等等。
  5. key是指redis key的名称
  6. args是指 redis 命令的其他参数,通过 cmdkeyargs我们可以完整还原执行的redis命令。
  7. duration是指redis命令执行的具体时长,单位是微秒。
  8. ip_port是指发生命令的 redis server 地址。

有了这些字段,我们就可以用kibana来愉快的进行可视化数据分析了。


Kibana图形化分析slowlog

Kibana提供了非常方便的数据分析操作,这里不展开解释了,感兴趣的可以自行去学习,这里直接上图,看下最终的分析结果。


查看慢日志按照时间的分布情况
查看慢日志按照时间的分布情况

 

 

上图可以看到最近有一个很明显的数量减少,原因是我们解决了相关的慢查询。


按慢查询数目来查看cmd分布和key分布
按慢查询数目来查看cmd分布和key分布

                                                        


按慢查询时长来查看cmd分布和key分布
按慢查询时长来查看cmd分布和key分布

 


表格呈现慢查询的具体命令
表格呈现慢查询的具体命令

 

 

看完上面的截图,有没有心动,想亲自操刀试一下?Kibana操作起来非常简单,尤其对于程序员来讲,使用起来得心应手。赶紧下载rsbeat下来自己试一下吧!


总结

随着 elastic stack 的发展,其使用门槛越来越低,我认为目前所有的有志于做数据分析的工程师都应该了解和掌握它的用法。有了它的帮助,你可以以极快的速度搭建起自己的一套免费强大的数据分析软件,它的优点包括但不限于下面提到的:


  1. 数据源任意且自定制。只要你能将数据读取出来并存储到elasticsearch中即可分析。
  2. 支持海量数据分析。得益于elastic多年的迅猛发展,其产品已经非常成熟,上TB的数据都可以轻松应对存储与分析。有了它,你就可以舍弃数据一多就卡顿的excel了。
  3. 强大的开源社区支持。elastic产品的迅猛发展离不开开源社区的支持,你只要在社区中提出自己的问题或者需求,总会有人即时给你答复和建议。如果你有一定的开发能力,那么完全可以按照自己的想法来折腾。



作者:rockybean
链接:https://www.jianshu.com/p/f0878aaacf77
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


推荐阅读
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 本文介绍了关系型数据库和NoSQL数据库的概念和特点,列举了主流的关系型数据库和NoSQL数据库,同时描述了它们在新闻、电商抢购信息和微博热点信息等场景中的应用。此外,还提供了MySQL配置文件的相关内容。 ... [详细]
  • Redis API
    安装启动最简启动命令行输入验证动态参数启动配置文件启动常用配置通用命令keysbdsize计算key的总数exists判断是否存在delkeyvalue删除指定的keyvalue成 ... [详细]
  • 本文整理了Java中java.lang.NoSuchMethodError.getMessage()方法的一些代码示例,展示了NoSuchMethodErr ... [详细]
  • 【转】腾讯分析系统架构解析
    TA(TencentAnalytics,腾讯分析)是一款面向第三方站长的免费网站分析系统,在数据稳定性、及时性方面广受站长好评,其秒级的实时数据更新频率也获得业界的认可。本文将从实 ... [详细]
  • 前面刚有AWS开战MongoDB,双方“隔空互呛”,这厢又曝出2亿+简历信息泄露——MongoDB的这场开年似乎“充实”得过分了些。长期以来,作为“最受欢迎的NoSQL数据库”,M ... [详细]
  • 数据库基本介绍
    1、数据库基本知识概念:数据库:database(DB),是一种存储数据的仓库数据库是根据数据结构组织、存储和 ... [详细]
  • https:github.comguanhui07…自取上传到这里《PHP7内核剖析》深入理解PHP最佳良品《鸟哥的Linux私房菜》可能有点历史久远了,《ModernPHP(中文 ... [详细]
  • 一、滴滴智慧交通部-php工程师D7-D91. 负责功能模块的开发和详细设计,参与需求分析,系统分析及详细设计;2. 高性能Web应用的架构设计和优化;3. 负责研发实施过程中的模 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 什么是堡垒机?堡垒机是一个主机系统,其自身通常经过了一定的加固,具有较高的安全性,可抵御一定的攻击,其作用主 ... [详细]
  • 数据库 SQL 和 NoSQL 的区别
    SQL和NoSQL的区别一、概念SQL(StructuredQueryLanguage)数据库,指关系型数据库。主要代表:SQLServer࿰ ... [详细]
author-avatar
霸气的玫琳_801
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有