千家信息网

Anemometer基于pt-query-digest将MySQL慢查询可视化

发表于:2025-02-06 作者:千家信息网编辑
千家信息网最后更新 2025年02月06日,参考文章:http://ourmysql.com/archives/1359?utm_source=tuicool&utm_medium=referral官方:https://github.com/b
千家信息网最后更新 2025年02月06日Anemometer基于pt-query-digest将MySQL慢查询可视化

参考文章:

http://ourmysql.com/archives/1359?utm_source=tuicool&utm_medium=referral

官方:https://github.com/box/Anemometer


单节点Anemometer监控

1 安装anemometer

# cd /data/www/web3# git clone https://github.com/box/Anemometer.gitanemometer && cd anemometer

2 创建表和用户名

# mysql -uroot -proot 

我们可以看下表结构如下


3 分析mysql慢日志

# pt版本高于2.2的执行下面语句,将慢查询日志放入名为slow_query_log数据库中

# pt-query-digest --user=anemometer -h 127.0.0.1 --password=123456 \--review h=localhost,D=slow_query_log,t=global_query_review\--history h=localhost,D=slow_query_log,t=global_query_review_history\--no-report --limit=0% --filter=" \$event->{Bytes} = length(\$event->{arg}) and\$event->{hostname}=\"$HOSTNAME\"" /usr/local/mariadb/var/localhost-slow.log

这时候,数据库的slow_query_log 库,里面的global_query_review_history和global_query_review这2张表已经已经有一些数据了。

4 修改anemometer配置文件及配置展示日志用的虚拟主机

# cd /data/www/web3/anemometer/conf# cp sample.config.inc.php  config.inc.php# vim config.inc.php  主要修改的地方如下2个:


配置nginx

# vim /usr/local/nginx/conf/vhost/anemometer.conf 内容如下:

server {       listen   80;       server_name  192.168.0.88;       access_log  /home/wwwlogs/anemometer.log  access;       index index.php index.html;       root  /data/web3/anemometer;       include enable-php.conf;}
# /etc/init.d/nginx reload      重载nginx配置文件


在浏览器访问http://192.168.0.88/ 即可如下图所示(这几张图片是从别人博客摘录的,他这个截图做的特别详细)

5 自动滚动日志

# vi /etc/logrotate.d/mysql

postrotatept-query-digest --user=anemometer --password=123456 \--review D=slow_query_log,t=global_query_review \--review-history D=slow_query_log,t=global_query_review_history \--no-report --limit=0% --filter=" \$event->{Bytes} = length(\$event->{arg}) and\$event->{hostname}=\"$HOSTNAME\"" /usr/local/mariadb/var/localhost-slow.logendscript


至此,我们的anemometer算是跑通了。

但是生产环境的话,我们不可能就一个节点的啊,下面就是多节点部署的问题了。



多节点mySQL监控慢查询日志


node1:192.168.2.11 MariaDB10.0.17 还部署有nginx的anemometer web前端

node2:192.168.2.12 MariaDB10.0.17

各个节点的my.cnf里面开启慢查询,相关配置如下:

[mysqld]innodb_file_per_table = ONskip_name_resolve = ONslow_query_log=ONslow_query_log_file =localhost-slow.loglong_query_time = 2


1. 安装anemometer

node1上安装到nginx的网站目录下

# cd /home/wwwroot/# git clonehttps://github.com/box/Anemometer.git anemometer# cd anemometer

node2anemometer的安装目录没什么要求

# cd /root# git clone https://github.com/box/Anemometer.gitanemometer# cd anemometer


2. 创建表和用户名

node1上执行:

# mysql -uroot -proot 

node2上执行:

# mysql -uroot -proot 


3. 在两个节点执行pt命令分析慢查询日志,并写入到各自的数据库中

node1上执行:

# pt-query-digest --user=anemometer  --password=123456--host=192.168.2.11 \--review h=192.168.2.11,D=slow_query_log,t=global_query_review\--history h=192.168.2.11,D=slow_query_log,t=global_query_review_history\--no-report --limit=0% --filter=" \$event->{Bytes} = length(\$event->{arg}) and \$event->{hostname}=\"$HOSTNAME\""localhost-slow.log

node2上执行:

# pt-query-digest --user=anemometer  --password=123456--host=192.168.2.12 \--review h=192.168.2.12,D=slow_query_log,t=global_query_review \--history h=192.168.2.12,D=slow_query_log,t=global_query_review_history \--no-report --limit=0% --filter=" \$event->{Bytes} = length(\$event->{arg}) and\$event->{hostname}=\"$HOSTNAME\"" localhost-slow.log


4. node1上配置前端

