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

데이터 저장소로 InfluxDB를 설치 했으면 다음으로는 모니터링 데이터를 수집해야 할 것입니다.

데이터 수집에는 다양한 방법이 있지만 여기서는 Telegraf를 이용하는 방법을 설명합니다.

Telegraf를 선택한 이유는 InfluxDB와 마찬가지로 Go언어로 개발되어 설치가 매우 간편하고 다양한 종류의 수집/저장 플러그인을 간단한 설정으로 사용 가능하기 때문입니다.

실제 MariaDB 5.5, mysql 5.6 에서 약 1년 넘게 사용해본 결과 별 다른 이슈 없이 만족스럽게 사용하고 있고 기능상 조금 아쉬웠던 부분도 비교적 활발하게 업데이트되고 있는 것 같습니다.

플러그인은 Input/Output Plugin 으로 구분되는데 Input Plugin은 수집하는 대상을 의미하며 여기서는 system 및 mysql을 모니터링 대상으로 수집합니다.

Output Plugin은 수집한 데이터를 저장하는 Plugin으로서 주로 InfluxDB나 Graphite 같은 시계열DB가 될 수 있고 일반 파일이나 Kafka같은 메시징 시스템이 될 수도 있습니다.

다양한 Plugin관련 정보는 Github을 참고하면 됩니다.

Architecture

설치에 앞서 모니터링 시스템 구성은 간단하게 아래와 같이 생각하였습니다.

각 DB서버에 모니터링 데이터 수집 agent로서 telegraf나 FluentD 또는 자체 개발한 프로그램 등을 백그라운드로 실행하여 모니터링 서버로 push하는 방식입니다.

이런 구성에서는 매번 서버가 추가 될 때마다 해당 서버에 agent를 설치해줘야 하는 번거로움이 있습니다.

그래도 모니터링 서버를 통해서 다른서버를 접근할 수 없어 보안상 안전하고 모니터링 서버에 수집 부하가 집중되는 문제를 피할 수 있을 것입니다.

반대로 아래 그림과 같이 모니터링 서버에서 각 서버로 접속하여 get하는 방식으로 구성할 수도 있습니다.이렇게 구성할 경우 모니터링 대상 서버가 추가될 때마다 agent용 프로그램들을 설치할 필요 없이 간단히 설정만 추가하면 되는 편리함은 있습니다. 그러나 모니터링 서버가 보안 위험에 노출될 경우 다른 서버들로 접속이 가능한 위험이 있습니다.

특히 모니터링 대상 서버가 DB서버라면 심각한 보안 위험요소가 될 수 있습니다. 또한 모니터링 서버에 수집 부하가 집중되는 문제도 있어서 이 방법은 고려하지 않고 agent에서 push 하는 방식으로 구성하였습니다.

Preparation (Optional)

Telegraf 설치에 앞서 사전 준비로 InlfuxDB 서버의 호스트 정보를 /etc/hosts 에 추가 합니다.

이 부분은 생략해도 되지만 향후 모니터링 서버를 이관하게 될 경우를 대비해서 편의상 설정하는 것으로 보면 됩니다.

1
2
3
4
$ echo "" >> /etc/hosts
$ echo "# InfluxDB Server (by bigfoot)" >> /etc/hosts
$ echo "192.168.100.11 influxdb" >> /etc/hosts
$ cat /etc/hosts

제대로 접속되는지 포트 스캔으로 테스트 해봅니다.

1
2
$ nc -z 192.168.100.11 8086
Connection to 192.168.100.11 8086 port [tcp/d-s-n] succeeded!

telegraf 에서 mysql로 접속할 수 있도록 아래와 같이 DB유저도 생성해 줍니다.  기존에 있던 계정을 사용하면 생략해도 되지만 모니터링용 DB유저를 구분하기 위해 별도 유저를 추가 하였습니다.

1
2
MySQL> grant all on *.* to 'telegraf'@'127.0.0.1' identified by "p@$$w0rd";
Query OK, 0 rows affected (0.00 sec)

Installation

사전 준비가 끝났다면 아래와 같이 Telegraf를 다운 받아 설치 합니다.

Redhat 계열은 아래와 같이 하면 되고 타 플랫폼은 온라인 메뉴얼을 참고 합니다.

1
2
3
4
5
$ wget https://dl.influxdata.com/telegraf/releases/telegraf-0.13.1.x86_64.rpm
... 안되면...
$ curl -O https://dl.influxdata.com/telegraf/releases/telegraf-0.13.1.x86_64.rpm
# Install
$ sudo yum localinstall telegraf-0.13.1.x86_64.rpm

