HowTo : collectd 설치하기

December 27, 2010

collectd logo

가볍고 사용하기 쉬운 network monitoring system “collectd”

Background

평소 SNMP(Simple Network Management Protocol)MRTG(Multi Router Traffic Grapher)를 이용하여 System Resource Monitoring을 해왔으나, 지표 추가하는데 MRTG 설정 파일 수정이 복잡하고, 귀찮아서 좀 더 편하게 System Monitoring을 하고자 자료 좀 찾아봤다. Network monitoring tool에 대한 위키페이지를 보던 중 회사, 해외 *nix community에서 종종 접해 눈에 익숙한 collectd를 선택했다.

What is collectd?

collectd는 한 host의 system resources data를 수집하고 central host로 data를 전송하는 daemon이다. 특별한 기능이 있지는 않지만 풍부한 Plug-in이 많으며 설치/설정이 간단한 것이 특징이다. 지속적인 서버 유지보수를 위해서 간단한 설정이 요구된다고 말 하는 것은 말하는 내 입만 아프게 할 뿐이다. collectd 공식 홈페이지에서 설명하는 major feature들을 살펴보자.

* Modularity / Portability
POSIX 준수는 기본이다. 장점이라기 보다는 오히려 지키지 않는 것이 문제 있는 것 아닌가?

* Reasonable defaults
대부분의 plug-in 설정을 수정하지 않고 사용할 수 있다. Ubuntu Server(10.10)의 경우 apt-get으로 collectd를 설치하면 별도 설정 수정없이 11개(cpu, df, disk, entropy, interface, irq, load, memory, processes, swap, users)지표를 볼 수 있다. 배포판 마다 enabled plug-in 수는 다르다. CentOS의 경우 4개(cpu, interface, load, memory) plug-in이 enable 되어 있다.

* High-resolution statistics
C language로 implementation되어 server에 부담이 없기 때문에 10초 단위로 system resources data를 수집한다. 혹시라도 service에 지장을 줄 수 있으니 적용하는 서버에 맞게 interval을 조정하는 것을 추천한다.

* Sophisticated network code
unicast, multicast, proxy는 기본이며 encrypted data transfer까지 지원한다. router의 “accept multicast” option을 enable 시키고 collectd data transfer 설정을 multicast로 해두면 Server가 증설 될 때 보다 설정이 간편해 진다.

* Custom extensions
collectd의 기본 plug-in에 없는 metric을 수집하기 위해 충분한 Custom extension을 제공한다. C, Perl, Python, Java, Execute binaries or scripts extension으로 못 하는 것이 있을까?

* Build to scale
가벼운 daemon, 가벼운 udp datagram, multicast 지원으로 scalability도 괜찮을 것 같다.

* SNMP support
위에 언급한 Custom extension으로 수집할 수 있는 data를 별도의 SNMP Plug-in을 지원함으로써 보다 간단한 설정으로 SNMP query result를 수집 할 수 있다.

* Integration with monitoring solutions
collectd 는 monitoring solution이 아니기 때문에 현재 monitoring system feature가 없다고 하면서 sophisticated monitoring solution을 발견하면 collectd와 통합할 계획이라고 한다.

Environment Setup

network diagram

machine information

hostnameOSIP addressinstalled package with Yum or apt-get
server01.svcCentOS(5.5)192.168.0.101collectd-4.10.0, httpd (apache-2.2.3), mysql-server-5.0.77, ntp-4.2.2p1
server01.boxUbuntu Server(10.10)192.168.0.151collectd-4.10.1, apache2-2.2.16, ntp-4.2.4p8
server02.boxUbuntu Server(10.10)192.168.0.152collectd-4.10.1, apache2-2.2.16, ntp-4.2.4p8
server03.boxUbuntu Server(10.10)192.168.0.153collectd-4.10.1, apache2-2.2.16, ntp-4.2.4p8
server04.boxUbuntu Server(10.10)192.168.0.154collectd-4.10.1, apache2-2.2.16, ntp-4.2.4p8

Installation

CentOS(5.5) guide

