2010년 5월 10일 월요일

MySQL를 MRTG로 감시

「MySQL을 snmpd로 감시」에서 설명한 것은 SNMP서버가 MySQL값을 처리하는 방법이었다.

여기에서는 SNMP클라이언트인 MRTG가 MySQL값을 조사하는 방법을 소개한다.

SNMP클라이언트로 조사할 것인지 SNMP서버로 조사할 것인지 상황에 맞게 선택하면 될 것이다.

Debian에서는 다음과 같은 조작으로 MRTG가 설치된다.

root@shell# aptitude install mrtg mrtg-contrib


사용방법

MRTG설정파일에 MRTG가 명령어(스크립트)를 실행해서 그 결과를 처리하도록 해보자.

Target[Threads_connected]: `/etc/snmp/mysql_mrtg.sh`
Title[Threads_connected]: "MySQL Threads_connected"
Options[Threads_connected]: growright,nopercent,gauge
YLegend[Threads_connected]: times
ShortLegend[Threads_connected]: times
Legend1[Threads_connected]: times
Legent2[Threads_connected]: times
LegentO[Threads_connected]:

Target키워드는 Threads_connected를 조사하는 스크립트를 「`」로 묶어서 지정한다.
스크립트는 /etc/snmp/mysql_mrtg.sh로 한다. 이 스크립트에는 실행권한을 chmod로 부여해둔다. 또 Options에 nopercent를 지정해서 %를 다루지 않게 한다. Options의 gauge는 값을 차이처리, 평균화(/sec.)를 하지않는다는 것을 의미한다.

MRTG는 새롭게 취득한 값과 전에 취득한 값의 차이를 계산하여 그것을 기준으로 그래프를 그린다. 보통 네트워크의 인터페이스의 입출력패킷 양의 수치는 누적되어 처리되므로 이번에 얻은 값과 전에 얻은 값의 차이를 계산해서 출력한다.

그러나 이번에 측정하려고 하는 것은 MySQL의 Threads_connected 즉 지금 접속하고 있는 수이므로 gauge를 이용한다.

참고로 디스크사용량이나 미사용량은 gauge처리를 하는 것이 좋다.

MRTG는 보통 값을 초간격으로 평균(값/sec.)을 낸다. gauge의 경우, 값을 평균화하지 않고 측정값이 그대로 출력된다. 즉 순간순간 측정된 값이 출력된다.

gauge하고 비슷한 것이 absolute가 있다. 이것은 값을 초간격으로 평균처리하는 점이 gauge하고 다른 점이다.

Legend는 축의 단위이다. 단순히 표시할 때의 문자열을 나타내므로 편한대로 설정하면 될 것이다. LegendO[]:처럼 단위를 지정하지 않으면 Outbound선을 출력하지 않는다.

스크립트는 다음과 같이 처리한다.
간략화한 것이므로 인수처리, 에러처리, 배타처리등은 생략한다.

#!/bin/sh
export PATH=/usr/local/mysql/bin:/usr/local/bin:/usr/bin:/bin:/sbin:/usr/sbin

TMPFILE=/tmp/mysql_mrtg.$$

mysql -uroot -e 'SHOW STATUS' > $TMPFILE

N=`grep -i '^Threads_connected' $TMPFILE | awk '{print $2}'`
T=`grep -i '^Uptime' $TMPFILE | awk '{print $2}'`

rm TMPFILE

echo "$N"
echo 0
echo "$(expr $T / 86400) days"
echo "MySQL Server Threads_connected"

exit 0

출력포맷은 다음과 같다.

Inbound의 값(수치)
Outbound의 값(수치)
가동시간(문자열)
코멘트(문자열)

MRTG는 인터페이스 패킷의 입출력을 조사하는 것을 전제로 하고 있다.
따라서 인터페이스의 Inbound와 Outbound 둘다 값이 필요하다.
이번 예에서는 한개만 필요하므로 Outbound를 0으로 고정하고 있다. 이것은 숫자이다.

나머지 가동시간, 코멘트는 인간이 읽을 수 있는 문자열이면 뭐든지 괜찮다.