앞서 언급했듯이 설치가 매우 간단합니다.

설치가 끝났으면 설정파일을 생성하고 기동해주기만 하면 됩니다.

참고로 글을 쓰는 현재(2016년 7월) telegraf 최신 버전은 0.13.1 이고 제가 사용하던 버전은 0.10.2 버전 이었습니다.

원래는 쓰고 있는 버전 기준으로 포스트를 작성하려 했으나 최신 버전의 telegraf에서 mysql 관련 수집 데이터가 더 많아 최신버전 기준으로 다시 테스트하여 포스트를 작성하였습니다.

기존 telegraf에서는 show global status 와 user별 thread수 정도만 수집되었고 그외 필요한 부분은 따로 스크립트를 작성해서 수집했었는데 지금은 온전히 telegraf만으로 가능하게 되었습니다.

https://github.com/influxdata/telegraf/pull/889/commits/bac3dd5a837b343b2db2e19855c4f6fb846faeb3

업데이트 될수록 플러그인들의 기능이 점점 좋아지는 것 같으니 최신 버전이 나오면 한번씩 관심을 갖고 보면 좋을 것 같습니다.

설치하면 /etc/telegraf 에 telegraf.conf 파일이 생성되어 있는데 원하는 플러그인 사용을 위해 다시 생성합니다.

아래는 각종 system 모니터링 지표 및 MySQL 모니터링 데이터를 수집하고 InfluxDB로 저장하도록 샘플 telegraf.conf 를 생성하는 예시입니다.

1
2
$ cd /etc/telegraf
$ telegraf -sample-config -input-filter cpu:disk:kernel:mem:net:netstat:system:mysql -output-filter influxdb > telegraf.conf

이렇게 생성된 설정 파일에 접속정보나 기타 필요한 정보를 수정해서 telegraf 를 기동합니다.

-input-filter 에 들어가는 값 중 system 모니터링 관련 수집 가능한 데이터는 Github의 해당 플러그인 파일들을 보면 대략 알 수 있습니다.

https://github.com/influxdata/telegraf/tree/master/plugins/inputs/system

mysql 관련 수집 정보를 보려면 Github의 MySQL 플러그인 소스를 참고하면 됩니다.

Go언어를 몰라도 소스내에 있는 쿼리나 MySQL명령어들을 보면 대략 알 수 있습니다.

https://github.com/influxdata/telegraf/blob/master/plugins/inputs/mysql/mysql.go

이처럼 다른 input 플러그인도 사용하기 전에 어떤 데이터를 수집하는지 궁금하면 소스코드를 참고 하는 것도 좋을 것 같습니다.

설정파일은 크게 agent / output plugin / input plugin  세개의 영역으로 구분 됩니다.

agent 설정은 수집 및 전송 주기를 설정하는데 여기서는 실시간 모니터링을 위해 1초마다 수집하고 5초마다 전송하도록 설정하였습니다. 5초마다 전송하는 이유는 나중에 grafana로 볼때 auto refresh 주기가 5초여서 거기에 맞추었습니다.  (필요하면 주기를 더 줄일 수도 있지만 5초를 적정선으로 보고 설정 하였습니다.)

또한 호스트명을 원래의 호스트명과 다르게 지정하고 싶으면 hostname 항목에 지정하면 되는데 여기서는 mytest1로 하였습니다.

hostname은 influxdb에 저장될 때 모든measurement(table)에 tag(indexed column)로 지정된다고 보면 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
[agent]
 interval = "1s"
 round_interval = true
 metric_batch_size = 1000
 metric_buffer_limit = 10000
 collection_jitter = "0s"
 flush_interval = "5s"
 flush_jitter = "0s"
 debug = false
 quiet = false
 hostname = "mytest1"
 omit_hostname = false

output plugin 설정은 /etc/hosts 파일에 추가했던 influxdb로 지정합니다.

그리고 influxdb에 저장될 database명은 기본 값은 telegraf인데 여기서는 구분을 위해 my_telegraf_test로 설정 하였습니다.

1
2
3
4
5
6
7
[[outputs.influxdb]]
 urls = ["http://influxdb:8086"] # required
 database = "my_telegraf_test" # required
 precision = "s"
 retention_policy = "default"
 write_consistency = "any"
 timeout = "5s"

input plugin 설정에서 system모니터링 관련해서는 추가로 설정할 부분은 딱히 없으나 필요하면 설정파일의 주석을 참고하여 수정하면 됩니다.

mysql 관련 설정은 접속을 위해 앞서 만들어둔 telegraf 유저와 패스워드를 설정합니다.

