서버 여러대의 system resource data를 모니터링 하기 위해
collectD를 설치해 보았습니다.
collectD?
system resource data를 수집하는 기능을 합니다. 수집된 데이터는 central host로 전송을 하는데, 다양한 형태로 전송 할 수 있습니다. 또한, 이미 정의되어있는 plugin들을 사용하여, 몇가지 설정만으로도 데이터를 수집하고 보낼 수 있습니다. 저는 centos7환경에서 collectd를 설치하고, influxdb로 데이터를 수집 하였습니다.
설치
설치는 쉽습니다. 다음과 같이 입력하면 설치가 완료됩니다.
npm install collectd
한가지 주의하실 점은 yum repository 참조 오류가 발생할 수도 있다는 것입니다. 그러면 가장 최신 버전을 설치해주어야 하기 때문에 다음과 같이 진행합니다.
yum install epel-release
npm install collectd
설정
설치한 후에 /etc/collectd.conf에서 설정을 변경합니다. collectd는 기본적으로 필요한 플러그인들을 제공하고 주석처리가 되어있습니다. 주석을 풀고 필요한 설정을 잡아주면 됩니다. 저는 다음과 같은 플러그인들이 필요하기 때문에 주석을 풀고 설정을 하겠습니다.
--- Loadplugin section ---
LoadPlugin cpu
LoadPlugin df
LoadPlugin disk
LoadPlugin interface
LoadPlugin load
LoadPlugin memory
LoadPlugin network
--- Plugin configuration ---
<Plugin cpu>
ReportByCpu true
ReportByState true
ValuesPercentage true
</Plugin>
...
<Plugin network>
# # client setup:
Server "127.0.0.1" "25826"
# <Server "127.0.0.1" "25826">
# SecurityLevel Encrypt
# Username "user"
# Password "secret"
# Interface "eth0"
# ResolveInterval 14400
# </Server>
# TimeToLive 128
#
# # server setup:
# Listen "127.0.0.1" "25826"
# <Listen "239.192.74.66" "25826">
# SecurityLevel Sign
# AuthFile "/etc/collectd/passwd"
# Interface "eth0"
# </Listen>
MaxPacketSize 1452
#
# # proxy setup (client and server as above):
# Forward true
#
# # statistics about the network plugin itself
# ReportStats false
#
# # "garbage collection"
# CacheFlush 1800
위와 같이 주석을 풀고 자신에게 필요한 설정을 잡아주면 되는데, network같은 부분은 저는 테스트를 위해 우선 로컬의 influxdb에 데이터를 보내기 위해 로컬의 25826 포트로 client setup을 했습니다. 25826 포트는 influxdb에서 collectd에 대해 리스닝하고있는 포트입니다. 실제 사용하실때는 로컬IP가 아니라 모니터링 장비의 IP로 바꿔줘야 합니다.
influxDB?
influxDB는 시계열 데이터를 저장하는 DB입니다. 시간의 흐름에 따라 서버의 리소스와 같은 IT 인프라 모니터링, 다이어트나 건강체크와 같은 IoT 기기들의 데이터 수집 등 다양한 목적에 사용할 수 있습니다.
설치
설치는 간단합니다. 아래와 같이 진행합니다.
wget --no-check-certificate https://s3.amazonaws.com/influxdb/influxdb-0.10.0-1.x86_64.rpm
yum localinstall influxdb-0.10.0-1.x86_64.rpm
설정
이제 설치를 했으니, collectd에서 오는 데이터를 받을 수 있도록 /etc/influxdb/influxdb.conf 설정파일을 변경합니다. admin, meta, http와 같이 핵심적인 설정들은 이미 다 되어있습니다. 저희가 변경해야 할 부분은 collectd 부분입니다.
###
### [collectd]
###
### Controls the listener for collectd data.
###
[collectd]
enabled = true
bind-address = ":25826"
database = "collectd"
typesdb = "/usr/share/collectd/types.db"
# These next lines control how batching works. You should have this enabled
# otherwise you could get dropped metrics or poor performance. Batching
# will buffer points in memory if you have many coming in.
# batch-size = 1000 # will flush if this many points get buffered
# batch-pending = 5 # number of batches that may be pending in memory
# batch-timeout = "1s" # will flush at least this often even if we haven't hit buffer limit
# read-buffer = 0 # UDP Read buffer size, 0 means OS default. UDP listener will fail if set above OS max.
앞에서 collectd의 데이터를 로컬호스트의 25826포트로 보냈었죠? 위의 부분이 influxdb에서 collectd의 데이터를 받기 위한 설정입니다.
실행
이제 다음과 같이 influxdb와 collectd를 실행시켜 봅시다.
service influxdb start
systemctl start collectd
확인
그리고 제대로 돌아가는지 collectd를 확인해 봅시다.
[root@localhost influxdb] systemctl status collectd
● collectd.service - Collectd statistics daemon
Loaded: loaded (/usr/lib/systemd/system/collectd.service; disabled; vendor preset: disabled)
Active: active (running) since 목 2017-05-04 12:20:23 KST; 14s ago
Docs: man:collectd(1)
man:collectd.conf(5)
Main PID: 2262 (collectd)
CGroup: /system.slice/collectd.service
mq2262 /usr/sbin/collectd
5월 04 12:20:23 localhost.localdomain collectd[2262]: plugin_load: plugin "disk" successfully loaded.
5월 04 12:20:23 localhost.localdomain collectd[2262]: plugin_load: plugin "interface" successfully loaded.
5월 04 12:20:23 localhost.localdomain collectd[2262]: plugin_load: plugin "load" successfully loaded.
5월 04 12:20:23 localhost.localdomain collectd[2262]: plugin_load: plugin "memory" successfully loaded.
5월 04 12:20:23 localhost.localdomain collectd[2262]: plugin_load: plugin "network" successfully loaded.
5월 04 12:20:23 localhost.localdomain collectd[2262]: disk plugin: The "UseBSDName" option is only support...ed.
5월 04 12:20:23 localhost.localdomain collectd[2262]: Plugin `interface' did not register for value `Uniqu...e'.
5월 04 12:20:23 localhost.localdomain collectd[2262]: Systemd detected, trying to signal readyness.
5월 04 12:20:23 localhost.localdomain collectd[2262]: Initialization complete, entering read-loop.
5월 04 12:20:23 localhost.localdomain systemd[1]: Started Collectd statistics daemon.
Hint: Some lines were ellipsized, use -l to show in full.
그 다음 influxdb에 데이터가 유입되는지 확인해 봅시다.
[root@localhost influxdb] influx
Visit https://enterprise.influxdata.com to register for updates, InfluxDB server management, and monitoring.
Connected to http://localhost:8086 version 0.10.0
InfluxDB shell 0.10.0
> show databases
name: databases
---------------
name
collectd
_internal
> use collectd
Using database collectd
> select * from cpu_value
1493866010372653000 localhost 1 percent steal 0
1493866010372654000 localhost 1 percent idle 100
1493866020349417000 localhost 0 percent user 0
1493866020349420000 localhost 0 percent system 0.10030090270812438
1493866020349422000 localhost 0 percent wait 0
1493866020349423000 localhost 0 percent nice 0
1493866020349425000 localhost 0 percent interrupt 0
1493866020349426000 localhost 0 percent softirq 0
1493866020349427000 localhost 0 percent idle 99.89969909729186
collectD에서 influxDB로 데이터가 제대로 잘 들어오고 있습니다.
Grafana
이제 이 influxDB를 grafana와 연결해서 시각적으로 데이터를 볼 수 있게 합니다.
grafana의 설치와 InfluxDb와의 연결은 간단합니다. grafana의 공식 documentation에 잘나와 있습니다.
Using InfluxDB in Grafana
grafana를 설치하셨다면 우선 data source 탭으로 들어갑니다. 여기서 아래와 같이 type을 influxdb로 선택한 후, influxdb에서 세팅한 데이터를 주고 받기 위한 http 세팅을 입력하고 저장합니다.
그러면 이제 대쉬보드로 가서 new dashboard를 선택합니다. 그 다음 graph를 선택하고 panel data source에 아까 세팅한 data source의 이름(저의 경우는 collectD)을 선택합니다. 그리고 저장을하고 대쉬보드로 가보면 아래와 같이 새로운 graph가 생긴것을 볼 수 있습니다.
예제에서는 별다른 쿼리문을 만들지 않고 바로 cpu_value만 보여주게 만들었지만, 대쉬보드를 만들때 쿼리문을 추가해서 자유롭게 원하는 데이터를 뽑아서 만들 수 있습니다.