MySQLMTOP是一个由Python+PHP开发的MySQL企业级监控系统。系统由Python实现多进程数据采集和告警,PHP实现WEB展示和管理。最重要是MySQL服务器无需安装任何Agent,只需在监控WEB界面配置相关数据库信息,功能非常强大:
可对上百台MySQL数据库的状态、连接数、QTS、TPS、数据库流量、复制、性能等进行时时监控
能在数据库偏离设定的正常运行阀值(如连接异常,复制异常,复制延迟) 时发送告警邮件通知到DBA进行处理
对历史数据归档,通过图表展示出数据库近期状态,以便DBA和开发人员能对遇到的问题进行分析和诊断
系统主要由仪表盘、状态监控、进程监控、复制监控、慢查询分析、性能图表、工具组件、告警事件、系统资源等子系统组成,每个子系统负责完成特定信息的采集和展示
一、系统安装需求
MySQL MTOP由PHP和Python开发,所以监控机需要安装PHP运行环境和Python环境。需要的核心包如下:
1.MySQL 5.0及以上(用来存储监控系统采集的数据)
2.Apache 2.2及以上 (WEB服务器运行服务器)
3.PHP 5.3以上 (WEB界面)
4.Python2 (推荐2.7版本,其他版本未做测试,执行数据采集和报警任务)
5.MySQLdb for python (Python连接MySQl的接口)
二、 安装必备的开发包
yum -y install ntp gcc gcc-c++ flex bison autoconf automake bzip2-devel ncurses-devel zlib-devel libjpeg-devel libpng-devel libtiff-devel freetype-devel libXpm-devel gettext-devel pam-devel libtool libtool-ltdl openssl openssl-devel fontconfig-devel libxml2-devel curl-devel libicu libicu-devel libmcrypt libmcrypt-devel libmhash libmhash-devel
三、同步系统时间:
vim /etc/ntp.conf //添加下面三行内容
同步时间,重启ntp服务
[root data]$ service ntpd stop
[root data]$ ntpdate cn.pool.ntp.org
[root data]$ chkconfig ntpd on
四、进制apache安装,版本要2.2及以上
[root src]$ wget http://archive.apache.org/dist/httpd/httpd-2.2.19.tar.gz
[root src]$ tar xvf httpd-2.2.19.tar.gz
[root src]$ cd httpd-2.2.19
[root src]$ ./configure --prefix=/usr/local/apache --enable-so --enable-rewrite --enable-mods-shared=most --sysconfdir=/etc/httpd
[root httpd-2.2.19]$ make && make install
[root httpd-2.2.19]$ cp /usr/local/apache/bin/apachectl /etc/init.d/httpd
[root httpd-2.2.19]$ service httpd start
[root httpd-2.2.19]$chkconfig --add httpd
[root httpd-2.2.19]$chkconfig httpd on
[root httpd-2.2.19]$ netstat -tnl |grep httpd
tcp 0 0 :::80 :::* LISTEN 24810/httpd
五、进行MySQL安装
#!/bin/bash
#-------------------------------
#this install mysql for test ues
#定义变量
soft_path=/usr/local/src
mysql_pack=mysql-5.5.40-linux2.6-x86_64.tar.gz
mysql_version=`echo "mysql-5.5.40-linux2.6-x86_64.tar.gz"|cut -d - -f1,2`
mysql_user=mysql
mysql_port=3306
mysql_passwd=123456
install_path=/usr/local
mysql_path=/usr/local/${mysql_version}
mysql_data_path=/data/${mysql_version}/data
#创建用户、赋权、安装
groupadd ${mysql_user}
if [ $? -ne 0 ]
then
echo "this user ${mysql_user} is exist!!"
exit 1
fi
useradd -r -g ${mysql_user} ${mysql_user}
cd ${soft_path}
if [ ! -e ${mysql_pack} ]
then
echo "install pack is not exist!!"
exit 1
fi
tar zxvf ${mysql_pack} -C ${install_path}
cd ${install_path} && mv ${mysql_version}-* ${mysql_version}
chown -R root:${mysql_user} ${mysql_path}
cd ${mysql_path} && cp support-files/my-large.cnf ${mysql_path}/my.cnf
mkdir -p /data/${mysql_version}
chown -R ${mysql_user}:${mysql_user} /data/${mysql_version}
#修改my.cnf
sed -i "/3306/{x;s/^/./;/^.\{2\}$/{x;s/3306/${mysql_port}/;b};x}" ${mysql_path}/my.cnf
sed -i "/socket/{x;s/^/./;/^.\{2\}$/{x;s#/tmp/mysql.sock#/data/${mysql_version}/mysql.sock#;b};x}" ${mysql_path}/my.cnf
sed -i "/\/data\/${mysql_version}\/mysql.sock/a\datadir = ${mysql_data_path}" ${mysql_path}/my.cnf
sed -i "/datadir/a\basedir = ${mysql_path}" ${mysql_path}/my.cnf
sed -i "/basedir/a\user = ${mysql_user}" ${mysql_path}/my.cnf
sed -i "/innodb_buffer_pool_size/s/^#//" ${mysql_path}/my.cnf
#初始化
cd ${mysql_path}
yum install libaio -y
scripts/mysql_install_db --user=${mysql_user} --defaults-file=${mysql_path}/my.cnf
if [ $? -ne 0 ]
then
echo -e "\e[1;31m[MySQL install init failure...]\e[0m"
exit 1
fi
#添加启动关闭脚本
cat >>shutdown_mysql.sh<<EOF
#!/bin/bash
${mysql_path}/bin/mysqladmin --defaults-file=${mysql_path}/my.cnf -uroot -p${mysql_passwd} -S /data/${mysql_version}/mysql.sock shutdown
EOF
cat >>start_mysql.sh<<EOF
#! /bin/sh
nohup ${mysql_path}/bin/mysqld_safe --defaults-file=${mysql_path}/my.cnf >> ${mysql_path}/start_stop.log 2>&1 &
EOF
#启动MySQL
chmod +x shutdown_mysql.sh start_mysql.sh && sh start_mysql.sh
sleep 50
ps -aux |grep -v grep |grep ${mysql_port} &> /dev/null
if [ $? -ne 0 ]
then
echo -e "\e[1;31m[MySQL start failure...]\e[0m"
exit 1
else
echo -e "\e[1;32m[MySQL start secessful]\e[0m"
fi
#修改密码
${mysql_path}/bin/mysqladmin -uroot password "${mysql_passwd}" -S /data/${mysql_version}/mysql.sock
六、进行PHP安装
[root src]$wget http://softlayer.dl.sourceforge.net/sourceforge/mcrypt/libmcrypt-2.5.8.tar.gz[root src]$ tar zxf libmcrypt-2.5.8.tar.gz
[root src]$ cd libmcrypt-2.5.8
[root libmcrypt-2.5.8]$ ./configure --prefix=/usr/local && make && make install
下载PHP并安装,版本要5.3以上,要注意的是,php安装涉及了你安装apache和mysql的路径,这个要特别注意的:
[root src]$ wget http://cn2.php.net/distributions/php-5.5.19.tar.gz
[root src]$ tar zxf php-5.5.19.tar.gz
[root src]$ cd php-5.5.19
[root php-5.5.19]$./configure --prefix=/usr/local/php \
--mandir=/usr/local/share/man \
--infodir=/usr/local/share/info \
--with-apxs2=/usr/local/apache/bin/apxs \
--enable-cgi --with-mysql=/usr/local/mysql-5.6.10/ \
--with-config-file-path=/usr/local/php/etc \
--with-pdo-mysql=/usr/local/mysql-5.6.10 \
--with-mysqli=/usr/local/mysql-5.6.10/bin/mysql_config \
--enable-zip --enable-sqlite-utf8 -enable-sockets \
--enable-soap --enable-pcntl --enable-mbstring \
--enable-intl --enable-calendar --enable-bcmath \
--enable-exif --with-mcrypt --with-mhash --with-gd \
--with-png-dir --with-jpeg-dir --with-freetype-dir \
--with-libxml-dir --with-curl --with-curlwrappers \
--with-zlib --with-openssl --with-kerberos=shared \
--with-gettext=shared --with-xmlrpc=shared
[root php-5.5.19]$ make && make install
拷贝配置文件:
[root php-5.5.19]$ cp php.ini-production /usr/local/php/etc/php.ini
修改apache的配置文件:
[root php-5.5.19]$ vim /usr/local/apache/conf/httpd.conf
添加以下内容:
查找AddType application/x-gzip .gz .tgz,在该行下面添加 AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps 查找DirectoryIndex index.html 把该行修改成 DirectoryIndex index.html index.htm index.php
重启apache服务,在/usr/local/apache/htdocs/下vim index.php,操作如下:
[root htdocs]$ service httpd restart
[root htdocs]$ pwd
/usr/local/apache/htdocs
[root htdocs]$ cat index.php
<?php
phpinfo();
?>
在防火墙里添加80端口,并重启,然后请问index.php:
http://ip/index.php,如果得到下图,意味着apache整合php成功了
六、进行python安装,推荐2.7版本,其他版本未做测试,执行数据采集和报警任务
[root src]$ wget http://www.python.org/ftp/python/2.7.2/Python-2.7.2.tar.bz2
[root src]$ tar jxf Python-2.7.2.tar.bz2
[root src]$ cd Python-2.7.2
[root Python-2.7.2]$ ./configure --prefix=/usr/local/Python2.7 --enable-shared make && make install
[root Python-2.7.2]$ mv /usr/bin/python /usr/bin/pythonbak
[root Python-2.7.2]$ ln -sf /usr/local/Python2.7/bin/python /usr/bin/python
查看Python版本,如果报少了库文件,vim /etc/ld.so.conf添加/usr/local/Python2.7/lib,执行ldconfig刷新配置文件
[root Python-2.7.2]$ python -V
python: error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory
[root Python-2.7.2]$ cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
/usr/local/Python2.7/lib
[root Python-2.7.2]$ ldconfig
[root Python-2.7.2]$ python -V
Python 2.7.2
如果python升级到2.7以后出现yum无法使用的情况,错误为No module named yum,请按照如下步骤处理,将yum使用的python版本改为旧版本,第一行修改为如下即可:
[root htdocs]$ vim /usr/bin/yum
#!/usr/bin/python2.6
七、安装MySQLdb for python
[root src]$ wget [root src]$ unzip MySQLdb-python.zip
[root src]$ cd MySQLdb1-master
[root MySQLdb1-master]$ vim site.cfg
添加你安装的mysql路径下的mysql_config:
which mysql_config
添加完再执行python setup.py build可能报以下错:
[root MySQLdb1-master]$ python setup.py build error: command 'gcc' failed with exit status 1
解决方法:
[root MySQLdb1-master]$ yum install gcc python-devel
再执行安装:
[root MySQLdb1-master]$ python setup.py build [root MySQLdb1-master]$ python setup.py install
基本环境已经安装OVER了,下面去官网下载开源的管理软件包:http://www.lepus.cc/soft/index,要注册账号的
八、安装MySQL MTOP系统
https://gitee.com/feihu/MySQLMTOP
监控机创建监控数据库,并授予权限,导入SQL文件
mysql> create database mysqlmtop default character set utf8;
Query OK, 1 row affected (0.07 sec)
mysql> grant select,insert,update,delete,create,drop on mysqlmtop.* to 'mtop_user'@'localhost' identified by 'password';
Query OK, 0 rows affected (0.04 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.02 sec)
[root src]$ unzip MySQLMTOP.zip
[root src]$ cd mysqlmtop2.2
[root sql]$ pwd/usr/local/src/mysqlmtop2.2/sql
[root sql]$ lsmysqlmtop_data.sql mysqlmtop.sql
监控机(即MySQL MTOP server)创建监控数据库,并授予权限,导入SQL文件夹里的SQL文件(表结构和数据文件):
[root sql]$ mysql -uroot -p123456 -S /data/mysql-5.6.10/mysql.sock mysqlmtop < ./mysqlmtop.sql
[root sql]$ mysql -uroot -p123456 -S /data/mysql-5.6.10/mysql.sock mysqlmtop < ./mysqlmtop_data.sql
[root sql]$ mv /usr/local/src/mysqlmtop2.2 /usr/local/mysqlmtop
对被监控的数据库进行授权
在python采集数据的过程中,需要连接到需要监控的数据库服务器采集数据,我们为了安全考虑,在WEB管理里面只要求录入主机和端口,没有录入账号和密码。所有需要监控的数据库请授予相同的用户密码记录在配置文件中。授权如下所示:
grant select,super,process on *.* to 'monitor'@'ip' identified by 'monitor';
九、安装数据采集和报警系统
修改监控系统配置文件,进到/usr/local/mysqlmtop/mysqlmtop/etc,修改config.ini
授予可执行文件执行权限
[root mysqlmtop]$ pwd/usr/local/mysqlmtop/mysqlmtop
[root mysqlmtop]$ chmod +x *.py
[root mysqlmtop]$ chmod +x *.sh[root mysqlmtop]$ chmod +x mtopctl
[root mysqlmtop]$ ln -s /usr/local/mysqlmtop/mysqlmtop/mtopctl /usr/local/bin/
测试MySQL连接,报错了
[root mysqlmtop]$ ./test_mysql.py Traceback (most recent call last): File "./test_mysql.py", line 6, in <module> import MySQLdb File "/usr/lib64/python2.6/site-packages/MySQL_python-1.2.4-py2.6-linux-x86_64.egg/MySQLdb/__init__.py", line 19, in <module> import _mysql ImportError: libmysqlclient.so.18: cannot open shared object file: No such file or directory
解决方法:
如果是64系统则:
[root mysqlmtop]$ ln -s /usr/local/mysql-5.6.10/lib/libmysqlclient.so.18 /usr/lib64/libmysqlclient.so.18
如果是32位系统:
[root mysqlmtop]$ ln -s /usr/local/mysql-5.6.10/lib/libmysqlclient.so.18 /usr/lib/libmysqlclient.so.18
如果是通过socket文件连接MySQL的话 可能会报以下错:
mysql_exceptions.OperationalError: (2002, "Can't connect to local MySQL server through socket '/tmp/mysql.sock' (111)")
添加一下链接:
[root mysqlmtop]$ ln -s /data/mysql-5.6.10/mysql.sock /tmp/mysql.sock
再执行测试脚本,看到OK就正常连接成功了:
[root mysqlmtop]$ ./test_mysql.py MySQLDB OK!
修改下启动脚本mtopctl(注意路径),再启动监控系统(注意:只有监控进程运行时系统才会进行监控和报警)
启动:
[root mysqlmtop]$ mtopctl start nohup: 把输出追加到"nohup.out" mysql mtop start success!
使用--help查看监控系统进程管理参数,分别有start、stop、status
[root mysqlmtop]$ mtopctl --help
mysql mtop help:
support-site:www.mtop.cc www.ruzuojun.com
====================================================================
start Start mysql mtop monitor server; Command: #mtopctl start
stop Stop mysql mtop monitor server; Command: #mtopctl stop
status Check mysql mtop monitor run status; Command: #mtopctl status
十、安装WEB管理界面
把/usr/local/mysqlmtop/frontweb下的所有文件传到apache的/usr/local/apache/htdocs/
[root frontweb]$ pwd
/usr/local/mysqlmtop/frontweb
[root frontweb]$ cp -a * /usr/local/apache/htdocs/
打开application/config/database.php文件,修改PHP连接监控服务器的数据库信息
[root@localhost config]# pwd /usr/local/apache/htdocs/application/config root@localhost config]# vim database.php
修改username填刚刚在MySQL授权用户,password也就是对应的密码,mysqlmtop是对应的库,修改这三个即可
可以通过浏览器去访问了:http://ip
最好把默认的index.html删除了,这样才走index.php,默认管理员账号密码admin/admin 登录后请修改密码,增加普通账号
查看一下相关功能
监控项设置
点击管理中心 --> 应用管理 添加应用
点击管理中心 --> 服务器管理 添加 MySQL 服务器
十一、慢查询配置
1、在被监控服务器安装如下组件
http://cpan.metacpan.org/authors/id/T/TI/TIMB/DBI-1.628.tar.gz
tar xvzsf DBI-1.628.tar.gz
cd DBI-1.628
perl Makefile.PL
make && make install
http://search.cpan.org/CPAN/authors/id/C/CA/CAPTTOFU/DBD-mysql-4.024.tar.gz
- # tar xvzf DBD-mysql-4.024.tar.gz
- # cd DBD-mysql-4.024
- # perl Makefile.PL --mysql_config=/usr/local/mysql/bin/mysql_config --with-mysql=/usr/local/mysql
- # make && make install
http://search.cpan.org/CPAN/authors/id/S/SU/SULLR/IO-Socket-SSL-1.972.tar.gz
- # tar xvzf IO-Socket-SSL-1.972.tar.gz
- # cd IO-Socket-SSL-1.972
- # perl Makefile.PL
- # make && make install
http://www.percona.com/redir/downloads/percona-toolkit/LATEST/percona-toolkit-2.2.7.tar.gz
- # tar xvzf percona-toolkit-2.2.7.tar.gz
- # cd percona-toolkit-2.2.7
- # perl Makefile.PL
- # make && make install
2、开启 MySQL 本身的慢查询功能
- slow_query_log = 1
- slow_query_log_file = /data/dbdata/slow_query.log
- long_query_time = 1
3、在被监控服务器(10.160.22.14)上添加如下 crontab 项
- 00 * * * * /usr/bin/pt-query-digest --user=mtop_user --password=123456 --port=3306 --review h=172.18.35.29,D=mysqlmtop,t=mysql_slow_query_review_4 --history h=172.18.35.29,D=mysqlmtop,t=mysql_slow_query_review_history_4 --no-report --limit=0% /data/dbdata/slow_query.log >/dev/null 2>&1
4、在被监控服务器(10.160.22.47)上添加如下 crontab 项
- 00 * * * * /usr/bin/pt-query-digest --user=mtop_user --password=123456 --port=3306 --review h=172.18.35.29,D=mysqlmtop,t=mysql_slow_query_review_5 --history h=172.18.35.29,D=mysqlmtop,t=mysql_slow_query_review_history_5 --no-report --limit=0% /data/dbdata/slow_query.log >/dev/null 2>&1
以上数据表 mysql_slow_query_review、mysql_slow_query_review_history 的后缀为主机 ID,如图:
5、为被监控的服务器开启慢查询
6、效果展示
十二、工具组件配置
1、在被监控服务器(172.18.35.29)上添加如下 crontab 项
- */30 * * * * cd /usr/local/mysqlmtop; ./check_mysql_widget_bigtable.py >/dev/null 2>&1
- */1 * * * * cd /usr/local/mysqlmtop; ./check_mysql_widget_hit_rate.py >/dev/null 2>&1
- */1 * * * * cd /usr/local/mysqlmtop; ./check_mysql_widget_connect.py >/dev/null 2>&1
2、效果展示
十三、资源监控配置
1、被监控服务器上的设置
NET-SNMP服务安装(注意版本):
ftp://ftp.fi.freebsd.org/pub/FreeBSD/ports/distfiles/net-snmp-5.3.2.tar.gz
- # tar xvzf net-snmp-5.3.2.tar.gz
- # cd net-snmp-5.3.2
- # ./configure --prefix=/usr/local/snmp \
- --enable-mfd-rewrites \
- --with-default-snmp-version="2" \
- --with-sys-contact="lovezym5@qq.com" \
- --with-sys-location="China" \
- --with-logfile="/var/log/snmpd.log" \
- --with-persistent-directory="/var/net-snmp"
- # make && make install
- # cp EXAMPLE.conf /usr/local/snmp/share/snmp/snmpd.conf
- # vim /usr/local/snmp/share/snmp/snmpd.conf
- com2sec notConfigUser 172.18.35.29 mysqlmtop
- group notConfigGroup v1 notConfigUser
- group notConfigGroup v2c notConfigUser
- group notConfigGroup usm notConfigUser
- view all included .1 80
- access notConfigGroup "" any noauth exact all none none
- ......
服务启动:
- # /usr/local/snmp/sbin/snmpd -c /usr/local/snmp/share/snmp/snmpd.conf
2、监控服务器上的设置
NET-SNMP服务安装:
- # tar xvzf net-snmp-5.3.2.tar.gz
- # cd net-snmp-5.3.2
- # ./configure --prefix=/usr/local/snmp \
- --enable-mfd-rewrites \
- --with-default-snmp-version="2" \
- --with-sys-contact="lovezym5@qq.com" \
- --with-sys-location="China" \
- --with-logfile="/var/log/snmpd.log" \
- --with-persistent-directory="/var/net-snmp"
- # make && make install
- # cd /usr/local/mysqlmtop
- # ln -s /usr/local/snmp/bin/snmpwalk /usr/bin/snmpwalk
- # ln -s /usr/local/snmp/bin/snmpdf /usr/bin/snmpdf
- # vim /usr/local/mysqlmtop/check_linux_resource.sh
- host="172.18.35.29"
- port="3306"
- user="mtop_user"
- password="123456"
- dbname="mysqlmtop"
- ......
- # vim /usr/local/mysqlmtop/etc/config.ini
- [linux_server]
- server_ip="10.160.22.14|10.160.22.47"
重启监控服务:
- # mtopctl stop && mtopctl start
问题修正(否则无法获取内存信息):
- # vim /usr/local/mysqlmtop/check_linux_resource.sh
- totalmem=`/usr/bin/snmpdf -v1 -c mysqlmtop ${ip} | awk '/Real Memory/ {print $3}'`
- usedmem=`/usr/bin/snmpdf -v1 -c mysqlmtop ${ip} | awk '/Real Memory/ {print $4}'`
crontab 内容添加:
- */1 * * * * cd /usr/local/mysqlmtop; ./check_linux_resource.py >/dev/null 2>&1
总结:
一、该系统是开源的系统,如果搭建在公网,一定要做好各种访问控制,做好各方面的安全工作
二、该系统功能比较多,可以帮助MySQL DBA或运维DBA对管理MySQL及查看其性能
三、可能该系统存在一些小bug,例如发不出邮件啊,这些就要根据自己能力去完善了,如果会python,可以去掉没用的,加上自己想要的功能
详细参考资料 MySQLMTOP官网:http://www.mtop.cc/
http://www.cnblogs.com/xuanzhi201111/p/4172604.html