黑帽联盟

 找回密码
 会员注册
查看: 2166|回复: 0

[运维监控] zabbix3.0 监控mysql服务器性能实战,精华篇

[复制链接]

852

主题

38

听众

3168

积分

白金VIP

Rank: 8Rank: 8

  • TA的每日心情
    开心
    2024-3-7 12:52
  • 签到天数: 1538 天

    [LV.Master]伴坛终老

    监控思路
    先在zabbix主机上面配置好MySQL服务器的信息,添加好zabbix自带的Template App MySQL模版,然后去mysql服务器上安装agent,再添加mysql监控脚本。

    1,建立mysql host groups
    模板是 zabbix系统提供的,进入 zabbix web 后台,Configuration-->Hosts groups-->点击“Create host group”-->选择template选项卡,选择模板“TemplateApp MySQL,Templdate OS Linux”,最后点击update 即可(032.png)
    1.png

    2,建立hosts
    模板是 zabbix系统提供的,进入zabbix web 后台,configuration-->hosts-->点击你的主机 name-->选择template选
    项卡,选择模板“Template App MySQL”,最后点击左边的“Add”按钮,最后点击“update”按钮即可(033.png)

    2.png


    3rpm部署agent客户端
    rpm方式安装:
    #添加zabbix帐号
    groupadd zabbix
    useradd zabbix -g zabbix -s /sbin/nologin
    # 下载安装包
    wget http://repo.zabbix.com/zabbix/3. ... .0-2.el6.x86_64.rpm
    rpm -ivh zabbix-agent-3.0.0-2.el6.x86_64.rpm

    # 报错信息如下:
    [root@db_m1_slave_1 zabbix]# rpm -ivh zabbix-agent-3.0.0-2.el6.x86_64.rpm
    warning: zabbix-agent-3.0.0-2.el6.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID 79ea5ed4: NOKEY                                          
    error: Failed dependencies:
             libodbc.so.2()(64bit) is needed by zabbix-agent-3.0.0-2.el6.x86_64
    [root@db_m1_slave_1 zabbix]#
    # 解决方法:
    yum -y install unixODBC

    启动agent:
    # 启动:
    /usr/sbin/zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf                                                                                                                                   
    # 添加开机自启动:
    chkconfig  --add zabbix_agentd

    4,源码方式agent客户端
    tar zxvf zabbix-3.0.2.tar.gz
    cd zabbix-3.0.2
    ./configure --enable-agent --with-mysql
    make
    make install
    # 其它zabbix_agentd.conf配置信息和rpm方式一样      

    5,开始mysql性能监控
    这里可以采用zabbix自带的mysql模版,但是也需要在mysql服务器上准备获取mysql status的脚本chk_mysql.sh,zabbix通过调用这个脚本来获取mysql的运行信息。

    在配置文件zabbix_agentd.conf里面添加mysql监控信息:
    # vim /etc/zabbix/zabbix_agentd.conf
    UserParameter=mysql.version,mysql -V
    UserParameter=mysql.status,/usr/local/zabbix/scripts/chk_mysql.sh $1
    UserParameter=mysql.ping,mysqladmin -uzabbix -pys_ipowerlong0418 -P3306 -h127.0.0.1  ping | grep -c alive  

    添加mysql帐号:
    GRANT PROCESS,SUPER,REPLICATION CLIENT ON *.* TO zabbix@'127.0.0.1' IDENTIFIED BY 'ys_ipowerlong0418';   

    添加check脚本权限:
    chmod u+x /usr/local/zabbix/chk_mysql.sh
    chown -R zabbix.zabbix /usr/local/zabbix/chk_mysql.sh

    去zabbix服务器上面检查基本mysql服务器信息是否能正常获取到,zabbix_get -s 192.168.1..62 -p10050 -k"system.cpu.load[all,avg15]";:
    [root@hch_test_121_12 html]# zabbix_get -s 192.168.1..62 -p10050 -k "system.cpu.load[all,avg15]";                                                                 
    0.050000
    [root@hch_test_121_12 html]#


    接下来准备mysql的运行信息监控,需要准备新的mysql监控脚本chk_mysql.sh,/usr/local/zabbix/chk_mysql.sh:
    1. #!/bin/sh
    2. # -------------------------------------------------------------------------------
    3. # FileName:    check_mysql.sh
    4. # Revision:    1.0
    5. # Date:        2017/03/24
    6. # Author:      定位
    7. # Email:       admin@cnblackhat.com
    8. MYSQL_SOCK="/usr/local/mysql/mysql.sock"
    9. MYSQL_USER='zabbix'
    10. MYSQL_PWD='ys_ipowerlong0418'
    11. MYSQL_HOST='127.0.0.1'
    12. MYSQL_PORT='3306'
    13. ARGS=1
    14. if [ $# -ne "$ARGS" ];then
    15.     echo "Please input one arguement:"
    16. fi
    17. case $1 in
    18.     Uptime)
    19.         result=`/usr/local/mysql/bin/mysqladmin -u$MYSQL_USER -h$MYSQL_HOST -p${MYSQL_PWD} -S $MYSQL_SOCK status|cut -f2 -d":"|cut -f1 -d"T"`
    20.             echo $result
    21.             ;;
    22.         Com_update)
    23.             result=`/usr/local/mysql/bin/mysqladmin -u$MYSQL_USER -h$MYSQL_HOST -p${MYSQL_PWD} -S $MYSQL_SOCK extended-status |grep -w "Com_update"|cut -d"|" -f3`
    24.             echo $result
    25.             ;;
    26.         Slow_queries)
    27.         result=`/usr/local/mysql/bin/mysqladmin -u$MYSQL_USER -h$MYSQL_HOST -p${MYSQL_PWD} -S $MYSQL_SOCK status |cut -f5 -d":"|cut -f1 -d"O"`
    28.                 echo $result
    29.                 ;;
    30.     Com_select)
    31.         result=`/usr/local/mysql/bin/mysqladmin -u$MYSQL_USER -h$MYSQL_HOST -p${MYSQL_PWD} -S $MYSQL_SOCK extended-status |grep -w "Com_select"|cut -d"|" -f3`
    32.                 echo $result
    33.                 ;;
    34.     Com_rollback)
    35.         result=`/usr/local/mysql/bin/mysqladmin -u$MYSQL_USER -h$MYSQL_HOST -p${MYSQL_PWD} -S $MYSQL_SOCK extended-status |grep -w "Com_rollback"|cut -d"|" -f3`
    36.                 echo $result
    37.                 ;;
    38.     Questions)
    39.         result=`/usr/local/mysql/bin/mysqladmin -u$MYSQL_USER -h$MYSQL_HOST -p${MYSQL_PWD} -S $MYSQL_SOCK status|cut -f4 -d":"|cut -f1 -d"S"`
    40.                 echo $result
    41.                 ;;
    42.     Com_insert)
    43.         result=`/usr/local/mysql/bin/mysqladmin -u$MYSQL_USER -h$MYSQL_HOST -p${MYSQL_PWD} -S $MYSQL_SOCK extended-status |grep -w "Com_insert"|cut -d"|" -f3`
    44.                 echo $result
    45.                 ;;
    46.     Com_delete)
    47.         result=`/usr/local/mysql/bin/mysqladmin -u$MYSQL_USER -h$MYSQL_HOST -p${MYSQL_PWD} -S $MYSQL_SOCK extended-status |grep -w "Com_delete"|cut -d"|" -f3`
    48.                 echo $result
    49.                 ;;
    50.     Com_commit)
    51.         result=`/usr/local/mysql/bin/mysqladmin -u$MYSQL_USER -h$MYSQL_HOST -p${MYSQL_PWD} -S $MYSQL_SOCK extended-status |grep -w "Com_commit"|cut -d"|" -f3`
    52.                 echo $result
    53.                 ;;
    54.     Bytes_sent)
    55.         result=`/usr/local/mysql/bin/mysqladmin -u$MYSQL_USER -h$MYSQL_HOST -p${MYSQL_PWD} -S $MYSQL_SOCK extended-status |grep -w "Bytes_sent" |cut -d"|" -f3`
    56.                 echo $result
    57.                 ;;
    58.     Bytes_received)
    59.         result=`/usr/local/mysql/bin/mysqladmin -u$MYSQL_USER -h$MYSQL_HOST -p${MYSQL_PWD} -S $MYSQL_SOCK extended-status |grep -w "Bytes_received" |cut -d"|" -f3`
    60.                 echo $result
    61.                 ;;
    62.     Com_begin)
    63.         result=`/usr/local/mysql/bin/mysqladmin -u$MYSQL_USER -h$MYSQL_HOST -p${MYSQL_PWD} -S $MYSQL_SOCK extended-status |grep -w "Com_begin"|cut -d"|" -f3`
    64.                 echo $result
    65.                 ;;

    66.         *)
    67.         echo "Usage:$0(Uptime|Com_update|Slow_queries|Com_select|Com_rollback|Questions)"
    68.         ;;
    69. esac
    复制代码


    脚本准备完后,重启agent,然后在zabbix-server服务器上测试是否可以获取到mysql的status信息:
    [root@hch_test_121_12 html]# zabbix_get -s 192.168.1..71 -p10050 -k mysql.status[Com_update]                                                                                                                                 
    Warning: Using a password on the command line interface can be insecure.
    78055
    [root@hch_test_121_12 html]#
    [root@hch_test_121_12 html]#
    [root@hch_test_121_12 html]# zabbix_get -s 192.168.1..71 -p10050 -k mysql.status[Com_insert]
    Warning: Using a password on the command line interface can be insecure.
    51332
    [root@hch_test_121_12 html]#

    6
    ,监控性能视图
    监控脚本运行正常后,就会在zabbix-server的host下面的graph里面看到mysql的监控性能视图,monitoringààGraphsààHost(选择mysql服务器)ààGraph(选择mysql选项),可以看到性能监控视图,zabbix自带模版默认有2个性能图,这些图要等运行一段时间后才能画出来:

    041.png,MySQL operations:
    3.png

    042.png,MySQL bandwidth:
    4.png


    7mysqladmin的缺陷
    当mysql down了的时候,zabbix监控不到。因为默认的MySQL is down 的触发器的触发条件是mysql.ping.last(0),mysql.ping的实现方式是UserParameter=mysql.ping,mysqladmin -uzabbix -pys_ipowerlong0418-P3306 -h127.0.0.1  ping | grep -c alive,当mysql服务停止了后,mysqladmin执行报错是一推错误信息返回不了数字0,所以zabbix触发不了,所以zabbix界面会看到problems但是不会触发报警动作的,也就意味着你不会第一时间接到email、短信、电话报警了。

    所以必须改正不能用mysqladmin这种方式,想到了用telnet mysql端口的方式来判断,如下所示:UserParameter=mysql.ping,netstat -ntpl |grep 3317 |grep mysql |wc|awk '{print $1}'
    3317就是mysql运行的端口号,这样当mysqlis alive那么返回为1,当mysql is down返回为0,就满足了zabbix的mysql.ping.last(0)=0的触发条件了。

    修改zabbix_agentd.conf配置信息:
    #先移除默认的配置
    mv /etc/zabbix/zabbix_agentd.d/userparameter_mysql.conf /usr/local/zabbix/

    # 添加新的配置
    vim /etc/zabbix/zabbix_agentd.conf
    UserParameter=mysql.version,mysql -V
    UserParameter=mysql.status,/usr/local/zabbix/chk_mysql.sh $1
    UserParameter=mysql.ping,netstat -ntpl |grep 3317 |grep mysql |wc |awk '{print $1}'        

    实战模拟:
    在zabbix客户端把mysql服务给关闭了,执行service mysqld stop

    等待报警.........

    收到报警了,如下图:

    mysql监控报警

    mysql监控报警


    mysql服务重新启动,会收到mysql恢复的提醒,如下图:

    mysql恢复报警

    mysql恢复报警


    最后就是mysql性能的监控,关于增删改查,慢查询,回滚,提交等等的监控,这些就是通过脚本来实现的,如下图:

    mysql性能监控

    mysql性能监控


    8,报错汇总记录
    8.1报错信息
    [root@db_m1_slave_1 zabbix-3.0.2]# tail -f/var/log/zabbix/zabbix_agentd.log
    ……
    17336:20160422:163813.319 no active checkson server [192.168.121.12:10051]: host [hch_test_121_12] not found
    17336:20160422:164013.503 no active checks onserver [192.168.121.12:10051]: host [hch_test_121_12] not found

    解决办法:
    出现该错误的原因是一般是zabbix_agentd.conf里面的Hostname和前端zabbix web里面的配置不一样所造成的,即在zabbix web页面Monitoring->Configuration->Hosts 页面的Host Name和zabbix_agentd.conf里面的Hostname要一样。

    再看后台日志信息,正常如下:
    [root@db_m1_slave_1 zabbix-3.0.2]# tail -f/var/log/zabbix/zabbix_agentd.log
    17468:20160422:164350.284 IPv6 support:          YES
    17468:20160422:164350.284 TLS support:           YES
    17468:20160422:164350.284**************************
    17468:20160422:164350.284 using configurationfile: /etc/zabbix/zabbix_agentd.conf
    17468:20160422:164350.293 agent #0 started[main process]
    17469:20160422:164350.294 agent #1 started[collector]
    17470:20160422:164350.294 agent #2 started[listener #1]
    17471:20160422:164350.294 agent #3 started[listener #2]
    17472:20160422:164350.295 agent #4 started[listener #3]
    17473:20160422:164350.295 agent #5 started[active checks #1]

    8.2问题is not suitable for value type [Numeric (unsigned)] and datatype [Decimal]
    12394:20160422:200640.676 error reason for "db_master_1:mysql.status[Questions]" changed: Received value [Warning: Using a password on the command line interface can be insecure.18463244] is not suitable for value type [Numeric (float)]
    12393:20160422:200642.678 error reason for "db_master_1:mysql.status[Uptime]" changed: Received value [Warning: Using a password on the command line interface can be insecure.580661] is not suitable for value type [Numeric (unsigned)] and data type [Decimal]

    后台zabbix服务器日志:
    [root@hch_test_121_12 ~]# /usr/local/zabbix/bin/zabbix_get -s 192.168.1..71 -p10050 -k mysql.status[Com_update]
    Warning: Using a password on the command line interface can be insecure.
    92315
    [root@hch_test_121_12 ~]#

    解决办法是,在zabbix客户端,添加用户名密码配置,这样避免shell密码外泄也不会报错,(这里报这种错误是因为返回的结果集中有字符串提醒信息,而后台zabbix的item的是decimal所以存储不进去报错):
    vim /usr/local/mysql/my.cnf
    [mysqladmin]
    user=zabbix
    password=ys_ipowerlong0418

    然后重启zabbix_agent
    然后在后台zabbix测试,没有报多余的信息:
    [root@hch_test_121_12 ~]# /usr/local/zabbix/bin/zabbix_get -s 192.168.1..71 -p10050 -k mysql.status[Com_insert]
    58272
    [root@hch_test_121_12 ~]#

    之后再看zabbix_server后台日志,正常了不会报错了,如下所示:
    12855:20160422:233520.636 item "db_master_2:mysql.status[Bytes_received]" became supported
    12857:20160422:233521.636 item "db_master_2:mysql.status[Bytes_sent]" became supported
    12854:20160422:233522.637 item "db_master_2:mysql.status[Com_begin]" became supported
    12856:20160422:233523.638 item "db_master_2:mysql.status[Com_commit]" became supported
    12857:20160422:233524.641 item "db_master_2:mysql.status[Com_delete]" became supported
    12855:20160422:233525.642 item "db_master_2:mysql.status[Com_insert]" became supported
    12856:20160422:233526.642 item "db_master_2:mysql.status[Com_rollback]" became supported
    12854:20160422:233527.643 item "db_master_2:mysql.status[Com_select]" became supported
    12855:20160422:233528.645 item "db_master_2:mysql.status[Com_update]" became supported
    12857:20160422:233529.646 item "db_master_2:mysql.status[Questions]" became supported
    12856:20160422:233530.646 item "db_master_2:mysql.status[Slow_queries]" became supported


    8.3报错Check access restrictions in Zabbix agent configuration
    [root@hch_test_121_12 alertscripts]#zabbix_get -s 192.168.1..72 -p10050 -k "system.hostname";
    zabbix_get [17730]: Check accessrestrictions in Zabbix agent configuration

    [root@hch_test_121_12 alertscripts]#
    解决:
    配置文件坏了,copy一个备份的过来,改下,重启agent。


    在zabbix服务器上测试:
    [root@hch_test_121_12 alertscripts]#/usr/local/zabbix/bin/zabbix_get -s 192.168.1.63 -p10050 -k mysql.ping
    (Not all processes could be identified,non-owned process info
    willnot be shown, you would have to be root to see it all.)
    0
    [root@hch_test_121_12 alertscripts]#

    去mysql服务器上赋予s权限
    [root@db_m1_slave2 soft]# chmod +s /bin/netstat
    You have new mail in /var/spool/mail/root
    [root@db_m1_slave2 soft]#

    8.4、场景:因为使用了netstat -p参数。权限问题,zabbix_agentd是zabbix用户启动的,默认不能执行netstat -p等命令,导致从服务器取到的自动发现脚本为空
    (Not all processes could be identified, non-owned process info
    will not be shown, you would have to be root to see it all.)
    解决方法 :
    chmod +s /bin/netstat

    chmod +s 是什么意思

    为了方便普通用户执行一些特权命令,SUID/SGID程序允许普通用户以root身份暂时执行该程序,并在执行结束后再恢复身份。

    勿忘初心,方得始终!
    您需要登录后才可以回帖 登录 | 会员注册

    发布主题 !fastreply! 收藏帖子 返回列表 搜索
    回顶部