* Enable EPEL (Extra Packages for Enterprise Linux) Repository
CentOS-5의 Base, Extras repository에는 collectd package가 없기 때문에 EPEL repository를 enable 해야 한다.

* install yum-priorities
대부분의 system administrator들이 CentOS를 선택한 이유는 stable version package를 사용하기 위해서다. EPEL를 enable하고 나서 “yum update”를 하면 EPEL의 package 들이 기존 package들을 overwrite하기 때문에 system을 망칠 수 있다. 그래서 CentOS base repository를 보호하기 위해서 yum-protectbase package를 설치하면 해결되지만, 필자는 repository의 priority를 1부터 99까지 세세하게 설정할 수 있는(more fine-grained repository ordering) yum-priorities를 설치하였다. 왜냐하면 필자의 개발 서버에는 3rd party repositories를 enable하여 여러 repository간의 priority를 정해야 하기 때문이다.

자세한 내용은 공식 CentOS package management wiki page를 참고하기 바란다.

위 설정이 귀찮아 혹시라도 shell alias의 yum command에 “–disablerepo=epel” option을 추가하여 간단히 해결하고자 한다면 필자는 적극 말리고 싶다. 운영중인 server에 다른 sysadmin이 default shell이 아닌 다른 shell로 “yum update”를 실행 할 수도 있으며, 언제 3rd party repository를 enable할지 모르기 때문이다.

* install collectd

* Hostname 설정
/etc/collectd.conf file을 열어 server hostname과 동일하게 맞춘다.

* rrd DataDir path 설정
default save DataDir은 “/var/lib/collectd” 로 되어 있지만, rrd도 하나의 plug-in이기 때문에 “/var/lib/collectd/rrd”로 설정을 하였다.
/etc/collectd.conf file을 열어 rrdtool plug-in 설정을 아래와 같이 설정한다.

CGI script의 default read DataDir도 “/var/lib/collectd”로 되어 있기 때문에 위에서 설정한 동일한 경로로 수정한다.
/etc/collection.conf file을 열어 아래와 같이 수정한다.

* start collectd

rrd file이 정상적으로 쌓이고 있는지 확인하자.

* extract RRD data in a graphical format
엄밀히 말해서 collectd의 R&R은 rrdtool plug-in을 이용하여 rrd file을 생성하는 것이지만, 친절하게도(?) perl CGI script를 제공하고 있다. 따라서 외부에서 접근 못 하도록 ACL만 수정하면 된다.

/etc/httpd/conf.d/collectd.conf file을 열어서 private network에서만 접근 가능하도록 ACL 을 수정한다.

자 이제 웹 브라우저 주소창에 아래 주소를 입력하면 collectd가 쌓아놓은 데이터를 그래프로 볼 수 있다.

http://192.168.0.101/collectd/

Ubuntu(10.10) guide

* install collectd

* Hostname 설정
/etc/collectd/collectd.conf file을 열어 server hostname과 동일하게 맞춘다.

* disable rrdtool plug-in (option)
server01.box 에서는 rrd file을 남기지 않고 network를 통해 server01.svc로 전송 할 예정이므로 rrdtool plug-in 을 disable 하여 불필요한 리소스(CPU, Disk) 사용을 줄이는 것이 좋겠다.
/etc/collectd/collectd.conf file을 열어 “LoadPlugin rrdtool” 라인을 주석처리한다.

* start collectd

Centralize Data

collectd는 UDP를 이용하여 data를 전송한다. 간단하게 unicast 방식으로 설정할 수 있으며, switch 장비가 multicast stream을 지원한다면 multicast 방식을 사용하는 것이 more sustainable 하다고 생각한다. 왜냐하면 data를 집중화하는 server 를 옮길 때 unicast 방식은 다른 서버들의 설정 수정이 불가피하기 때문이다. 물론 내부 DNS server를 운영하여 앞서말한 문제를 해결 할 수도 있지만, multicast 가 가진 장점을 이용한다면 좀 더 유연하게 문제들을 대처할 수 있으리라 생각한다.

unicast

* server01.svc
/etc/collectd.conf file을 열어 NIC address를 Listen에 등록한다.

