2010년 4월 25일 일요일

MySQL를 snmpd로 감시4

pass의 구현과 사용방법

【사용방법】
우선은 사용방법부터 알아보자. snmpd.conf에 다음처럼 기술한다.

pass .1.3.6.1.4.1.2021.51 /etc/snmp/mysql_proc_pass.sh .1.3.6.1.4.1.2021.51


여기에서는 새롭게 /etc/snmp/mysql_proc_pass.sh스크립트를 만들어보자. 이 스크립트가 필요한 값을 표준출력으로 되돌려주게 된다.

exec와 마찬가지로 MIB OID는 맘대로 결정한다.
pass의 포맷은 다음과 같다.

pass MIBOID 명령어

mysql_proc_pass.sh의 뒤에 있는 .1.3.6.1.4.1.2021.51 는 명령어의 인수이다. 이것은 pass의 사양에 따른 것이다.

【snmpd의 동작】
snmpd에 .1.3.6.1.4.1.2021.51 를 질의하면 snmpd는 다음과 같이 실행한다.

/etc/snmp/mysql_proc_pass.sh .1.3.6.1.4.1.2021.51 -n .1.3.6.1.4.1.2021.51

복잡하게 보이므로 간략화하면 다음과 같다.

명령어 -n .1.3.6.1.4.1.2021.51

-n옵션과 지정된 MIB OID를 인수로 추가해서 명령어가 실행된다. -n이외에 -g 옵션이 지정되는 경우도 있다. -n은 SNMP getnext 요청시에 실행된다. -g는 SNMP get요청시에 실행된다.

pass에 지정된 명령어는 -g와 -n 모두의 옵션을 지원하지 않으면 안된다는 것이다.

또 -s옵션도 존재하지만 -s는 값을 set할 때에 사용되는 옵션이다.

【출력포맷】
실행되는 명령어의 -n와 -g옵션때에 출력되는 포맷은 다음과 같다.

MIB OID
타입


LF개행으로 세개의 행이다.
타입은 string, integer, counter, gauge, timeticks, ipaddress, objid중에 한개 이다.

스크립트 인수에 MIB OID가 있었던 것은 이 출력의 첫번째 행을 위해서이다.
출력의 첫번째 행을 스크립트내부에서 생성할 필요가 있다.


【에러처리】
-n과 -g 옵션일 때 스크립트가 에러를 처리하고자 할 때에는 표준출력에는 아무것도 되돌리지 말고 exit한다.

【-n 옵션】
ex 1>
명령:
명령어 -n .1.3.6.1.4.1.2021.51
결과:
.1.3.6.1.4.1.2021.51 .1
string
mysql_proc_pass
ex 2>
명령:
명령어 -n .1.3.6.1.4.1.2021.51.1
결과:
.1.3.6.1.4.1.2021.51 .2
string
/etc/snmp/mysql_proc_pass.sh
ex 3>
명령:
명령어 -n .1.3.6.1.4.1.2021.51.2
결과:
.1.3.6.1.4.1.2021.51 .3
integer
1
ex 3>
명령:
명령어 -n .1.3.6.1.4.1.2021.51.3
결과:
(없음)


【-g 옵션】
-g 옵션일 때에는 -n하고는 달리 지정된 MIB OID하고 그 값을 되돌려줄 필요가 있다.
결과의 첫번째 행에 -n의 경우는 「다음 MIB OID」, -g의 경우는 「지정된 MIB OID」가 된다.

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를 이용한다.

2010년 4월 6일 화요일

MySQL를 snmpd로 감시2

Linux의 net-snmp(ucd-snmp)에서는 snmpd.conf를 고쳐서 필요한 프로그램(명령어나 스크립트)의 실행결과를 snmpd(SNMP서버)에 건네는 것이 가능하다.

이것을 수행하기 위해서는 snmpd.conf에 exec키워드나 pass 키워드를 사용해서 실행하는 명령어를 지정한다. exec도 pass도 실행되는 명령어는 결과를 표준출력에 출력하는 것이 전제조건이다. ( 다시 말해 snmpd의 입장에서 보면 명령실행결과는 표준입력으로 얻는다는 것을 알 수 있다. )

exec와 pass의 차이는 다음과 같다.

  • exec: 여러행에 걸쳐서 문자열을 리턴하는 경우에 편리. 리턴값의 타입은 STRING으로 고정
  • pass: 리턴값의 타입을 STRING이외로 하고 싶은 경우에 사용. snmpd에 건네는 결과에는 exec보다도 고민이 필요하다.