概述

当前系统主要使用的两种数据库:MySQL 和 Redis。为了方便统一集中的管理和监控这些慢查询日志,这里用ELK框架(当前系统的服务日志框架)下的Filebeat采集器来采集相关日志数据到ElasticSearch数据库里。
采用的数据库日志采集框架(EFK框架)如下图,ElasticSearch负责存储日志信息,Filebeat负责采集日志数据,并且可以直接存储到ElasticSearch中,Kibana是Web UI 端。
image.png

开启日志

MySQL

MySQL 慢查询日志是在mysql的配置文件中设置打开的,设置如下:

  1. [mysqld]
  2. long_query_time=2
  3. slow_query_log=1
  4. slow_query_log_file= /var/lib/mysql/mysql-slow.log
  • long_query_time :慢查询阈值,当查询时间多于设定的阈值时,记录日志,默认值:10(记录大于10s的SQL)。
  • slow_query_log :是否开启慢查询日志,1表示开启,0表示关闭。
  • slow_query_log_file :慢查询存储的文件路径。

    Redis

    Redis的慢查询日志配置

    1. slowlog-log-slower-than 10000
    2. slowlog-max-len 128
  • slowlog-log-slower-than 单位:微妙,默认值:10000(即10毫秒)

  • slowlog-max-len 慢查询日志存储最大个数,默认值:128

采集日志

为了方便集中管理和分析日志,这里采用 Elatic Stack 下的 Filebeat 采集器采集MySQL和Redis的慢查询日志,并将日志存储到ES中去。

配置Filebeat

filebeat.yml

  1. #============================= Filebeat modules ===============================
  2. filebeat.config.modules:
  3. # Glob pattern for configuration loading
  4. path: ${path.config}/modules.d/*.yml
  5. reload.enabled: false
  6. #reload.period: 10s
  7. #==================== Elasticsearch template setting ==========================
  8. setup.template.settings:
  9. index.number_of_shards: 1
  10. #index.codec: best_compression
  11. #_source.enabled: false
  12. #============================== Dashboards =====================================
  13. setup.dashboards.enabled: true
  14. #============================== Kibana =====================================
  15. setup.kibana:
  16. host: "kibana:5601"
  17. #-------------------------- Elasticsearch output ------------------------------
  18. output.elasticsearch:
  19. # Array of hosts to connect to.
  20. hosts: ["elasticsearch:9200"]
  21. # Optional protocol and basic auth credentials.
  22. #protocol: "https"
  23. #username: "elastic"
  24. #password: "changeme"
  25. processors:
  26. - add_host_metadata: ~
  27. - add_cloud_metadata: ~

Filebeat 的modules.d文件夹下的 mysql和redis的配置
mysql.yml

  1. - module: mysql
  2. # Error logs
  3. error:
  4. enabled: true
  5. #var.paths:
  6. # Slow logs
  7. slowlog:
  8. enabled: true
  9. var.paths: ["/etc/mysql-log/mysql-slow.log"]

redis.yml

  1. - module: redis
  2. # Main logs
  3. log:
  4. enabled: false
  5. #var.paths: ["/var/log/redis/redis-server.log*"]
  6. # Slow logs, retrieved via the Redis API (SLOWLOG)
  7. slowlog:
  8. enabled: true
  9. var.hosts: ["redis:6379"]
  10. var.password: test123456

查询和统计

MySQL

Discover查询

image.png

仪表板统计

Kibana自带了一个针对Filebeat采集的MySQL日志的概况统计仪表板,如下图:
image.png
仪表板
image.png

Redis

Discover查询

image.png

仪表板统计

Kibana自带了一个针对Filebeat采集的Redis数据的概况统计仪表板,如下图:
image.png
在该仪表板里展示了最长耗时命令及其慢查询日志相关信息等Redis的异常或错误统计图表。
image.png

分析和解决

MySQL

针对MySQL里面的慢查询语句进行逐条分析,分析SQL语句执行慢的原因:是索引的问题,还是锁表导致,还是事务执行造成的等等。

Redis

需要注意的是Redis慢查询的时间是记录命令的执行时间,不包含命令排队网络传输时间
Redis是单线程响应命令,因为这种命令执行排队机制,慢查询会导致其他命令级联阻塞,因此当客户端出现请求超时,需要检查该时间点是否有对应的慢查询,从而分析出是否为慢查询导致的命令级联阻塞。