InfluxDB, Telegraf, Grafana 를 활용한 Monitoring System 만들기(1)
- 보고 싶은 지표만 모아볼 수 있도록 커스터마이징이 유연할 것
- 다양한 지표 수집이 가능할 것 (system, database, network..)
- 수집, 저장, 조회 성능이 좋을 것 (실시간 모니터링이 가능 할 것)
- 설정이 간편할 것
- 이쁠 것 (보기 좋을 것)
What is InfluxDB ?
시계열DB는 이러한 시계열 데이터들을 효율적으로 저장할 목적으로 사용되며 Grafana 같은 대쉬보드 툴과 연계하여 모니터링 용도로 주로 사용됩니다.
Why InfluxDB?
이외 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
향후 운영관점에서 데이터가 늘어날 것을 대비하여 미리 용량이 충분한 위치로 데이터파일들을 옮기고 싶으면 아래와 같이 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
마치며..
기존에는 DB서버들의 OS 및 DB 모니터링 지표들을 10초 또는 60초 단위로 수집하였는데 지금은 1초 단위로 수집하여 Realtime 모니터링이 가능한 정도라고 보면 됩니다.(서버 1대댱 대략 100여개 메트릭)
적절한 모니터링 툴이 없는 스타트업의 경우 약간의 노력으로 왠만한 상용 솔루션 부럽지 않은 모니터링 툴을 만들 수도 있습니다.
내부적으로 DB모니터링 목적으로 시작하였으나 지금은 어뷰징탐지, 서비스트래픽, 어플리케이션성능 모니터링 용도로도 활용 범위가 넓어졌는데 이럴 수 있는 것은 정말 약간의 노력 만으로 괜찮은 모니터링 대시보드를 금방 만들 수 있기 때문입니다.
뭔가 모니터링 하고자하는 니즈가 있는 부서의 담당 개발자에게 데이터 수집 방법 및 Grafana로 대시보드 그리는 법 포함해서 30분 정도만 교육하면 얼마 안되서 바로 만들어서 활용하는 식입니다.
이처럼 시스템모니터링 용도뿐 아니라 서비스 반응을 실시간으로 모니터링하여 개선점 도출, 수정, 테스트, 배포 프로세스가 스피드있게 진행되어야 하는 DevOps 환경에서는 더욱 유용할 것입니다.
실제로 최근부터 InfluxData 라는 솔루션으로 Custom DevOps Monitoring 이라는 용도를 정의하고 세일즈하고 있기도 합니다.
이어서는 모니터링을 위한 데이터 수집 및 Grafana와 연계하여 모니터링 대시보드를 만드는 부분을 포스팅 하겠습니다.