InfluxDB, Telegraf, Grafana 를 활용한 Monitoring System 만들기(1)

모니터링 관련하여 많은 오픈소스 솔루션이 있지만 만족스러운 솔루션을 찾기 어려운 것도 사실입니다.

개인적으로는 다음과 같은 점을 기대했는데...

  • 보고 싶은 지표만 모아볼 수 있도록 커스터마이징이 유연할 것
  • 다양한 지표 수집이 가능할 것 (system, database, network..)
  • 수집, 저장, 조회 성능이 좋을 것 (실시간 모니터링이 가능 할 것)
  • 설정이 간편할 것
  • 이쁠 것 (보기 좋을 것)

그러던 중 Grafana를 알게 되었고 투박한 RRD기반의 그래프와 다소 아쉬움이 있는 상용모니터링 시스템만 보던 저에게는 신선한 충격이었습니다.

Grafana의 아름다움과 유연함에 반하여 알아보니 Grafana는 그냥 대시보드만 이쁘게 그려주는 툴일 뿐 데이터 저장과 수집을 위해서는 별도 솔루션이 필요했습니다.

처음에는 Graphite를 저장소로 사용하고 데이터 수집은 입맛에 맞는 솔루션이 없어 쉘스크립트로 자체 제작했었는데 설치도 까다롭고 번거로웠지만 Grafana의 아름다움을 위해서는 참을 수 있었습니다.

그렇게 1년 반 가까이 잘 사용하다 InfluxDB라는 솔루션을 알게되었고 지금은 성능과 편리함 때문에 InfluxDB + Telegraf + Grafana 조합으로 굳혀서 사용하고 있습니다.

물론 이 조합도 100% 만족스럽다고 할 수는 없겠으나 왠만한 모니터링 시스템 부럽지 않은 퀄리티는 될거라고 봅니다.

InfluxDB(저장), Telegraf(수집), Grafana(대시보드) 순서로 약 3~4회에 걸쳐 포스팅할 계획입니다.

화면 캡쳐와 부수적으로 확인하는 내용이 많아 다소 긴 내용 같지만 실제 설치와 구성은 매우 간편합니다. (30분 내 가능)

OS 및 mysql 모니터링 중심으로 설명하지만 그외 다른 모니터링도 본 포스트와 온라인 메뉴얼을 참고하면 별로 어렵지 않게 구축할 수 있을 것입니다.

저처럼 기존 모니터링 시스템에 불만이 많거나 새로 구축하고 싶은 분들께 유용한 참고가 되면 좋을 것 같습니다.

 What is InfluxDB ?

InfluxDB는 시계열(Time-series) 데이터를 저장하는 데이터저장소 입니다.

시계열 데이터란 시간의 흐름에 따라 저장하는 데이터로서 서버, DB, 네트웍, 스토리지와 같은 IT인프라 모니터링을 위한 각종 데이터들, 서비스 반응을 확인하기위한 각종 지표들(동시접속자, PV 등), 요즘 뜨고 있는 IOT기기들의 각종 수집 데이터들, 다이어트를 위해 매일 기록하는 내 몸무게 등등 활용 목적에 따라 무척 다양할 수 있습니다.

시계열DB는 이러한 시계열 데이터들을 효율적으로 저장할 목적으로 사용되며 Grafana 같은 대쉬보드 툴과 연계하여 모니터링 용도로 주로 사용됩니다.

 Why InfluxDB?

시계열DB를 선택함에 있어 가장 중요하게 고려할 점은 저장 및 조회 성능, 저장 공간 효율성, 유연한 확장가능성을 들 수 있을 것 같은데 그런 점에서 InfluxDB는 괜찮은 선택인 것 같습니다.

시계열DB 관련 트렌드 자료를 보아도 기존에 많이 사용되던 RRDTool 이나 Graphite 를 제치고 압도적인 1위로 성장하고 있음을 볼 수 있는데 아직 정식 1.0 버전이 출시되지 않은 상태임을 고려하면 대단한 발전인 듯 합니다.

작년 하반기까지는 Graphite 를 사용하여 Grafana와 연계하여 DB모니터링 툴을 만들어 사용하고 있었는데 다음과 같은 이유로 InfluxDB로 교체하여 지금껏 사용하고 있습니다.

Graphite는 파이썬으로 개발되었고 메트릭 하나당 파일 한개씩 생성하는 구조로 동시 IO가 많은 상황에서는 좀 취약한 면이 있습니다.

즉, N개 메트릭 저장시 N개의 파일IO를 일으켜야 하는 방식이라 동시에 많은 수의 메트릭을 저장한다면 클러스터링으로 서버 수를 늘려서 커버해야 했습니다.

