2010년 4월 20일 화요일

MySQL를 snmpd로 감시3

exec구현과 사용법

우선은 구현이 간단한 exec부터 설명하겠다.
장황하게 설명해도 잘 모르니 현재 MySQL서버에 접속해 있는 클라이언트 수를 snmpd가 되돌려주는 예를 들어보자.

MySQL 서버에 접속하고 있는 클라이언트 수는 SHOW STATUS SQL쿼리를 실행하던지 mysqladmin status라든지 mysqladmin processlist 로 알 수 있다.

여기에서는 SHOW STATUS를 사용해보자.

snmpd.conf에 다음과 같이 지정한다.

exec .1.3.6.1.4.1.2021.50 mysql_proc /etc/snmp/mysql_proc.sh

지정 포맷은 다음과 같다.

exec MIBOID 이름 명령어

MIB의 OID .1.3.6.1.4.1.2021.50 는 이미 사용되고 있지 않는 OID이면 뭐든지 상관없지만 엄밀히 말하면 번호는 IANA가 결정하고 있다.

사용할 수 있는 것은 .1.3.6.1.4, 즉 .iso.org.dod.internet.private , .1.3.6.1.4.1은 .iso.org.dod.internet.private.enterprise 에 할당되어 있다.

http://www.iana.org/assignments/enterprise-numbers


다음에는 MySQL서버에 접속하고 있는 수를 알 수 있는 스크립트인 /etc/snmp/mysql_proc.sh를 작성한다.

#!/bin/sh
export PATH=/usr/local/mysql/bin:/usr/local/bin:/usr/bin:/bin:/sbin:/usr/sbin
mysql -uroot -e 'SHOW STATUS' | grep '^Threads_connected' | awk '{print $2}'
exit 0

이것은 현재 접속중인 클라이언트 수를 얻어서 그 수만큼을 표준출력으로 뿌려주는 단순한 스크립트이다.

mysql -uroot -e 'SHOW STATUS' 로 상태정보를 취득하고
grep '^Threads_connected' 로 접속 클라이언트 정보를 추출한다.
--> Threads_connected 1

마지막으로 awk로 필요한 수치만 뽑아낸다.
--> 1

확인할 때는 아래와 같이 실행한다.

shell$ snmpwalk -v 1 -c public -On 127.0.0.1 .1.3.6.1.4.1.2021.50
※현재 스크립트를 작성중에 있으므로 localhost(127.0.0.1)에 snmpd를 설치해 테스트하고 있다.

얻어지는 결과중 다음이 실행된 명령어의 종료 상태이다.

.1.3.6.1.4.1.2021.50.100.1 = INTEGER: 0

문제의 필요한 부분은 exec에서 다음과 같이 할당해서 되돌려준다.

.1.3.6.1.4.1.2021.50.101.1 = STRING: "1" => 출력의 첫째 행
.1.3.6.1.4.1.2021.50.101.2 = STRING: "1" => 출력의 둘째 행

.1.3.6.1.4.1.2021.50.101.N = STRING: "1" => 출력의 N번째 행(N은 자연수)


그러나 exec에서는 문제점도 있다. 그것은 얻을 수 있는 값이 전부 STRING형이라는 것이다.

SNMP클라이언트에 따라서는 값의 형이 INTEGER인가 STRING인가를 보고 동작하는 것도 있다.

따라서 잘 동작하지 않을 가능성도 있다. 문자열을 얻는 경우에는 exec를 매우 쉽게 사용할 수 있지만 숫자만 얻어야하는 경우에는 좀 문제가 될 수 있다.

이런 경우에는 pass를 이용한다.