概述
当前系统主要使用的两种数据库:MySQL 和 Redis。为了方便统一集中的管理和监控这些慢查询日志,这里用ELK框架(当前系统的服务日志框架)下的Filebeat采集器来采集相关日志数据到ElasticSearch数据库里。
采用的数据库日志采集框架(EFK框架)如下图,ElasticSearch负责存储日志信息,Filebeat负责采集日志数据,并且可以直接存储到ElasticSearch中,Kibana是Web UI 端。
开启日志
MySQL
MySQL 慢查询日志是在mysql的配置文件中设置打开的,设置如下:
[mysqld]long_query_time=2slow_query_log=1slow_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 10000slowlog-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 loadingpath: ${path.config}/modules.d/*.ymlreload.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 logserror:enabled: true#var.paths:# Slow logsslowlog:enabled: truevar.paths: ["/etc/mysql-log/mysql-slow.log"]
redis.yml
- module: redis# Main logslog:enabled: false#var.paths: ["/var/log/redis/redis-server.log*"]# Slow logs, retrieved via the Redis API (SLOWLOG)slowlog:enabled: truevar.hosts: ["redis:6379"]var.password: test123456
查询和统计
MySQL
Discover查询
仪表板统计
Kibana自带了一个针对Filebeat采集的MySQL日志的概况统计仪表板,如下图:
仪表板
Redis
Discover查询
仪表板统计
Kibana自带了一个针对Filebeat采集的Redis数据的概况统计仪表板,如下图:
在该仪表板里展示了最长耗时命令及其慢查询日志相关信息等Redis的异常或错误统计图表。
分析和解决
MySQL
针对MySQL里面的慢查询语句进行逐条分析,分析SQL语句执行慢的原因:是索引的问题,还是锁表导致,还是事务执行造成的等等。
Redis
需要注意的是Redis慢查询的时间是记录命令的执行时间,不包含命令排队和网络传输时间。
Redis是单线程响应命令,因为这种命令执行排队机制,慢查询会导致其他命令级联阻塞,因此当客户端出现请求超时,需要检查该时间点是否有对应的慢查询,从而分析出是否为慢查询导致的命令级联阻塞。