이에 비해서 InfluxDB는 Go언어로 개발되었고  LSM(Log Structured Merge) Tree를 개량하여 시계열 데이터 저장에 최적화되도록 자체 개발한 TSM(Time Structured Merge) Tree를 스토리지 엔진으로 사용합니다. 그래서 동시성 및 IO처리 성능이 뛰어나며 압축 알고리즘도 적용하여 저장 용량 효율면에서  뛰어납니다. (정확히 말하면 처음에는 LevelDB(LSM Tree)를 스토리지 엔진으로 사용하였으나 0.10 버전부터 TSM Tree를 사용하고 있습니다.)

또한 Graphite는 더이상 업데이트가 안되는 듯하나  InfluxDB는 활발하게 업데이트되고 있는데 글을 쓰고 있는 현재 0.13 버전이 최신 버전이며 올여름에 1.0출시 예정이라고 합니다.

이외 InfluxDB의 주요 특징으로는 다음과 같은 점을 들 수 있습니다.

  • 오픈소스로서 MIT 라이센스
  • 의존 관계가 없어 설치가 매우 간편함.
  • SQL-like 문법을 사용하여 사용에 친숙함.
  • Schemaless 구조.
  • 클러스터링을 지원하여 확장 가능.
  • Grafana 와의 연계가 훌륭 함.

Let's Start InfluxDB

Redhat & CentOS 에서의 설치 예는 다음과 같습니다. (타 플랫폼은 온라인 메뉴얼 참고)

1
2
3
4
$ su - 
$ 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
$ service influxdb start

설치하면 /etc/influxdb/influxdb.conf 로 설정파일이 생기며 데이터파일들은 /var/lib/influxdb 에 생깁니다.

향후 운영관점에서 데이터가 늘어날 것을 대비하여 미리 용량이 충분한 위치로 데이터파일들을 옮기고 싶으면 아래와 같이 influxdb를 정지한 다음  데이터파일들을 옮긴 후 설정 파일을 수정하고 influxdb 를 다시 기동 하면 됩니다. (#여기# 라고 표시한 부분)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
$ service influxdb stop
$
$ mv /var/lib/influxdb /data2/influxdb_data
$
$ vi /etc/influxdb/influxdb.conf
...
 [meta]
 # Controls if this node should run the metaservice and participate in the Raft group
 enabled = true
 # Where the metadata/raft database is stored
 dir = "/data2/Influxdb_data/meta" #여기#
 bind-address = ":8088"
 retention-autocreate = true
 election-timeout = "1s"
 heartbeat-timeout = "1s"
 leader-lease-timeout = "500ms"
 commit-timeout = "50ms"
 cluster-tracing = false
...
 [data]
 # Controls if this node holds time series data shards in the cluster
 enabled = true
 dir = "/data2/Influxdb_data/data" #여기#
 wal-dir = "/data2/Influxdb_data/wal" #여기#
 wal-logging-enabled = true
 data-logging-enabled = true
...
 [hinted-handoff]
 enabled = true
 dir = "/data2/Influxdb_data/hh" #여기#
 max-size = 1073741824
 max-age = "168h"
 retry-rate-limit = 0
...
 [admin]
 enabled = true
 bind-address = ":8083"
 https-enabled = false
 https-certificate = "/etc/ssl/influxdb.pem"
 [http]
 enabled = true
 bind-address = ":8086"
 auth-enabled = false
 log-enabled = false
 write-tracing = false
...
:wq
$ service influxdb start

데이터를 주고 받을 때 http 통신으로 8086 포트를 이용하는데 포트를 변경하고 싶으면 설정파일에서 수정 후 restart 하면 됩니다.

그리고 8083 포트는 어드민 페이지 접속 포트인데 아래와 같이 접속하여 간편하게 데이터 확인 및 유저 생성, 데이터 보관 주기 설정(retention policy)과 같은 어드민 설정도 가능합니다.

터미널에서는 influx라고 입력하면 influxdb 관리 툴에 접속되며 쿼리 및 운영작업이 가능합니다. 

 Simple Data Test

논리적인 구조는 간단히 다음과 같은 명칭으로 구성되어 있습니다.

  • database :  set of measurements
  • measurement : table
  • tag : indexed column
  • field : no indexed column

아래는 InfluxQL(Influxdb Query Language) 로 데이터 입력 및 조회 하는 예시입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
[root@devdb:/root]# 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
_internal
mydb
telegraf
melon
>
> create database testdb
>
> use testdb 
Using database testdb
>
> show measurements
>
> insert devdb,mon_type=os,metric=cpu_idle value=88.20
>
> show measurements
name: measurements
------------------
name
devdb
> select * from devdb
name: devdb
-----------
time metric mon_type value
1463151090146831513 cpu_idle os 88.2
>
> insert devdb,mon_type=os,metric=cpu sys=11,user=15,io_wait=10
> insert devdb,mon_type=os,metric=cpu sys=11,user=15,io_wait=11,idle=63
>
> select * from devdb
name: devdb
-----------
time idle io_wait metric mon_type sys user value
1463151090146831513 cpu_idle os 88.2
1463151107975728431 10 cpu os 11 15
1463151113823628131 63 11 cpu os 11 15
>

insert devdb,mon_type=os,metric=cpu sys=11,user=15,io_wait=10

이 insert 문으로 예를 들면 다음과 같습니다.

  • measurement : devdb
  • tag key : mon_type, metric
  • tag value : os(mon_type), cpu(metric)
  • field key : sys, user, io_wait
  • field value : 11(sys), 15(user), 10(io_wait)

Schemaless 구조라 measurement나 tag, filed 를 생성하는 DDL을 수행하지 않고 바로 insert 하는 것을 볼 수 있습니다. 별로 중요한 건 아니지만 한가지 특이한 점은 출력 결과가 tag, field 가 구분되어 나오지 않고 단순히 알파벳 순서로 나열되어 나옵니다.

아래는 curl 을이용하여 http 통신으로 데이터를 입력하고 확인하는 예시입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@devdb:/root]#
[root@devdb:/root]# curl -i -XPOST 'http://localhost:8086/write?db=testdb' --data-binary 'devdb,mon_type=os sys=30,user=15,io_wait=15,idle=40'
HTTP/1.1 204 No Content
Request-Id: 0d157f64-191c-11e6-af10-000000000000
X-Influxdb-Version: 0.10.0
Date: Fri, 13 May 2016 15:04:55 GMT
Connection: close
[root@devdb:/root]# 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
>
> use testdb
Using database testdb
>
> select * from devdb
name: devdb
-----------
time idle io_wait metric mon_type sys user value
1463151090146831513 cpu_idle os 88.2
1463151107975728431 10 cpu os 11 15
1463151113823628131 63 11 cpu os 11 15
1463151895067151010 40 15 os 30 15

 마치며..