기본적으로 show global status 와 show global variables 항목들은 모두 수집하는데 그 외 필요한 것들은 ture/false 로 설정할 수 있습니다.  여기서는 show slave status 항목만 추가로 수집하도록 설정 하였습니다.

그리고 show global variables 는 사실상 자주 수집할 필요가 없어서 설정 마지막 부분에 interval_slow 값으로 보관주기를 따로 제어하는 것도 볼 수 있습니다. 여기서는 30분으로 되어 있습니다.

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
[[inputs.mysql]]
 servers = ["telegraf:p@$$w0rd@tcp(127.0.0.1:3306)/"]
 ## the limits for metrics form perf_events_statements
 perf_events_statements_digest_text_limit = 120
 perf_events_statements_limit = 250
 perf_events_statements_time_limit = 86400
 #
 ## if the list is empty, then metrics are gathered from all databasee tables
 table_schema_databases = [ ]
 #
 ## gather metrics from INFORMATION_SCHEMA.TABLES for databases provided above list
 gather_table_schema = false
 #
 ## gather thread state counts from INFORMATION_SCHEMA.PROCESSLIST
 gather_process_list = false
 #
 ## gather auto_increment columns and max values from information schema
 gather_info_schema_auto_inc = false
 #
 ## gather metrics from SHOW SLAVE STATUS command output
 gather_slave_status = true
 #
 ## gather metrics from SHOW BINARY LOGS command output
 gather_binary_logs = false
 #
 ## gather metrics from PERFORMANCE_SCHEMA.TABLE_IO_WAITS_SUMMART_BY_TABLE
 gather_table_io_waits = false
 #
 ## gather metrics from PERFORMANCE_SCHEMA.TABLE_LOCK_WAITS
 gather_table_lock_waits = false
 #
 ## gather metrics from PERFORMANCE_SCHEMA.TABLE_IO_WAITS_SUMMART_BY_INDEX_USAGE
 gather_index_io_waits = false
 #
 ## gather metrics from PERFORMANCE_SCHEMA.EVENT_WAITS
 gather_event_waits = false
 #
 ## gather metrics from PERFORMANCE_SCHEMA.FILE_SUMMARY_BY_EVENT_NAME
 gather_file_events_stats = false
 #
 ## gather metrics from PERFORMANCE_SCHEMA.EVENTS_STATEMENTS_SUMMARY_BY_DIGEST
 gather_perf_events_statements = false
 #
 ## Some queries we may want to run less often (such as SHOW GLOBAL VARIABLES)
 interval_slow = "30m"

참고로 한 서버에서 포트로 구분하여 mysql을 멀티인스턴스로 운영하는 경우 [[inputs.mysql]] 섹션만 추가해주면 모두 수집 가능합니다.

1
2
3
4
5
6
7
8
9
[[inputs.mysql]]
 servers = ["telegraf:p@$$w0rd@tcp(127.0.0.1:3306)/"]
 gather_slave_status = true
[[inputs.mysql]]
 servers = ["telegraf:p@$$w0rd@tcp(127.0.0.1:3307)/"]
 gather_slave_status = true
[[inputs.mysql]]
 servers = ["telegraf:p@$$w0rd@tcp(127.0.0.1:3308)/"]
 gather_slave_status = true

설정이 끝났으면 아래와 같이 telegraf를 기동 합니다.

1
2
3
4
5
6
7
8
[root@mytest1 telegraf]#
[root@mytest1 telegraf]# service telegraf start
Starting the process telegraf [ OK ]
telegraf process was started [ OK ]
[root@mytest1 telegraf]#
[root@mytest1 telegraf]# service telegraf status
telegraf Process is running [ OK ]
[root@mytest1 telegraf]#

수집 및 전송 과정에 에러가 없는지 확인하기 위해 로그 파일을 확인합니다.

주로 influxdb 또는 mysql로 접속이 실패하거나 수집하는 시간이 설정한 수집주기 보다 오래 걸릴 경우일텐데 로그파일 내용을 보고 적절히 조치하면 됩니다.

아래와 같이 Error 정보가 없다면 정상입니다.