* server0[1-4].box
/etc/collectd/collectd.conf file을 열어 전송하고자 하는 server address를 등록한다.

multicast

* server01.svc
/etc/collectd.conf file을 열어 Multicast Group Address를 Listen에 등록한다.

* server0[1-4].box
/etc/collectd/collectd.conf file을 열어 Multicast Group Address를 Server에 등록한다.

* enable multicast
대부분의 switch, router 장비는 multicast disabled 되어 있을 것이다. 필자는 web으로 router(DIR-615)에 접속하여 enable multicast stream 을 체크하였다.

multicast address(239.192.74.66)가 router 장비에 등록 되어있음을 확인 할 수 있다.

Plug-in Configuration

collectd plug-in 페이지를 참고하여 몇가지 plug-in을 등록해 보았다. 다시 한번 말하지만 간단한 설정파일 수정으로 짧은 시간 내에 여러 가지 지표를 볼 수 있는 것이 collectd의 가장 큰 매력이다.

* logfile
default로 syslog plug-in이 enable되어 있어 /var/log/messages 에서 collectd의 log를 확인 할 수 있다. 하지만 다른 facility들과 섞여 있어 가독성이 좋지 않아서 별도 파일로 기록했다.

* apache
apache 지표를 보려면 apache status module을 load하고 적절히 ACL을 수정해야 한다. 자세한 설정은 apache module mod_status document를 참고하기 바란다.

* cpu (default)

* df
shell에 “df -T”를 입력하여 device와 filesystem을 확인하고 그대로 등록을 해주면 된다.

* disk
/proc/diskstats (Linux 2.6) or /proc/partitions (Linux 2.4)를 참고하여 perl regular expression으로 등록을 해주면 된다. (대부분의 경우 아래 주석처리한 첫 번째 라인으로 등록 가능함)

* interface (default)

* irq
모든 irq number를 보기위해 아래와 같이 설정하였다.

* load (default)

* memory (default)

* mysql
localhost에서만 접근 가능한 monitor 전용 계정을 추가하였다.

* ntpd

* rrdtool (enable cache)
default로 collectd는 10초 주기로 rrd file을 update한다. 그런데 rrd file을 update하는데 load가 적잖게 걸린다고 하니 data를 memory에 임시로 저장해놨다가 한꺼번에 rrd files에 update 하는 것이 좋겠다. 단, 그만큼 rrd file이 늦게 update되기 때문에 실시간성이 떨어진다.

* tcpconns

* uptime
별도 설정 필요 없음

* vmem

Pros and Cons

Trouble Shooting

* client가 network를 통해 전송한 data가 rrd file로 기록은 되는데 web page에서 보이지 않는다.
우선 정상적으로 rrd file에 기록이 되는지 확인하기 위해 rrdtool dump 를 이용하여 눈으로 직접 데이터 값을 확인한다. 확인 해야 할 항목 : date, value

Jakarta Project 에피소드 Ⅰ: ORO의 보이지 않는 위험

March 21, 2010
Jakarta Project : Episode 1

Jakarta Project : Episode 1

Jakarta Project 에피소드Ⅰ

ORO의 보이지 않는 위험

조금 먼 옛날 Jakarta Project 저편에…

1996년 1월 23일 JDK 1.0이 세상에 처음 나온 이후 예상과 달리 많은 사람들로부터 관심을 받기 시작한다. 인기가 많아 질수록 언어 스펙 역시 요구가 많아지게 되는데, 그 중에 하나가 불편한 text-processing이었다.

때마침 1999년 Java Language 창시자인 James Gosling과 Open source 수호자인 Brian Behlendorf가 만나서 Jakarta Project를 설립 하고, Jakarta Project에 힘입은 Savarese는 2000년 7월에 Jakarta ORO project를 발족하여 Java Language에서 Regular Expression(정규 표현식)을 사용할 수 있게 하는데…

Jakarta ORO란?

JAVA는 J2SE 1.4 (February 6, 2002)때부터 Regular Expression(정규 표현식)을 지원하기 시작했다. 그러므로 초창기 JAVA는 text-processing이 타 언어에 비해 사용이 불편했다. 2000년 7월 23일 ORO(Original Reusable Objects) company가 JAVA에서 Regular Expression을 사용할 수 있도록 하기 위해 Set of text-processing Java classes를 Jakarta project에 기증하였다. 그 project가 바로 ORO project이다.

