搭建Anemometer框架
前置工作:
1.關(guān)閉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.確保時(shí)間準(zhǔn)確(非必須)
yum install -y ntp ntpdate
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime?#修改時(shí)區(qū)為東8區(qū)
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區(qū)
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.確認(rèn)Mysql慢日志已經(jīng)打開
部署工作
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以上的版本,否則報(bào)錯(cuò);
安裝環(huán)境的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.修改配置,啟動(dòng)php(不修改時(shí)區(qū)的話,啟動(dòng)httpd時(shí)會(huì)報(bào)500的錯(cuò))
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端口,需要在這里配上其他端口號(hào))
6.執(zhí)行建庫腳本
cd?/var/www/html/anemometer
mysql -uroot -p密碼 < install.sql
在執(zhí)行上面這一步的操作的時(shí)候,出現(xiàn)了一個(gè)報(bào)錯(cuò)

這個(gè)報(bào)錯(cuò)是因?yàn)楸碇械膖s_min這一項(xiàng)default為0,這和sql_mode有關(guān)

查看系統(tǒng)中的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';

修改完成后,可以正常導(dǎo)入
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.將慢日志導(dǎo)入庫中(因?yàn)檫@里的pt版本為2.2.14,所以采用大于2.2版本的語句;小于2.2版本的語句自行度娘)
pt-query-digest --user=anemometer --password=密碼 --review h=主機(jī)名或者主機(jī)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
上面標(biāo)黑的3處注意參照實(shí)際情況填寫
如果不是默認(rèn)端口,需要采用下面這個(gè)語句(加入P參數(shù))
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的框架就完成了
接下來才是核心部分--數(shù)據(jù)入庫
8.進(jìn)一步配置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行,其實(shí)這個(gè)port改不改無所謂)
$conn['host'] = $sample['hostname_max'];
...
$conn['user'] = 'anemometer';? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? --(第285行)
$conn['password'] = '密碼';
return $conn;
...
修改第二處:
vim /var/www/html/anemometer/conf/datasource_localhost.inc.php(這個(gè)文件就只有這么一小段)
$conf['datasources']['192.168.40.200'] = array(
? ? ? ? 'host'? => '192.168.40.200',
? ? ? ? 'port'? => 3306,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(測(cè)試了一下,這里也可以不改)
? ? ? ? 'db'? ? => 'slow_query_log',
? ? ? ? 'user'? => 'anemometer',
? ? ? ? 'password' => '密碼',
? ? ? ? 'tables' => array(
? ? ? ? ? ? ? ? 'global_query_review' => 'fact',
? ? ? ? ? ? ? ? 'global_query_review_history' => 'dimension'
? ? ? ? ),
? ? ? ? 'source_type' => 'slow_query_log'
);
在早期的版本中,這2個(gè)配置似乎是在一個(gè)php文件下的,在我下載的這個(gè)版本里面卻是分別配置的,一個(gè)是plugin插件,還有一個(gè)作為連接用;經(jīng)測(cè)試,2個(gè)php文件下的端口項(xiàng)似乎都是可有可無,保險(xiǎn)起見我這里還是寫成我修改的端口13306.
9.啟動(dòng)apache
service httpd start
打開剛才發(fā)布的網(wǎng)頁http://192.168.40.200/anemometer
配置腳本自動(dòng)導(dǎo)入以及多庫監(jiān)控
通過該腳本,anemometer會(huì)在一段時(shí)間內(nèi)打開slow.log,并記錄這段時(shí)間內(nèi)打開slow.log,隨后將這段時(shí)間內(nèi)的slow.log導(dǎo)入slow_query_log中。
需要用到3個(gè)配置文件
1.anemometer_collect.sh
這個(gè)腳本位于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? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(如果改變了端口,這里必須配置)
賬號(hào)的授權(quán)
這里圖省事,不管是localhost還是%,我都授予了super權(quán)限

添加計(jì)劃任務(wù)如下
*/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
多庫的監(jiān)控
首先每個(gè)庫都在本地按照上面所寫配置好腳本,確保slow.log可以導(dǎo)入到本地的庫中
多庫監(jiān)控只需要在anemometer里面配置一個(gè)地方
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'
);
需要監(jiān)控多少庫,后面就增加多少庫的配置就行了
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Done
報(bào)錯(cuò)一例:
在另一臺(tái)機(jī)器上對(duì)pt-query-digest進(jìn)行安裝,安裝完成后,執(zhí)行pt-query-digest,出現(xiàn)報(bào)錯(cuò)
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
網(wǎng)上的各種說法是perl-DBI或者perl-DBD版本不夠新,需要進(jìn)行重裝;
然而發(fā)現(xiàn)perl-DBI和DBD都和之前一臺(tái)完全一致;后來發(fā)現(xiàn)老外對(duì)于這個(gè)問題的討論提到了mysql-libs,對(duì)mysql-libs進(jìn)行比較,發(fā)現(xiàn)2臺(tái)機(jī)器的mysql-libs都是默認(rèn)的,版本也一致;抱著死馬當(dāng)活馬醫(yī)的心態(tài),重新執(zhí)行了yum install mysql-libs -y.....發(fā)現(xiàn)居然進(jìn)行了update?。?臺(tái)機(jī)器的os版本一致,mysql版本一致,pt-query-digest版本也一致!估計(jì)是這臺(tái)機(jī)器以前執(zhí)行過某些操作,對(duì)mysql-libs有一些影響)
更新完成后,問題完美解決