구축 :
InfluxDB, Grafana :
https://computingforgeeks.com/install-grafana-and-influxdb-on-centos-7/
telegraf
https://computingforgeeks.com/monitor-linux-system-with-grafana-and-telegraf/
======================================================
서버의 관제 (Monitoring) 에 대해서
DevOps의 역량이 점점 중요해지면서, 개발자가 서버의 운영에도 적극 개입하게 되었습니다. 서버의 리소스 뿐만 아니라 다른 시계열 데이터로 된 지표들을 미리 관제하여 서비스에 이상이 생겼음을 즉시 통보 받을 수 있어야합니다. 과거 시스템 관리자로부터 통보 받던 방식은 관제 대상이 제한적이라는 한계가 있습니다.
이 글에서는 1) 오픈소스로 공개된 influxdata의 tsdb(Time Series DataBase)인 influxdb와 collector인 telegraf를 통해 시계열 데이터를 적재하고, 2) 오픈소스 대시보드인 grafana 를 통해 관제 대시보드 구성 및 알림 통보 (alert)를 구성하여, 3) 특정 상황에서 사용자가 정의한 동작을 수행하도록 하는 방법을 설명합니다.
시스템 구조
먼저, 각 서버에는 서비스와 telegraf 서비스가 동작합니다. telegraf는 서비스와 OS의 리소스를 모아서 (collect) influxdb에 적재합니다. 물론 influxdb의 http 프로토콜을 통해 개발자가 원하는 데이터를 직접 적재할 수 도 있습니다. influxdb는 서비스 그룹당 하나로 구성됩니다. 마지막으 로 grafana를 통해 influxdb의 데이터를 조회하여 대시보드로 구성합니다. 관제 대상 중 grafana의 alert 기능을 통해 slack으로 통보하거나, webhook을 통해 개발자가 정의한 동작을 수행하도록 할 수 있습니다.
데이터의 흐름과 동작은 다음과 같습니다:
- telegraf에서 influxdb로 OS 리소스 데이터 적재
- telegraf에서 influxdb로 잘 알려진 서비스 데이터 적재
- 서비스에서 influxdb로 직접 적재
- grafana에서 influxdb를 조회하여 차트 및 대시보드 구성
- grafana에서 구성한 차트에 대해 slack 통보 추가
- grafana에서 구성한 차트에 대해 webhook 추가
시작하기
서비스 endpoints
로컬 mac os에서 시스템을 구성하는 방법을 설명 하겠습니다. 먼저 아래와 같은 구성으로 endpoint를 구성 하겠습니다:
- serviceA: localhost:8080
- influxdb: localhost:8086
- grafana: localhost:80
여기서 serviceA 는 nodejs 런타임에서 동작하는 REST API 서버입니다. GET /api/hello 하나의 api를 서비스하며, api 호출수와 지연시간을 influxdb로 전송합니다. serviceA의 전체 코드는 다음 링크에서 확인할 수 있습니다.
Influxdb
앞서 간단히 소개한 것 처럼, influxdb는 시계열 데이터베이스 (Time Series DataBase, TSDB) 입니다. golang으로 작성된 이 데이터베이스의 데이터는 유닉스 시간 – 흔히 timestamp라고 부르는 – 과 해당 시간에 해당하는 복수 개의 숫자로 된 필드 값, 그리고 태그로 이루어져 있습니다.
몇 가지 주요 특징들은 다음과 같습니다:
- golang으로 작성되어 단일 바이너리로 제공됨. 외부 의존성이 없음. 즉, 설치와 환경설정이 간편함
- HTTP API 를 통해 읽기/쓰기 동작이 이루어짐. 읽기/쓰기가 간편함
- SQL 구문과 같은 조회 및 집계가 가능함 (e.g. 태그를 이용한 where clause)
- 자동 리텐션 정책을 지원
- HA, Relay – buffering, sharding, recovering – 기능 지원
- HA, Clustering 지원 (단, 유료 버전에서만 지원됨)
읽기/쓰기가 간편하고 golang으로 작성되어 성능이 좋기 때문에, 과거 cacti와 같은 서비스에서 많이 사용됐던 RRDTool (Round Robin Database Tool) 과 달리 다른 서비스에서 http 프로토콜을 통해 손쉽게 데이터를 저장하고, 집계 데이터를 읽어서 다양한 서비스로 연동할 수 있습니다. (e.g. anomaly detection)
더 자세한 내용은 공식 문서를 참고하시기 바랍니다.
# homebrew를 통해 설치$ brew update
$ brew install influxdb
==> Downloading https://homebrew.bintray.com/bottles/influxdb-1.1.1.sierra.bottle.tar.gz
…
To have launchd start influxdb now and restart at login:
brew services start influxdb
Or, if you don’t want/need a background service you can just run:
influxd -config /usr/local/etc/influxdb.conf
==> Summary
/usr/local/Cellar/influxdb/1.1.1: 24B
이 글을 작성하는 시점에는 1.1.1 버전이 homebrew에 릴리즈 되어 있습니다. 설치 진행중 콘솔 출력 중 brew 명령어를 통해 간단히 서비스를 시작할 수 있으며 /usr/local/etc/influxdb.conf 가 구성 파일의 경로이고 /usr/local/Cellar/influxdb/1.1.1 이 바이너리 경로임을 나타냅니다. 구성 파일은 열어서 한번씩 훑어보시기 바랍니다. (우리는 로컬에 테스트할 목적이므로 특별히 수정할 부분은 없습니다. http endpoint 포트가 default로 8086 임을 확인할 수 있습니다.)
# homebrew를 통해 서비스 구동$ brew services start influxdb
…
==> Successfully started `influxdb` (label: homebrew.mxcl.influxdb)
# 서비스 동작 확인$ brew services list
Name Status User Plist
influxdb started {username} /Users/{username}/Library/LaunchAgents/homebrew.mxcl.influxdb.plist
# influx shell 접속$ influx
…
Connected to http://localhost:8086 version v1.1.1
InfluxDB shell version: v1.1.1> show databases
name: databases
name
—-
_internal> use _internal
> show measurements
name: measurements
name
—-
cq
database
httpd
queryExecutor
runtime
…
처음 shell에 접속하면 _internal 데이터베이스 한 개만 존재하는데, 이름에서 알 수 있듯이 influxdb 내부용 데이터베이스입니다. 그 안의 measurements 에는 메타 데이터 뿐만 아니라 influxdb 서비스 동작 중 리소스 사용 현황까지 있습니다.
> select * from runtime limit 1
name: runtime
time Alloc Frees HeapAlloc HeapIdle HeapInUse HeapObjects HeapReleased HeapSys Lookups Mallocs NumGC NumGoroutine PauseTotalNs Sys TotalAlloc hostname
—- —– —– ——— ——– ——— ———– ———— ——- ——- ——- —– ———— ———— — ———- ——–
1483495780000000000 3099184 43365 3099184 974848 4628480 26648 0 5603328 15 70013 1 19 182224 10230008 4819872 localhost
Telegraf
다음은 telegraf 서비스 구성 방법입니다. 마찬가지로 golang 으로 작성된 agent 서비스로, 설치와 구성 파일 배포가 간단합니다.
$ brew install telegraf
==> Downloading https://homebrew.bintray.com/bottles/telegraf-1.1.2.sierra.bottle.tar
…
To have launchd start telegraf now and restart at login:
brew services start telegraf
Or, if you don’t want/need a background service you can just run:
telegraf -config /usr/local/etc/telegraf.conf
…
서비스를 시작하기에 앞서, /usr/local/etc/telegraf.conf 파일을 열어 살펴 봅시다. default로 설정되어 있는 [agent], [[outputs.influxdb]] 항목은 로컬 환경 구성이므로 그대로 두어도 괜찮습니다. 중요한 부분은 [[inputs.*]] 로 시작하는 항목들인데, 다음 링크를 참고하여 데이터를 가져올 수 있습니다. 또한 [[outputs.*]] 에는 influxdb 뿐만 아니라 다양한 체널로 입력값을 보낼 수 있습니다. (e.g. kafka와 같은 mq에 보내 실시간 처리에 이용)
일단 아무런 수정없이 서비스를 동작 시키겠습니다.$ brew services start telegraf
이제 로컬 서버의 cpu, memory, process, … 와 같은 관제에 필요한 기본적인 데이터가 influxdb로 유입되기 시작합니다.
$ influx
> show databases
name: databases
name
—-
_internal
telegraf> use telegraf
_internal 데이터베이스 외에 telegraf 데이터베이스가 추가된 것을 볼 수 있습니다. (telegraf.conf 의 [[outputs.influxdb]] 내에 있는 database 값을 수정하면 바꿀 수 있음)
> show measurements
name: measurements
name
—-
cpu
disk
mem
processes
swap
system
현재부터 10분 전까지의 시스템 사용량의 매 30초 평균을 가져오는 쿼리입니다.
> select mean(usage_system) from cpu where time > now() - 10m group by time(30s)
name: cpu
time mean
—- —-
1483535550000000000 5.112823832738451
1483535580000000000 4.554704323867991
1483535610000000000 4.156467778807397
1483535640000000000 5.1474029903729095
1483535670000000000 5.787787087879861
잘 쌓이고 있음을 확인 했으니, 이제 service 데이터베이스를 생성 후 serviceA를 동작시켜 같은 방식으로 확인 해보겠습니다.
> create database service
ServiceA
serviceA는 앞서 설명했던 것 처럼 nodejs 런타임에서 동작하는 아주 간단한 rest api 서버입니다.
요청: GET /api/hello, 응답: {“hello”:”world!”}
요청: GET /api/world, 응답:{“world”:”hello!”}
$ git clone https://github.com/GeunhoKim/express-influx.git
$ cd express-influx/service-a
$ npm install
$ pm2 start app.js
*로컬에 git, nodejs, pm2 가 모두 설치되어 있어야 합니다.
**git은 brew install git
로 설치합니다.
*** pm2는 npm install pm2 -g
로 설치합니다.
$ curl localhost:8080/api/hello
$ curl localhost:8080/api/world
{“hello”:”world!”}
{“world”:”hello!”}
# 몇 차례 더 요청을 날려서 데이터를 쌓아줍니다.
serviceA 는 요청시 요청수와 지연 시간을 influxdb로 기록합니다. 데이터가 잘 쌓여있는지 확인합니다.
$ influx
> use service
> select * from serviceA limit 5
name: serviceA
time host latency num_requests url
—- — —— ———— —
1483540807908284168 {hostname} 0.349809 1 /api/world
1483540807107210987 {hostname} 0.18984499999999999 1 /api/world
1483540765844455491 {hostname} 0.199207 1 /api/hello
1483540765697138565 {hostname} 0.22938699999999998 1 /api/hello
1483540765531034494 {hostname} 0.223208 1 /api/hello
서비스의 구성이 거의 완료 되었습니다. 이제 관제 대시보드 구성을 쉽게 할 수 있는 grafana 구성 방법을 살펴 보겠습니다.
Grafana
Grafana는 elastic 사의 ELK (Elasticsearch, Logstash, Kibana) 제품 중 elasticsearch에 indexing된 데이터의 시각화와 대시보드 구성을 위한 툴인 kibana에 영감을 받아 시작된 open source 프로젝트 입니다. kibana를 써봤다면 어렵지 않게 grafana도 사용할 수 있습니다. 데이터 질의를 통한 검색 기능을 제외하면 시각화와 대시보드 기능은 기능이 훨씬 강력합니다. 프론트엔드에는 nodejs, 백엔드에는 golang을 사용하고 있습니다.
elasticsearch*를 포함하여, graphite, openTSDB, influxdb 등 다양한 시계열 데이터베이스를 데이터 소스로 사용하여 하나의 그래프 박스 안에 여러 데이터베이스를 질의 하여 구성할 수 있습니다. 특히 최근 정식 릴리즈된 4.0 버전부터 알림 (alerting) 기능이 추가되어 데이터의 시각화 뿐만 아니라 관제용 대시보드로서 모든 기능을 갖추게 되었습니다. (드디어 알림 기능을 위해 php로 된 nagios나 icinga2 의 설정 파일을 번거롭게 수정하지 않아도 됩니다)
—
*elasticsearch의 경우 아직 4.0 버전에서는 5.x 버전을 지원하지 않습니다. 릴리즈 전인 latest 베타 버전에서는 해당 PR이 머지 되었으니 최신 베타 버전을 사용하면 가능합니다. 4.1 정식 버전에 포함될 예정이라고 합니다.
$ brew update
$ brew install grafana
==> Downloading https://homebrew.bintray.com/bottles/grafana-4.0.1.sierra.bottle.tar.
…
To have launchd start grafana now and restart at login:
brew services start grafana
…
Or, if you don’t want/need a background service you can just run:
grafana-server –config=/usr/local/etc/grafana/grafana.ini –homepath /usr/local/share/grafana cfg:default.paths.logs=/usr/local/var/log/grafana cfg:default.paths.data=/usr/local/var/lib/grafana cfg:default.paths.plugins=/usr/local/var/lib/grafana/plugins
다른 서비스들과 마찬가지로 homebrew를 이용하면 최신 버전의 정식 릴리즈를 쉽게 설치할 수 있습니다. 또한 설정 파일의 경로는 /usr/local/etc/grafana/grafana.ini
임을 알 수 있습니다. grafana의 경우 앞서 80 포트로 endpoint를 구성하려 했으므로 해당 파일을 열어서 수정합니다.
/usr/local/etc/grafana/grafana.ini
...
[server]
...
http_port = 80
root_url = http://localhost:80
...
$ grafana-cli plugins install grafana-piechart-panel
// pie chart 플러그인을 설치
각 항목 앞의 세미콜론 (;) 은 주석 처리된 것을 뜻하므로 이를 제거해야 설정이 적용됨을 주의 합니다. 이제 서비스를 구동 합니다.
$ sudo brew services start grafana
// default log 파일 경로 등의 권한 이슈가 있는 경우 sudo 권한으로 실행합니다.
이제 브라우저에서 http://localhost
를 주소창에 입력하면 grafana에 접속할 수 있습니다.
- default 계정 및 패스워드, admin / admin 입력 후 로그인
- 좌측 상단의 아이콘을 클릭 > Data Sources 클릭 > 우측 상단의 Add data source 를 클릭
- Name에 data source를 구분할 이름을 입력. 여기서는 resource로 정함. 우측에 default 체크박스 클릭
- Type에 InfluxDB 선택
- Url에 http://localhost:8086 입력
- Database에
telegraf
입력 (telegraf.conf 에 설정된 telegraf 가 데이터 적재시 사용하는 database 임에 주의) - 그 외 설정은 그대로 둔 후 Add 버튼 클릭
- 같은 방식으로 Database에
service
입력 후 Add 버튼 클릭 (나머지 설정은 동일)
여기까지 했다면 앞서 적재한 telegraf
, service
influxdb의 data source 생성이 끝난 것입니다. http://localhost/datasources
접속시 아래와 같이 두 개의 data source가 보이면 됩니다.
이제 대시보드를 구성할 차례입니다. 여기서부터는 일일히 설명하기 어려운 부분이 있기 때문에 미리 구성한 대시보드를 import 하여 살펴보시기 바랍니다.
- 좌측 상단 아이콘 클릭 > Dashboards 클릭 > import 클릭
- Or paste JSON 텍스트 박스에 링크의 내용을 그대로 붙여 넣고 입력 (최 하단에
view raw
버튼을 클릭해서 새 탭에서 띄우면 전체 선택하기 쉽습니다) telegraf/service
는 위에서 생성한telegraf/service
입력
grafana의 대시보드 구성의 상세 내용과 알림을 구성하는 방법, 그리고 알림 webhook을 통해 자동화된 동작을 수행하도록 하는 방법에 대해서는 다음 포스팅에서 상세하게 다루도록 하겠습니다.
'운영체제 > 리눅스' 카테고리의 다른 글
[Centos7] 시스템 모니터링 2 - influxDB, Grafana, telegraf (0) | 2018.08.05 |
---|---|
[Centos7] 시스템 모니터링 1 - influxDB, Grafana, telegraf (0) | 2018.08.05 |
[Centos7] Java 설치 (0) | 2018.08.04 |
데몬 구성 ( service+chkconfig와 systemctl 차이) (0) | 2018.07.21 |
[리눅스]리눅스 디렉토리(폴더) 구조 (0) | 2018.04.14 |