1
2
3
4
5
6
7
8
9
10
11
12
[root@mytest1 telegraf]# tail -f /var/log/telegraf/telegraf.log
2016/07/24 00:46:46 Output [influxdb] wrote batch of 385 metrics in 34.113251ms
2016/07/24 00:46:51 Output [influxdb] buffer fullness: 385 / 10000 metrics. Total gathered metrics: 5657. Total dropped metrics: 0.
2016/07/24 00:46:51 Output [influxdb] wrote batch of 385 metrics in 37.844375ms
2016/07/24 00:46:56 Output [influxdb] buffer fullness: 385 / 10000 metrics. Total gathered metrics: 6042. Total dropped metrics: 0.
2016/07/24 00:46:56 Output [influxdb] wrote batch of 385 metrics in 33.971023ms
2016/07/24 00:47:01 Output [influxdb] buffer fullness: 385 / 10000 metrics. Total gathered metrics: 6427. Total dropped metrics: 0.
2016/07/24 00:47:01 Output [influxdb] wrote batch of 385 metrics in 27.555229ms
2016/07/24 00:47:06 Output [influxdb] buffer fullness: 385 / 10000 metrics. Total gathered metrics: 6812. Total dropped metrics: 0.
2016/07/24 00:47:06 Output [influxdb] wrote batch of 385 metrics in 32.376433ms
2016/07/24 00:47:11 Output [influxdb] buffer fullness: 385 / 10000 metrics. Total gathered metrics: 7197. Total dropped metrics: 0.
2016/07/24 00:47:11 Output [influxdb] wrote batch of 385 metrics in 34.905804ms

InfluxDB Data Check

실제 수집이 잘 되었는지 influxdb에서 확인해 봅니다.

1
2
3
4
5
6
7
8
9
10
11
[root@monsvr ~]# 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
my_telegraf_test

설정한대로 my_telegraf_test database가 생성되어 있어야 합니다.

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
> use my_telegraf_test
Using database my_telegraf_test
>
> show measurements
name: measurements
------------------
name
cpu
disk
kernel
mem
mysql
mysql_variables
net
netstat
system
> show tag keys from mysql
name: mysql
-----------
tagKey
host
server
> show tag values from mysql with key=host
name: hostTagValues
-------------------
host
mytest1
> show field keys from mysql
name: mysql
-----------
fieldKey
aborted_clients
aborted_connects
access_denied_errors
busy_time
bytes_received
bytes_sent
commands_admin_commands
commands_alter_db
... 생략 ...
...(show slave status 관련 정보 추가된 것 확인)...
slave_Connect_Retry
slave_Exec_Master_Log_Pos
slave_Last_Errno
slave_Last_IO_Errno
slave_Last_SQL_Errno
slave_Master_Port
slave_Master_Server_Id
slave_Read_Master_Log_Pos
slave_Relay_Log_Pos
slave_Relay_Log_Space
slave_Seconds_Behind_Master
slave_Skip_Counter
slave_Slave_IO_Running
slave_Slave_SQL_Running
slave_Until_Log_Pos
slave_heartbeat_period
slave_open_temp_tables
slave_received_heartbeats
slave_retried_transactions
... 생략 ...
threadpool_idle_threads
threadpool_threads
threads_cached
threads_connected
threads_created
threads_running
> select host, slave_Slave_IO_Running, slave_Slave_SQL_Running, slave_Seconds_Behind_Master from mysql limit 10
name: mysql
-----------
time host slave_Slave_IO_Running slave_Slave_SQL_Running slave_Seconds_Behind_Master
1469294365000000000 mytest1 1 1 0
1469294366000000000 mytest1 1 1 0
1469294367000000000 mytest1 1 1 0
1469294368000000000 mytest1 1 1 0
1469294369000000000 mytest1 1 1 0
1469294370000000000 mytest1 1 1 0
1469294371000000000 mytest1 1 1 0
1469294372000000000 mytest1 1 1 0
1469294373000000000 mytest1 1 1 0
1469294374000000000 mytest1 1 1 0

input plugin에 지정한대로 다수의 measurement가 생성되어 있고 조회해보면 수집한 데이터가 저장되고 있음을 확인할 수 있습니다. mysql 모니터링 항목을 더 지정하면 관련measurement가 더 나타날 수 있습니다.

마치며...

모니터링 데이터 수집 agent로서 무언가 설치할 경우 이로 인한 오버헤드를 고려하지 않을 수 없을텐데요.

수집하는 메트릭 수에 어느정도 좌우되겠지만 아주 무지막지하게 많은 데이터를 수집하는게 아니라면 telegraf 로 인한 오버해드는 무시해도 될 정도로 미미하다고 보면 될 것 같습니다.

실제로 약 100여개의 메트릭(show global status, show slave status, system monitoring)을 수집하고 5초에 한번씩 influxdb로 전송하는데 문제없이 운영하고 있습니다.

실제 CPU사용량을 보아도 전체 5/3200% 이내로 사용하는 것을 볼 수 있습니다. (제일 하단 파란색)

이어서는 Grafana를 설치하고 InfluxDB와 연동하여 모니터링 대시보드를 디자인하는 과정을 포스팅하겠습니다.


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