搭建Anemometer框架
前置工作:
1.关闭selinux
setenforce 0
sed -i 's/enforcing/disabled/g' /etc/sysconfig/selinux
2.打开防火墙的443,13306,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 13306 -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
yum install -y unzip
wget https://github.com/box/Anemometer/archive/develop.zip
unzip develop.zip
mv Anemometer-develop 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的错)
vim /etc/php.ini
date.timezone = Asia/Shanghai
service php-fpm start
5.初步配置anemometer
cp -r anemometer /var/www/html/
vim /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
在执行上面这一步的操作的时候,出现了一个报错
这个报错是因为表中的ts_min这一项default为0,这和sql_mode有关
查看系统中的sql_mode
set global sql_mode='ONLY_FULL_GROUP_BY,NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
修改完成后,可以正常导入
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,P=端口,D=slow_query_log,t=global_query_review no-report --limit=0% --filter=" \$event->{Bytes} = length(\$event->{arg}) and \$event->{hostname}=\"$HOSTNAME\"" /data/mysql/mysql3306/data/slow.log
上面标黑的3处注意参照实际情况填写
如果不是默认端口,需要采用下面这个语句(加入P参数)
pt-query-digest --user=anemometer --password=密码 --review h=172.17.100.88,P=13306,D=slow_query_log,t=global_query_review no-report --limit=0% --filter=" \$event->{Bytes} = length(\$event->{arg}) and \$event->{hostname}=\"$HOSTNAME\"" /data/mysql/mysql3306/data/slow.log
完成前面的操作,anemometer的框架就完成了
接下来才是核心部分--数据入库
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
...
$conf['plugins'] = array(
...
'explain' => function ($sample) {
$conn['port'] = 13306; --(第269行,其实这个port改不改无所谓)
$conn['host'] = $sample['hostname_max'];
...
$conn['user'] = 'anemometer'; --(第285行)
$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'
);
在早期的版本中,这2个配置似乎是在一个php文件下的,在我下载的这个版本里面却是分别配置的,一个是plugin插件,还有一个作为连接用;经测试,2个php文件下的端口项似乎都是可有可无,保险起见我这里还是写成我修改的端口13306.
9.启动apache
service httpd start
打开刚才发布的网页http://192.168.40.200/anemometer
配置脚本自动导入以及多库监控
通过该脚本,anemometer会在一段时间内打开slow.log,并记录这段时间内打开slow.log,随后将这段时间内的slow.log导入slow_query_log中。
需要用到3个配置文件
1.anemometer_collect.sh
这个脚本位于anemometer文件夹的scripts下,如果没有特别的定制需求,涉及到的修改不多,只需要把mysql的路径写明一下(在脚本中加入黑体部分即可)
vim /var/www/html/anemometer/scripts/anemometer_collect.sh
添加
PATH=/usr/local/mysql/bin/:$PATH
2.配置本地读取的cnf
cat /var/www/html/anemometer/scripts/anemometer.local.cnf
[client]
user=anemometer
password=密码
host=localhost
socket=/tmp/mysql3306.sock
3.配置写入的cnf
cat /var/www/html/anemometer/scripts/anemometer.remote.cnf
[client]
user=anemometer
password=密码
port=13306 (如果改变了端口,这里必须配置)
账号的授权
这里图省事,不管是localhost还是%,我都授予了super权限
添加计划任务如下
*/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
多库的监控
首先每个库都在本地按照上面所写配置好脚本,确保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
报错一例:
在另一台机器上对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有一些影响)
更新完成后,问题完美解决