Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Contents

소개

원래는 Prometheus를 기반으로 모니터링 시스템을 구성할 계획이었으나 여러 이유로 influxDB를 기반으로 하는 모니터링 시스템을 구성하게 됐다. 구성 과정을 기록으로 남긴다.

운영 중인 www.joinc.co.kr를 모니터링 한다. www.joinc.co.kr 서버는 AWS에 위치하고 있으므로 이론상 CloudWatch 만으로 모니터링 시스템 구성이 가능하다. 지금은 InfluxDB를 기반으로 모니터링 환경을 만들 계획이다. CloudWatch와 InfluxDB(혹은 Prometheus)와의 비교문서는 따로 정리하도록 하겠다.

Telegraf

Telegraf는 데이터를 수집하고 전송하는 소프트웨어다. MongoDB, MySQL, Redis, Ngix와 같은 애플리케이션을 비롯해서, cpu, memory, disk, 네트워크와 같은 시스템 정보, 컨테이너와 오케스트레이션 툴의 정보들을 포함한다. Telegraf는 플러그인 아키텍처를 지원하기 때문에 (이론적으로) 모든 종류의 데이터들을 수집 할 수 있다. Telegraf은 200개 이상의 프러그인을 통해서 다양한 메트릭을 수집 할 수 있다. 수집한 데이터는 InfluxDB Line Protocol, JSON, Graphite, Value, Nagios, Collectd로 전송 할 수 있다.

Telegraf는 GoLang으로 개발했다. npm, pip, gem과 같은 패키지관리 도구가 필요 없이 "하나의 파일(one file)"로 설치가 가능하다.

Influxdb

InfluxDB는 오픈소스 기반의 TSDB(Time series database)다. "시계열 데이터베이스"라고 부르기도 한다. 시간이 주요 축인 데이터를 저장하고 꺼내는데 특화된 데이터베이스다. IoT 센서 정보들 시스템 모니터링 정보들(CPU, Disk IO, 네트워크 트래픽, 위치정보)같이 일정 시간주기로 쌓이는 정보를 효과적으로 처리 할 수 있다.

Go언어로 개발됐기 때문에 외부의존성이 없다. 8086 포트를 통해서 데이터를 수신하며, 내장된 시간관리 함수를 이용해서 데이터를 저장하고 측정한다. 질의어가 SQL과 매우 유사하기 때문에 사용도 쉬운 편이다.

Grafana

Grafana는 저장된 데이터의 종류와 위치에 상관 없이, 질의를 하고 그 결과를 화면으로 보여주고(visualize), 알람을 전송하는 소프트웨어다.

Telegraf & InfluxDB & Grafana 아키텍처

모니터링 시스템은 "1. 메트릭 수집/전송, 2. 메트릭의 저장, 3. 저장된 메트릭의 분석&시각화" 의 3개 요소를 기본으로 한다. Telegraf가 메트릭 수집/전송을 InfluxDB는 메트릭의 저장, Grafana는 분석&시각화를 각각 담당한다. 이들 아키텍처는 아래와 같이 묘사 할 수 있다.

 아키텍처

구성도

시스템 구성도는 아래와 같다.

 InfluxDB 모니터링 구성도

  1. www.joinc.co.kr를 서비스 중인 EC2 서버에 Telegraf를 설치한다.
  2. 이 Telegraf는 EC2 시스템 정보와 함께, RDS(Mysql) 정보도 수집한다.
  3. Telegraf는 수집한 데이터를 InfluxDB로 전송한다.
  4. Grafana는 InfluxDB로 부터 데이터를 읽어서 시각화한다.
두 개 인스턴스 모두 Amazon Linux 2다.

InfluxDB 설치

yum 레포지토리를 추가하고
cat <<EOF | sudo tee /etc/yum.repos.d/influxdb.repo
[influxdb]
name = InfluxDB Repository - RHEL 7
baseurl = https://repos.influxdata.com/rhel/7/\$basearch/stable 
enabled = 1
gpgcheck = 1
gpgkey = https://repos.influxdata.com/influxdb.key
EOF
패키지를 인스톨하고 서비스를 실행한다.
# yum update
# yum install influxdb
# systemctl daemon-reload
# systemctl enable influxdb
# systemctl start influxdb
# systemctl status influxdb
● influxdb.service - InfluxDB is an open-source, distributed, time series database
   Loaded: loaded (/usr/lib/systemd/system/influxdb.service; enabled; vendor preset: disabled)
   Active: active (running) since Sun 2019-09-22 13:37:26 UTC; 1s ago
     Docs: https://docs.influxdata.com/influxdb/
 Main PID: 8817 (influxd)
   CGroup: /system.slice/influxdb.service
           └─8817 /usr/bin/influxd -config /etc/influxdb/influxdb.conf

