當一台伺服器上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