天天看点

zabbix应用之low-level discovery监控mysql

    当一台服务器上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>&gt; </code><code>/etc/zabbix/monitor_scripts/mysql_port_discovery</code><code>.sh &lt;&lt; </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/ &amp;&amp; /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>&gt; $include</code><code>/mysql_lld</code><code>.conf &lt;&lt; </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&gt;</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&gt;</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>&gt;&gt; ${AGENT_CONF} &lt;&lt; </code><code>'EOF'</code>

<code># 手动MySQL授权,添加zabbix账户</code>

<code>echo</code> <code>"请在所有MySQL实例中添加zabbix账户,执行&gt; 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>] &amp;&amp; </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>&gt;&gt; </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&gt; 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&gt; 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