Jakarta ORO가 가진 잠재적 문제점

ORO project는 2003년 12월 30일 마지막 release이후, 많은 개발자로부터 J2SE 1.4에 포함된 JAVA CORE regular expression package(java.util.regex)에 비해서 현저히 떨어지는 성능과 높은 메모리 사용률에 대한 개선 요구사항들이 쇄도하게 된다. 이에 대해 original code contributor인 Daniel Savarese는 J2SE 1.4 이후 추가된 java.lang.CharSequence를 사용하면 위 언급한 성능/메모리에 대한 요구사항을 만족시킬 수는 있지만, backward compatibility(J2SE 1.4 이전 하위 호환성) 문제 때문에 요구사항을 들어줄 수 없었다고 한다.

그러므로 org.apache.oro package는 Perl5/AWK-like compatible regular expression을 사용할 수 있다는 장점이 있으나, java core regular expression package에 비해 현저히 떨어지는 성능과 높은 메모리 사용률이라는 단점 때문에 이를 감수하면서 사용할 경우, 언제 running service에 장애가 발생할 지 모른다.

더 큰 문제는 J2SE 1.4 이전에 개발 시작한 open source가 ORO package를 많이 사용하고 있으며, 특히 Jakarta subproject 상당수가 ORO package를 사용하고 있는 실정이란 점이다.

대응 방법

ORO package에 dependent한 대표적 open source인 spring framework, Jakarta ant 그리고 json-lib가 어떻게 ORO package를 사용하고 있는지 살펴봤다.

Json-lib와 spring framework는 JAVA version 1.4를 기준으로 ORO에 binding할지 Java core regular expression에 binding할지를 결정한다. 그러므로 version 1.4 이후의 JAVA를 사용하면 ORO에 binding되지 않기 때문에 ORO의 잠재적 문제로부터 안전하다.

한편 Jakarta ant는 default로 Java core regular expression에 binding되기 때문에 애초부터ORO의 잠재적 문제로부터 벗어날 수 있다. (jakarta ant는 property설정으로 jakarta ORO, Jakarta Regexp, Java core regular expression중 하나를 선택하여 사용하는 구조임)

위 3가지 open source 조사결과로 미루어 볼 때, ORO는 backward compatibility를 제공하는데 주로 사용되며 version 1.4 이후의 JAVA를 사용할 경우에는 ORO에 binding되지 않을 것이라 추측한다. 왜냐하면 2002년 JAVA version 1.4가 release된 이후 open source는 많은 사람들로부터 오랜 기간 동안 사용되면서 충분히 검증 받은 code라고 생각하기 때문이다. 하지만 직접 눈으로 확인하는 것이 가장 확실한 방법이다.

정리하면,

  • The latest stable version of JAVA(가장 최신의 안정버전)를 사용한다.
  • 규모가 작은 open source일 경우 직접 눈으로 확인한다.

대응 방법 예시 (직접 눈으로 source code 검증)

  1. json-lib (version 2.2.2)
      • source code > net.sf.json.regexp.RegexpUtils.java

      • Inheritance diagram

    Inheritance diagram

  2. spring framework (version 2.0.6)
      • source code > org.springframework.aop.support.RegexpMethodPointcutAdvisor.java

      • Inheritance diagram

    Inheritance diagram

  3. Jakarta Ant (version 1.8)
      • source code > org.apache.tools.ant.util.regexp.RegexpFactory.java

      • Inheritance diagram

    Inheritance diagram

블로그를 시작 합니다.

March 7, 2010

지인 추천으로 블로그를 시작하게 되었습니다.

대학교 1,2 학년 때 개인 홈페이지를 직접 꾸려가며 글을 써본 경험이 전부 이지만, 성의를 다 해서 글을 쓰겠습니다. 자주 글을 쓸 자신은 없지만, 틈틈히 소재를 모아놨다가 가끔씩 글을 포스팅 할 생각입니다.

 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org