8086 포트에 바인드하고 있는지 확인해보자.
# netstat -nap | grep 8086
tcp6       0      0 :::8086                 :::*                    LISTEN      8817/influxd        

www.joinc.co.kr 인스턴스 telegraf를 설치할 예정이다. telegraf는 8086으로 접근해야 하므로 security group을 미리 설정하자.

Telegraf 설치

www.joinc.co.kr 인스턴스에 telegraf를 설치한다. influxdb와 동일한 레포지토리에서 설치할 수 있다.
# cat <<EOF | sudo tee /etc/yum.repos.d/influxdb.repo
[influxdb]
name = InfluxDB Repository - RHEL 7
baseurl = https://repos.influxdata.com/rhel/7/\$basearch/stable 
enabled = 1
gpgcheck = 1
gpgkey = https://repos.influxdata.com/influxdb.key
EOF

# yum update
# yum install telegraf -y

Telegraf 설정파일을 수정하자. 설정파일은 /etc/telegraf/telegraf.conf 다.
[global_tags]

[agent]
    interval = "10s"
    debug = false
    hostname = "www.joinc.co.kr"
    round_interval = true
    flush_interval = "10s"
    flush_jitter = "0s"
    collection_jitter = "0s"
    metric_batch_size = 1000
    metric_buffer_limit = 10000
    quiet = false
    logfile = ""
    omit_hostname = false

[[outputs.influxdb]]
    urls = ["http://monitor.joinc.io:8086"]
    database = "joinc-monitoring"
    timeout = "0s"
    username = ""
    password = ""
    retention_policy = ""

[[inputs.cpu]]
    percpu = true
    totalcpu = true
    collect_cpu_time = false
    report_active = false
[[inputs.disk]]
    ignore_fs = ["tmpfs", "devtmpfs", "devfs"]
[[inputs.io]]
[[inputs.mem]]
[[inputs.net]]
[[inputs.system]]
[[inputs.swap]]
[[inputs.netstat]]
[[inputs.processes]]
[[inputs.kernel]]

  • hostname : 호스트이름으로 WHERE 문을 만들기 때문에, 유일하게 설정해야 한다.
  • urls : influxdb의 연결 정보
  • database : 정보가 저장될 데이터베이스 이름
telegraf를 실행한다.
# systemctl start telegraf.service

Influxdb 확인

influxdb에 모니터링 정보가 쌓이고 있는지 확인해보자. infulx를 CLI 툴로 이용해서 데이터베이스에 접근 할 수 있다.
# influx
Connected to http://localhost:8086 version 1.7.8
InfluxDB shell version: 1.7.8
> 

데이터베이스 목록을 확인해보자. 설정이 제대로 됐다면 joinc-monitoring 데이터베이스가 보일 것이다. 명령의 많은 부분이 MySQL과 비슷하다. show databases 명령으로 데이터베이스 목록을 확인 할 수 있다.
> show databases;
name: databases
name
----
_internal
joinc-monitoring
joinc-monitoring 데이터베이스가 보인다. InfluxDB는 scheama-less 데이터베이스로 스키마를 정의할 필요가 없다. telegraf에서 보내는 그대로 저장한다. use <database> 명령으로 데이터베이스를 이용 할 수 있다.
> use joinc-monitoring
Using database joinc-monitoring

SHOW measurements 명령으로 측정목록을 확인 할 수 있다.
> SHOW measurements
name: measurements
name
----
cpu
disk
diskio
kernel
mem
net
netstat
processes
swap
system

