MySQL(总)

Mysql性能剖析工具--Anemometer部署(完结)

2018-03-08  本文已影响14人  飞翔的Tallgeese

搭建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

上一篇下一篇

猜你喜欢

热点阅读