概述
当前系统主要使用的两种数据库:MySQL 和 Redis。为了方便统一集中的管理和监控这些慢查询日志,这里用ELK框架(当前系统的服务日志框架)下的Filebeat采集器来采集相关日志数据到ElasticSearch数据库里。
采用的数据库日志采集框架(EFK框架)如下图,ElasticSearch负责存储日志信息,Filebeat负责采集日志数据,并且可以直接存储到ElasticSearch中,Kibana是Web UI 端。
开启日志
MySQL
MySQL 慢查询日志是在mysql的配置文件中设置打开的,设置如下:
[mysqld]
long_query_time=2
slow_query_log=1
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的慢查询日志配置
slowlog-log-slower-than 10000
slowlog-max-len 128
slowlog-log-slower-than 单位:微妙,默认值:10000(即10毫秒)
- slowlog-max-len 慢查询日志存储最大个数,默认值:128
采集日志
为了方便集中管理和分析日志,这里采用 Elatic Stack 下的 Filebeat 采集器采集MySQL和Redis的慢查询日志,并将日志存储到ES中去。
配置Filebeat
filebeat.yml
#============================= Filebeat modules ===============================
filebeat.config.modules:
# Glob pattern for configuration loading
path: ${path.config}/modules.d/*.yml
reload.enabled: false
#reload.period: 10s
#==================== Elasticsearch template setting ==========================
setup.template.settings:
index.number_of_shards: 1
#index.codec: best_compression
#_source.enabled: false
#============================== Dashboards =====================================
setup.dashboards.enabled: true
#============================== Kibana =====================================
setup.kibana:
host: "kibana:5601"
#-------------------------- Elasticsearch output ------------------------------
output.elasticsearch:
# Array of hosts to connect to.
hosts: ["elasticsearch:9200"]
# Optional protocol and basic auth credentials.
#protocol: "https"
#username: "elastic"
#password: "changeme"
processors:
- add_host_metadata: ~
- add_cloud_metadata: ~
Filebeat 的modules.d文件夹下的 mysql和redis的配置
mysql.yml
- module: mysql
# Error logs
error:
enabled: true
#var.paths:
# Slow logs
slowlog:
enabled: true
var.paths: ["/etc/mysql-log/mysql-slow.log"]
redis.yml
- module: redis
# Main logs
log:
enabled: false
#var.paths: ["/var/log/redis/redis-server.log*"]
# Slow logs, retrieved via the Redis API (SLOWLOG)
slowlog:
enabled: true
var.hosts: ["redis:6379"]
var.password: test123456
查询和统计
MySQL
Discover查询
仪表板统计
Kibana自带了一个针对Filebeat采集的MySQL日志的概况统计仪表板,如下图:
仪表板
Redis
Discover查询
仪表板统计
Kibana自带了一个针对Filebeat采集的Redis数据的概况统计仪表板,如下图:
在该仪表板里展示了最长耗时命令及其慢查询日志相关信息等Redis的异常或错误统计图表。
分析和解决
MySQL
针对MySQL里面的慢查询语句进行逐条分析,分析SQL语句执行慢的原因:是索引的问题,还是锁表导致,还是事务执行造成的等等。
Redis
需要注意的是Redis慢查询的时间是记录命令的执行时间,不包含命令排队和网络传输时间。
Redis是单线程响应命令,因为这种命令执行排队机制,慢查询会导致其他命令级联阻塞,因此当客户端出现请求超时,需要检查该时间点是否有对应的慢查询,从而分析出是否为慢查询导致的命令级联阻塞。