Mysql性能剖析工具--Anemometer部署(完结)
搭建Anemometer框架
前置工作:
1.关闭selinux
setenforce 0
sed -i 's/enforcing/disabled/g' /etc/sysconfig/selinux
2.打开防火墙的443,3306,80端口
iptables -I INPUT -p tcp --dport 443 -j ACCEPT
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
service iptables save
3.确保时间准确(非必须)
yum install -y ntp ntpdate
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime #修改时区为东8区
cp: overwrite `/etc/localtime'? y
service ntpdate start
ntpdate: Synchronizing with time server: [ OK ]
[root@Master01 ~]# date -R
Tue, 30 Jan 2018 14:45:34 +0800#+0800是东8区
chkconfig ntpdate on
4.下载anemometer到linux下,修改名字为anemometer
下载路径:https://github.com/box/Anemometer
5.确认Mysql慢日志已经打开
部署工作
1.安装核心组件pt_query_digest(2.2.14版本)
yum install perl-DBI perl-DBD perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL perl-TermReadKey -y
wget --no-check-certificate https://www.percona.com/downloads/percona-toolkit/2.2.14/RPM/percona-toolkit-2.2.14-1.noarch.rpm
yum install -y percona-toolkit-2.2.14-1.noarch.rpm
2.安装php
注意php必须是5.33以上的版本,否则报错;
安装环境的OS是CentOS6.8,所以直接yum安装的php就是5.33版本
yum install -y php php-mysql php-gd libjpeg* php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc php-mbstring php-mcrypt php-bcmath php-mhash libmcrypt libmcrypt-devel php-fpm php-dba
3.安装httpd
yum install -y httpd
4.修改配置,启动php(不修改时区的话,启动httpd时会报500的错)
vi /etc/php.ini
date.timezone = Asia/Shanghai
service php-fpm start
5.初步配置anemometer
cp -r anemometer /var/www/html/
vi /etc/httpd/conf/httpd.conf
添加ServerName 192.168.40.200:80(anemometer的IP,如果不采用80端口,需要在这里配上其他端口号)
6.执行建库脚本
cd /var/www/html/anemometer
mysql -uroot -p密码 < install.sql
mysql -uroot -p密码
mysql > grant all on slow_query_log.* to 'anemometer'@'%' identified by '密码';
mysql > grant select on *.* to 'anemometer'@'%';
mysql > grant all on slow_query_log.* to 'anemometer'@'localhost';
mysql > grant select on *.* to 'anemometer'@'localhost';
7.将慢日志导入库中(因为这里的pt版本为2.2.14,所以采用大于2.2版本的语句;小于2.2版本的语句自行度娘)
pt-query-digest --user=anemometer --password=密码 --review h=主机名或者主机IP,D=slow_query_log,t=global_query_review no-report --limit=0% --filter=" \$event->{Bytes} = length(\$event->{arg}) and \$event->{hostname}=\"$HOSTNAME\"" /usr/local/mysql/log/slow.log
上面标黑的3处注意参照实际情况填写
8.进一步配置anemometer
cd /var/www/html/anemometer/conf/
修改第一处:
cp sample.config.inc.php config.inc.php
vim /var/www/html/anemometer/conf/config.inc.php (大约在285行)
...
'explain' => function ($sample) {
$conn['user'] = 'anemometer';
$conn['password'] = '密码';
return $conn;
...
修改第二处:
vim /var/www/html/anemometer/conf/datasource_localhost.inc.php(这个文件就只有这么一小段)
$conf['datasources']['192.168.40.200'] = array(
'host' => '192.168.40.200',
'port' => 3306,
'db' => 'slow_query_log',
'user' => 'anemometer',
'password' => '密码',
'tables' => array(
'global_query_review' => 'fact',
'global_query_review_history' => 'dimension'
),
'source_type' => 'slow_query_log'
);
PS:网上部分写的很早的文章在这里有坑,那时候/var/www/html/anemometer/conf/下没有datasource_localhost.inc,所以数据库的相关conf配置在cp出来的config.inc.php 里面,但是2.2.14版本的anemometer的config.inc.php 下面关于数据库的相关配置已经改变了,因此无法直接去进行修改。
如果需要配置多个db,也是在这个文件下进行修改
9.启动apache
service httpd start
打开刚才发布的网页http://192.168.40.200/anemometer
##################################
报错一例:
在另一台机器上对pt-query-digest进行安装,安装完成后,执行pt-query-digest,出现报错
install_driver(mysql) failed: Attempt to reload DBD/mysql.pm aborted.
Compilation failed in require at (eval 5) line 3.
at /usr/bin/pt-show-grants line 1338
网上的各种说法是perl-DBI或者perl-DBD版本不够新,需要进行重装;
然而发现perl-DBI和DBD都和之前一台完全一致;后来发现老外对于这个问题的讨论提到了mysql-libs,对mysql-libs进行比较,发现2台机器的mysql-libs都是默认的,版本也一致;抱着死马当活马医的心态,重新执行了yum install mysql-libs -y.....发现居然进行了update!(2台机器的os版本一致,mysql版本一致,pt-query-digest版本也一致!估计是这台机器以前执行过某些操作,对mysql-libs有一些影响)
更新完成后,问题完美解决
##################################
配置脚本自动导入以及多库监控
通过该脚本,anemometer会在一段时间内打开slow.log,并记录这段时间内打开slow.log,随后将这段时间内的slow.log导入slow_query_log中。
需要用到3个配置文件
1.anemometer_collect.sh
这个脚本位于anemometer文件夹的scripts下,如果没有特别的定制需求,涉及到的修改不多,只需要把mysql的路径写明一下(在脚本中加入黑体部分即可)
cat /var/www/html/anemometer/scripts/anemometer_collect.sh|grep PATH
PATH=/usr/local/mysql/bin/:$PATH
2.配置本地读取的cnf
cat /var/www/html/anemometer/scripts/anemometer.local.cnf
[client]
user=anemometer_local
password=密码
3.配置写入的cnf
cat /var/www/html/anemometer/scripts/anemometer.remote.cnf
cat /var/www/html/anemometer/scripts/anemometer.remote.cnf
[client]
user=anemometer
password=密码
数据库的配置
首先说一下对于上面最后2个配置的理解
最后那个配置涉及到anemometer和其密码配置,个人理解这个账号主要是用来写数据库的,及把slow.log的内容,写入到slow_query_log库的对应表中的操作就是这个账号来完成的;
倒数第二个配置中,有一个anemometer_loca的账户,个人理解这个账户是用来读取库中内容的,anemometer的web通过这个local账号把slow_query_log库中的相关数据读出,(并进行一定的逻辑select,最后把用户想要看到的统计)通过web展示给用户;
2个配置中的账号密码,均是数据库的账号密码!(之前网上有篇坑货文章在这写的系统密码,结果我把user写成root之后,在页面上显示的全都是root用户在库里的后台操作,什么自动commit之类的全记录进去了,对业务表的操作全都不记录,害我找了好久的原因);
另外,这个anemometer-remote.cnf并不是表示本地库会通过这个cnf去读取远端的其他库;我一开始也看到网上有文章说本地库要去读远端库,还要在本地库建库来存远端库读过来的数据什么的.... 实际上所有的库的local和remote都是读的本地的slow_query_log这个库,个人理解只是一个负责读并且统计,另一个负责把slow.log写进库里罢了;真正需要调用远端库的,实际上只是anemometer这个web而已,一个简单的配置,直接调用对应的数据库就实现了分别的监控。
言归正传
anemometer这个用户已经存在了,之前的授权也已经做过了,所以这里不需要额外配置;权限如下
mysql> show grants for anemometer;
+------------------------------------------------------------------------------------------------------------+
| Grants for anemometer@% |
+------------------------------------------------------------------------------------------------------------+
| GRANT SELECT ON *.* TO 'anemometer'@'%' IDENTIFIED BY PASSWORD '*64C0BB808C74C880011FED07CE57DC4894693353' |
| GRANT ALL PRIVILEGES ON `slow_query_log`.* TO 'anemometer'@'%' |
+------------------------------------------------------------------------------------------------------------+
而anemometer_local这个账户需要新创建,授权如下;
注意,这个anemometer_local需要super权限,否则在执行脚本的时候,会有报错
mysql> show grants for anemometer_local;
+-----------------------------------------------------------------------------------------------------------------+
| Grants for anemometer_local@% |
+-----------------------------------------------------------------------------------------------------------------+
| GRANT SUPER ON *.* TO 'anemometer_local'@'%' IDENTIFIED BY PASSWORD '*64C0BB808C74C880011FED07CE57DC4894693353' |
+-----------------------------------------------------------------------------------------------------------------+
计划任务如下
*/1 * * * * /var/www/html/anemometer/scripts/anemometer_collect.sh --interval 59 --history-db-host 192.168.40.200 --defaults-file /var/www/html/anemometer/scripts/anemometer.local.cnf --history-defaults-file /var/www/html/anemometer/scripts/anemometer.remote.cnf
计划任务也说一下吧
首先建议cnf都别放在/etc下面,因为都知道那下面有my.cnf;个人在操作监控多库的时候,把anemometer的几个cnf到处scp,图省事直接scp -r /etc/*.cnf /etc 这样操作了,结果就是my.cnf也过去了,还好测试库的配置都一样,要是正式库后果不堪设想
然后这个脚本需要在每个需要监控库的服务器里存在一份,并做相同的计划任务,host当然就是每个库对应的那个
最后...没有=号这种写法,网上有篇文章写的格式是这样的
sudo scripts/anemometer_collect.sh --interval 30 \
--history-db-host=anemometer.example.com \
--defaults-file=etc/anemometer.local.cnf \
--history-defaults-file=etc/anemometer.remote.cnf
结果可想而知...
多库的监控
首先每个库都在本地按照上面所写配置好脚本,确保slow.log可以导入到本地的库中
多库监控只需要在anemometer里面配置一个地方
vim /var/www/html/anemometer/conf/datasource_localhost.inc.php
'192.168.40.200',
'port' => 3306,
'db' => 'slow_query_log',
'user' => 'anemometer',
'password' => '密码',
'tables' => array(
'global_query_review' => 'fact',
'global_query_review_history' => 'dimension'
),
'source_type' => 'slow_query_log'
);
$conf['datasources']['192.168.40.130'] = array(
'host' => '192.168.40.130',
'port' => 3306,
'db' => 'slow_query_log',
'user' => 'anemometer',
'password' => '密码',
'tables' => array(
'global_query_review' => 'fact',
'global_query_review_history' => 'dimension'
),
'source_type' => 'slow_query_log'
);
需要监控多少库,后面就增加多少库的配置就行了
Done