当一台服务器上MySQL有多个实例的时候,MySQL占用多个不同端口。利用zabbix的low-level discovery可以轻松监控。
下面我写了一个简单的脚本,用于一键部署mysql监控。
一、客户端
在被监控端运行此脚本,前提条件已经安装好了zabbix agent(推荐yum安装)。脚本已在CentOS6.2 x86_64环境下测试通过。脚本在附件提供下载。
<code>#!/bin/sh</code>
<code>#</code>
<code># Filename: autoMonitorMysql.sh</code>
<code># Revision: 1.0</code>
<code># Date: 2014/08/12</code>
<code># Author: Qicheng</code>
<code># Email:</code>
<code># Website: http://qicheng0211.blog.51cto.com/</code>
<code># Description: zabbix low level discovery监控MySQL</code>
<code># Notes: 在被监控客户端运行此脚本,前提条件已经安装好zabbix agent</code>
<code>ROOT_UID=0</code>
<code>if</code> <code>[ </code><code>"$UID"</code> <code>-</code><code>ne</code> <code>"$ROOT_UID"</code> <code>];</code><code>then</code>
<code> </code><code>echo</code> <code>"Error: 必须以root用户运行此程序!"</code>
<code> </code><code>exit</code> <code>1</code>
<code>fi</code>
<code># 自行修改为你的zabbix agent配置文件路径</code>
<code>AGENT_CONF=</code><code>"/etc/zabbix/zabbix_agentd.conf"</code>
<code>mkdir</code> <code>-p </code><code>/etc/zabbix/monitor_scripts</code>
<code># 创建 mysql low-level discovery 脚本</code>
<code>cat</code> <code>> </code><code>/etc/zabbix/monitor_scripts/mysql_port_discovery</code><code>.sh << </code><code>'EOF'</code>
<code>#!/bin/bash</code>
<code>#Function: mysql low-level discovery</code>
<code>#Script_name: mysql_port_discovery.sh</code>
<code>mysql() {</code>
<code> </code><code>port=(`</code><code>sudo</code> <code>/bin/netstat</code> <code>-tpln | </code><code>awk</code> <code>-F </code><code>"[ :]+"</code> <code>'/mysql/ && /0.0.0.0/ {print $5}'</code><code>`)</code>
<code> </code><code>max_index=$[${</code><code>#port[@]}-1]</code>
<code> </code><code>printf</code> <code>'{\n'</code>
<code> </code><code>printf</code> <code>'\t"data":['</code>
<code> </code><code>for</code> <code>key </code><code>in</code> <code>${!port[@]}</code>
<code> </code><code>do</code>
<code> </code><code>printf</code> <code>'\n\t\t{'</code>
<code> </code><code>printf</code> <code>"\"{#MYSQLPORT}\":\"${port[${key}]}\"}"</code>
<code> </code><code>if</code> <code>[ $key -</code><code>ne</code> <code>$max_index ];</code><code>then</code>
<code> </code><code>printf</code> <code>","</code>
<code> </code><code>fi</code>
<code> </code><code>done</code>
<code> </code><code>printf</code> <code>'\n\t]\n'</code>
<code> </code><code>printf</code> <code>'}\n'</code>
<code>}</code>
<code>case</code> <code>"$1"</code> <code>in</code>
<code> </code><code>mysql)</code>
<code> </code><code>"$1"</code>
<code> </code><code>;;</code>
<code> </code><code>*)</code>
<code> </code><code>echo</code> <code>"Bad Parameter."</code>
<code> </code><code>echo</code> <code>"Usage: $0 mysql"</code>
<code> </code><code>exit</code> <code>1</code>
<code>esac</code>
<code>EOF</code>
<code>chown</code> <code>-R zabbix:zabbix </code><code>/etc/zabbix/monitor_scripts</code>
<code>chmod</code> <code>+x </code><code>/etc/zabbix/monitor_scripts/mysql_port_discovery</code><code>.sh</code>
<code># 判断配置文件是否存在</code>
<code>[ -f </code><code>"${AGENT_CONF}"</code> <code>] || { </code><code>echo</code> <code>"ERROR: File ${AGENT_CONF} does not exist."</code><code>;</code><code>exit</code> <code>1;}</code>
<code>include=`</code><code>grep</code> <code>'^Include'</code> <code>${AGENT_CONF} | </code><code>cut</code> <code>-d</code><code>'='</code> <code>-f2`</code>
<code># 在配置文件中添加自定义参数</code>
<code>if</code> <code>[ -d </code><code>"$include"</code> <code>];</code><code>then</code>
<code> </code><code>cat</code> <code>> $include</code><code>/mysql_lld</code><code>.conf << </code><code>'EOF'</code>
<code>UserParameter=mysql_port_discovery[*],</code><code>/bin/bash</code> <code>/etc/zabbix/monitor_scripts/mysql_port_discovery</code><code>.sh $1</code>
<code>UserParameter=mysql_status[*],mysql -h 127.0.0.1 -P $1 -uzabbix -pzabbix -N -e </code><code>"show global status where Variable_name='$2'"</code> <code>2></code><code>/dev/null</code> <code>| </code><code>cut</code> <code>-f2</code>
<code>UserParameter=mysql_ping[*],mysqladmin -h 127.0.0.1 -P $1 -uzabbix -pzabbix </code><code>ping</code> <code>2></code><code>/dev/null</code> <code>| </code><code>grep</code> <code>-c alive</code>
<code>else</code>
<code> </code><code>grep</code> <code>-q </code><code>'^UserParameter=mysql_port_discovery'</code> <code>${AGENT_CONF} || </code><code>cat</code> <code>>> ${AGENT_CONF} << </code><code>'EOF'</code>
<code># 手动MySQL授权,添加zabbix账户</code>
<code>echo</code> <code>"请在所有MySQL实例中添加zabbix账户,执行> GRANT PROCESS ON *.* TO 'zabbix'@'127.0.0.1' identified BY 'zabbix';flush privileges;"</code>
<code># 重启agent服务</code>
<code>[ -f </code><code>'/etc/init.d/zabbix-agent'</code> <code>] && </code><code>/etc/init</code><code>.d</code><code>/zabbix-agent</code> <code>restart || </code><code>echo</code> <code>"需手动重启zabbix agent服务."</code>
<code># 授权zabbix用户无密码运行netstat命令</code>
<code>chmod</code> <code>+w </code><code>/etc/sudoers</code>
<code>sed</code> <code>-i </code><code>'s/^\(Defaults\s\+requiretty\)/#\1/'</code> <code>/etc/sudoers</code>
<code>grep</code> <code>-q </code><code>'^zabbix ALL=(ALL).*netstat'</code> <code>/etc/sudoers</code> <code>|| </code><code>echo</code> <code>'zabbix ALL=(ALL) NOPASSWD: /bin/netstat'</code> <code>>> </code><code>/etc/sudoers</code>
<code>chmod</code> <code>440 </code><code>/etc/sudoers</code>
<code># 关闭SELinux</code>
<code>setenforce 0</code>
<code>sed</code> <code>-i </code><code>'/^SELINUX=/c\SELINUX=disabled'</code> <code>/etc/sysconfig/selinux</code>
<code>sed</code> <code>-i </code><code>'/^SELINUX=/c\SELINUX=disabled'</code> <code>/etc/selinux/config</code>
脚本执行完毕后,还需要手动MySQL授权,在所有实例中添加zabbix账户:
<code>mysql> GRANT PROCESS ON *.* TO </code><code>'zabbix'</code><code>@</code><code>'127.0.0.1'</code> <code>identified BY </code><code>'zabbix'</code><code>;</code>
<code>mysql> flush privileges;</code>
在zabbix server端执行zabbix_get命令测试:
<code>shell</code><code># zabbix_get -s 115.238.xxx.xxx -k 'mysql_port_discovery[mysql]'</code>
<code>{</code>
<code> </code><code>"data"</code><code>:[</code>
<code> </code><code>{</code><code>"{#MYSQLPORT}"</code><code>:</code><code>"3306"</code><code>}</code>
<code> </code><code>]</code>
<code>shell</code><code># zabbix_get -s 115.238.xxx.xxx -k 'mysql_status[3306,Uptime]'</code>
<code>1295092</code>
<code>shell</code><code># zabbix_get -s 115.238.xxx.xxx -k 'mysql_ping[3306]'</code>
<code>1</code>
都能返回数据,说明客户端的MySQL监控部署好了。
二、WEB端
1、导入模板
下载附件模板文件(Template App MySQL used LLD.xml)后,导入到zabbix里。
<a href="http://s3.51cto.com/wyfs02/M02/45/B6/wKioL1Pp4kSyoHKjAAGXWh7Zy8s473.jpg" target="_blank"></a>
2、创建主机并链接模板
<a href="http://s3.51cto.com/wyfs02/M01/45/B5/wKiom1Pp4cShB-e7AAGzKCOtQms583.jpg" target="_blank"></a>
3、数据展示
<a href="http://s3.51cto.com/wyfs02/M00/45/B6/wKioL1Pp42OwPPWPAAbiWNEsyIs158.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M02/45/B5/wKiom1Pp5c3TKkJoAAQ8Pf6e16I805.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M02/45/B6/wKioL1Pp5yzSM7j0AAUMjs2XGA0952.jpg" target="_blank"></a>
<a href="http://down.51cto.com/data/2364742" target="_blank">附件:http://down.51cto.com/data/2364742</a>
本文转自 张斌_青岛 51CTO博客,原文链接:http://blog.51cto.com/qicheng0211/1539101