Graphite에서 InfluxDB로 교체 이후 확실히 체감 속도도 빠르고 저장 용량이나 Grafana와 유연하게 연계하는 부분등 여러모로 만족하며 사용하고 있습니다.

기존에는 DB서버들의 OS 및 DB 모니터링 지표들을 10초 또는 60초 단위로 수집하였는데 지금은 1초 단위로 수집하여 Realtime 모니터링이 가능한 정도라고 보면 됩니다.(서버 1대댱 대략 100여개 메트릭)

적절한 모니터링 툴이 없는 스타트업의 경우 약간의 노력으로 왠만한 상용 솔루션 부럽지 않은 모니터링 툴을 만들 수도 있습니다.

내부적으로 DB모니터링 목적으로 시작하였으나 지금은 어뷰징탐지, 서비스트래픽, 어플리케이션성능 모니터링 용도로도 활용 범위가 넓어졌는데 이럴 수 있는 것은 정말 약간의 노력 만으로 괜찮은 모니터링 대시보드를 금방 만들 수 있기 때문입니다.

뭔가 모니터링 하고자하는 니즈가 있는 부서의 담당 개발자에게 데이터 수집 방법 및 Grafana로 대시보드 그리는 법 포함해서 30분 정도만 교육하면 얼마 안되서 바로 만들어서 활용하는 식입니다.

이처럼 시스템모니터링 용도뿐 아니라 서비스 반응을 실시간으로 모니터링하여 개선점 도출, 수정, 테스트, 배포 프로세스가 스피드있게 진행되어야 하는 DevOps 환경에서는 더욱 유용할 것입니다.

실제로 최근부터 InfluxData 라는 솔루션으로 Custom DevOps Monitoring 이라는 용도를 정의하고 세일즈하고 있기도 합니다.

이어서는 모니터링을 위한 데이터 수집 및 Grafana와 연계하여 모니터링 대시보드를 만드는 부분을 포스팅 하겠습니다.

# 추가 내용 (2016.07)

Clustering 기능은 0.12.0 버전 부터 오픈소스로는 지원하지 않고 비용을 지불하고 InfluxData라는 솔루션의 서비스로 이용해야 한다고 합니다.

즉, 오픈소스로는 standalone 모드로만 운영 가능한데 대신 Influx Relay라는 별도 오픈소스 프로젝트로 HA 기능을 구현할 수는 있다고 합니다.

아래 링크는 HA를 구현하는 다양한 방법에 대한 소개입니다.


Popit은 페이스북 댓글만 사용하고 있습니다. 페이스북 로그인 후 글을 보시면 댓글이 나타납니다.