SELECT 쿼리로 cpu 모니터링 결과를 읽어보자. 그전에 cpu 테이블의 필드 값을 확인하자.
> HOW FIELD KEYS ON "joinc-monitoring" FROM cpu;
name: cpu
fieldKey         fieldType
--------         ---------
usage_guest      float
usage_guest_nice float
usage_idle       float
usage_iowait     float
usage_irq        float
usage_nice       float
usage_softirq    float
usage_steal      float
usage_system     float
usage_user       float
이 중 usage_system, usage_user, usage_idle, usage_iowait를 읽어보자.
> SELECT usage_system, usage_user, usage_idle, usage_iowait FROM cpu ORDER BY time desc LIMIT 10;
name: cpu
time                usage_system        usage_user          usage_idle        usage_iowait
----                ------------        ----------          ----------        ------------
1570205230000000000 0.10020040080169909 0.20040080160795476 99.59919839641957 0
1570205230000000000 0.10020040080169909 0.20040080160795476 99.59919839641957 0
1570205220000000000 0.10030090271065657 0.10030090270381484 99.79939819439169 0
1570205220000000000 0.10030090271065657 0.10030090270381484 99.79939819439169 0
1570205210000000000 0                   0.2008032128471516  99.79919678697021 0
1570205210000000000 0                   0.2008032128471516  99.79919678697021 0
1570205200000000000 0.10030090271065657 0.200601805416752   99.69909729392283 0
1570205200000000000 0.10030090271065657 0.200601805416752   99.69909729392283 0
1570205190000000000 0.20040080161274876 0.10020040080865268 99.69939879963361 0
1570205190000000000 0.20040080161274876 0.10020040080865268 99.69939879963361 0

Grafana

Grafana 설치

# cat /etc/yum.repos.d/grafana.repo
[grafana]
name=grafana
baseurl=https://packages.grafana.com/oss/rpm
repo_gpgcheck=1
enabled=1
gpgcheck=1
gpgkey=https://packages.grafana.com/gpg.key
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
Grafana 패키지를 설치한다.
# yum update
# yum install -y grafana
Grafana 서버를 실행한다. # systemctl start grafana-server

Grafana의 기본 서비스 포트번호는 3000이다. 브라우저로 연결해보자.

 Grafana 로그인 화면

관리자 아이디 패스워드는 "admin/admin"이다. 로그인 후 패스워드를 변경하자.

설정

Grafana 설정을 해보자. 먼저 "측정 데이터가 저장된 데이터 소스를 설정해야 한다."

 데이터 소스 설정

Add data source를 클릭하자.

 데이터 소스 선택

Prometheus에서 부터 MySQL, PostgreSQL같은 RDBMS, Azure Monitor, CloudWatch 까지 다양한 소스로 부터 데이터를 읽을 수 있다. 오늘의 목표인 InfluxDB를 선택하자.

 InfluxDB 설정

InfluxDB 설정이 나온다.
  • URL : InfluxDB 접근 URL이다. 같은 호스트에 설치돼 있으니 http://localhost:8086으로 설정한다.
  • Auth : 인증 관련된 설정은 전부 건너뛴다.
  • Database : joinc-monitoring
  • user/Password : 건너뛴다.
save and test를 하면 데이터 소스 설정이 끝난다.

대시보드 만들기

Grafana는 굉장히 다양한 기능을 가지고 있다. 여기에서 전부를 설명하지는 않을 것이다.

Create > Dashboard로 대시보드 작성 화면으로 갈 수 있다. 여기에서 쿼리와 그래프등을 설정해서 대시보드를 만들 수 있다.

 Dashboard 만들기

CPU의 usage_system과 usage_user를 출력했다. Add Query를 이용해서 여러 개의 쿼리를 만들 수 있다. 쿼리를 구성하는 필드들 FROM, WHERE, SELECT, GROUP BY 등을 보면 알겠지만 그냥 SQL 문을 쉽게 작성 할 수 있도록 표현 한 것일 뿐이다.
  • FROM : cpu 측정 값을 가져온다.
  • WHERE : 지금은 호스트가 하나이지만, 호스트가 여러 개일 경우 WHERE 조건 절에 host 이름을 설정해서 각 호스트에 대한 그래프를 그릴 수 있다.
  • SELECT : 가져올 필드를 설정한다. 필드에 대한 펑션도 설정할 수 있다. 나는 mean(평균)을 적용했다.
대시보드는 딱 이정도에서 마무리 한다.

정리

  • 대략 개념은 잡았으니 Prometheus로 넘어간다.
  • Grafana의 대시보드 알람은 그냥 몇 번 시행착오 거치면 설정 할 수 있다.
  • 알람은 따로 다룰 생각이다. Grafana와 Opsgenie 조합이면 어떨까 싶다.
  • AWS의 CloudWatch와 조합해서 사용 할 필요가 있을까 ? 시각적으로 확실히 도움이 되기는 한데, 굳이 그럴 필요는 없어 보인다. 확실히 grafana에 비해서 예쁘지는 않지만 대시보드/알람 관리/람다/NoOps/SNS 등으로 충분해 보이기 때문이다.