# cd /home/wwwroot/anemometer/conf# cp sample.config.inc.php  config.inc.php# vim config.inc.php  主要修改的地方如下2个【conf项,plugins项】:
$conf['datasources']['192.168.2.11'] = array(        'host' => '192.168.2.11',        'port' => 3306,        'db'   => 'slow_query_log',        'user' => 'anemometer',        'password' => '123456',        'tables' => array(                'global_query_review' =>'fact',                'global_query_review_history'=> 'dimension'        ),        'source_type' => 'slow_query_log'); $conf['datasources']['192.168.2.12'] = array(        'host' => '192.168.2.12',        'port' => 3306,        'db'   => 'slow_query_log',        'user' => 'anemometer',        'password' => '123456',        'tables' => array(                'global_query_review' =>'fact',                'global_query_review_history'=> 'dimension'        ),        'source_type' => 'slow_query_log'); $conf['plugins'] = array(    ...省略代码...       $conn['user'] = 'anemometer';       $conn['password'] = '123456';    ...省略代码...


# /etc/init.d/nginx restart   重启Nginx

Chrome查看http://192.168.2.11/ 如下图所示


5. 下面是我自己写pt分析慢查询日志的脚本

(anemometer提供的那个个人感觉用不惯,自己照着写了个更简单的)

vim /home/scripts/pt-digest.sh 内容如下:

#!/bin/bash# 我这里直接把配置写死了,觉得不太好的话大家可以参考其它文章将数据库的连接配置独立出来 # 慢查询日志存放的目录SQL_DATADIR="/usr/local/mariadb/var" # 慢查询日志的文件名(basename)SLOW_LOG_FILE=$( mysql -uroot -proot -e " show global variables like'slow_query_log_file'" | tail-n1 | awk '{ print $2 }' ) # 获取本机IP地址IP_ADDR=$(/sbin/ifconfig | grep'inet addr'  | egrep '172.|192.' | awk'{print $2}' | awk -F ":" '{print $2}') cp $SQL_DATADIR/$SLOW_LOG_FILE/tmp/ # 分析日志并存入slow_query_log这个数据库/usr/local/bin/pt-query-digest --user=anemometer --password=123456 --host=$IP_ADDR \ --review h=$IP_ADDR,D=slow_query_log,t=global_query_review\ --history h=$IP_ADDR,D=slow_query_log,t=global_query_review_history\ --no-report --limit=0% --filter="\$event->{Bytes} = length(\$event->{arg}) and\$event->{hostname}=\"$HOSTNAME\"" /tmp/$SLOW_LOG_FILE rm -f /tmp/$SLOW_LOG_FILE

调试通过以后,crontab添加如下命令实现定期采集慢查询日志到数据库存储

59 23 * * * /bin/bash /home/scripts/pt-digest.sh> /dev/null

这样每天就能自动分析采集慢查询日志了。

另外,慢查询日志建议按天切分,这样用pt-query-digest进行SQL慢查询日志统计的时候就避免重复分析了。慢查询按天切分的脚本如下:


Tips下面是慢查询日志切分脚本:

下面是一个轮询切割mySQL慢查询和错误日志的脚本(/home/scripts/mysql_log_rotate):

"/usr/local/mariadb/var/localhost-slow.log""/usr/local/mariadb/var/localhost_err" {     create 660 mariadb mariadb      # 这个文件权限和属主属组需要根据自己的情况修改   dateext   notifempty   daily   maxage 60   rotate 30   missingok   olddir /usr/local/mariadb/var/oldlogs  # 这个目录不存在的话,要自己先新建好,并修改属主为mariadb    postrotate        if /usr/local/mariadb/bin/mysqladminping -uroot -proot &>/dev/null; then            /usr/local/mariadb/bin/mysqladminflush-logs -uroot -proot        fi   endscript}



再配置个CRONTAB

00 00 * * * (/usr/sbin/logrotate-f /home/scripts/mysql_log_rotate >/dev/null 2>&1)

这样的话,每天慢查询日志、错误日志就自动存储到/usr/local/mariadb/var/oldlogs/这个目录下了。


日志 查询 配置 数据 数据库 节点 分析 目录 文件 脚本 代码 内容 前端 命令 地方 文章 用户 用户名 错误 参考 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 济源软件开发解决方案 龙之谷手游搭建服务器未就绪 软件开发中心化思想 数据库设计医药销售 江西省八号互联网科技 软件开发和测试前景 网络安全发布话题 云顶之弈手游验证服务器出错 数据库技术应用心得体会 网络安全警察公务员工资待遇 广州灵飞网络技术有限公司加班 linux服务器优惠 变更控制是软件开发模式 网络安全规定从事危害 c 软件开发简历范文 服务器和网站有什么不同 网络安全渗透不出来怎么办 基础电信企业网络安全的战略 多线程查询数据库慢 易语言采集软件开发教程 环境工程的网络安全应用事例 圣堡动漫网络技术招聘 qq机器人服务器 SSD服务器硬盘数据安全性 上海机械软件开发哪家好 海康威视网络视频服务器 电力网络安全警示教育片视频 软件开发工程师T10 超凡先锋连接不上服务器什么意思 上海雨人软件开发有限公司
0