본문 바로가기
Database

[InfluxDB] InfluxDB 입문 (설치 / 사용법 /Tick Stack / 시계열 데이터베이스 / Flux)

by 비전공자 기록광 2022. 4. 11.
반응형

회사에서 기본 rdbms 성능 이슈로 InfluxDB를 도입하기로 했고 관련 업무를 내가 담당하게 되어 공부를 시작했다.

 



일단 InfluxDB는 시계열 데이터 베이스이다. 


시계열 데이터 베이스 TSDB
시계열 데이터 베이스는 일정한 주기를 가지고 수집되는 대량의 데이터(시계열 데이터)를 처리하는데 최적화된 DB
시계열 데이터의 예시로는 기상정보, 주식정보 등이 있는데 데이터가 실시간으로 쌓이는 대형 서비스 회사에서도 데이터 모니터링용으로 많이 사용한다고 한다.
멜론에서도 InfluxDB + Telegraf + Grafana 로 모니터링 시스템을 구축한 관련 자료가 있었다.

 

https://www.slideshare.net/yuseungmin/custom-dev-ops-monitoring-system-in-melon

 

Custom DevOps Monitoring System in MelOn (with InfluxDB + Telegraf + …

2016년도 데이터야놀자에서 발표한 자료입니다. 멜론에서 InfluxDB + Telegraf + Grafana 조합으로 모니터링 시스템을 구축하고 활용한 사례를 발표한 내용입니다. 다양한 메트릭데이터와 DevOps 측면의

www.slideshare.net

 

 

기존 RDBMS (Postgresql)과 시계열 데이터베이스 (Timescale)을 성능 비교한 글이 있었는데
2017년 글이고 그새 얼마나 달라졌을진 모르겠지만 확실한건 계속해서 TSDB의 사용량은 늘어나고 있다.

 



요약하자면 10억행의 데이터를 insert할때 postgresql에서는 40시간이, timescale에서는 3시간이 걸렸다고 한다.
쿼리 성능으로는 일반 쿼리는 postgresql이 더 빨랐지만 시간에 따른 정렬이나 시간에 따른 집계같은 시간 관련 쿼리에서는 timescale이 더 빨랐다고 한다.


이 정도 성능 차이라면 도입해볼만 한 것 같다.

 

 

Tick Stack

시계열 데이터를 저장하고 작업하는 용도로 influxdb를 사용하는데 이때 함께 사용하면 좋을 도구들이 있다.
influxdata사에서 제공하는 조합이 바로 tick stack이다.

 

 

  • Telegraf : Metrics와 Events를 수집하고 Reporting 하는 Module
  • InfluxDB : Time Series Database
  • Chronograf : 시각화 도구
  • kapacitor : Real-time 스트리밍 데이터 전송 알람 엔진 > influxdb를 모니터링하다가 미리 설정한 시점에 알림(mail, slack 등) 발생시켜줌

 

이 조합도 유명하지만 chronograf를 grafana로 대체해 사용하는 조합도 많다.

 

 

InfluxDB

InfluxDB는 방대한 시계열 데이터 작업 처리하기 위해 Go 언어로 개발된 오픈 소스 TSDB이다.

공식 문서가 굉장히 잘 되어 있어서 꼼꼼히 읽어보기만해도 익히기 좋다.

InfluxDB를 통해 우리는 이런 작업을 할 수 있다.

 

  • 데이터를 수집하고 쓰기
  • 데이터를 쿼리해오기
  • 데이터를 가공하기
  • 데이터를 시각화하기
  • 모니터링과 알림 주기

 

- InfluxDB의 특징

  • 하나의 데이터 포인트마다 timestamp를 식별자로 가짐 (시간 데이터에 최적화) 
  • CR(ud) DB : 시계열 데이터를 저장하고 조회하는데 최적화된 DB, 수정 삭제 가능하나 권장 안함
  • RESTful API 제공 
  • Schemaless Design : 따로 테이블 생성 과정 필요 없음
  • 중복 데이터 자동 인식 저장
  • 데이터 보존 주기 (RP) 설정 가능

 

- RDBMS 와 InfluxDB 용어 비교

RDBMS InfluxDB
Database Bucket
Table Measurement
Indexed Column Tag Key
UnIndexed Column Field Key

 

 

- InfluxDB 데이터 구조

Line Protocal 구조

InfluxDB는 데이터 한 줄이 하나의 Point를 이룬다.

이 point들이 쌓이고 쌓여 Line Protocal 구조를 이룬다.

 

구조를 보면 제일 먼저 테이블을 명시해주고 구분자와 공백을 준 후 세개의 컬럼을 나열한다.

  • Tag Key : 인덱싱된 컬럼, 무조건 String 타입, 생략 가능
  • Field Key : 인덱싱 되지 않은 일반 컬럼, 하나의 measurement에 꼭 하나 이상의 Field Key 필요,  (Float / Integer / String / Boolean 타입 가능)
  • Time Key : 데이터 입력시 생략하면 UTC기준 now( ), 기본 microseconds 단위를 사용, 단위 변경도 가능

여기서 Field Value는 기본이 Float타입이다. 만약 Integer형으로 넣고 싶다면 432i 이런식으로 뒤에 i를 붙여주면 된다.

 

 

- InfluxDB 설치

설치 방법으로는 docker 설치, local 설치가 있다.
설치 후 기본 포트인 8086으로 접속해주면 된다.
공식 문서에 잘 설명되어 있으니 참고하면 된다.

 

  $ docker search influxdb

  $ docker pull influxdb

  $ docker run -p 8086:8086 \
      -v influxdb:/var/lib/influxdb \
      -e DOCKER_INFLUXDB_INIT_MODE=upgrade \
      -e DOCKER_INFLUXDB_INIT_USERNAME=my-user \        — 사용할 ID
      -e DOCKER_INFLUXDB_INIT_PASSWORD=my-password \    — 사용할 PW
      -e DOCKER_INFLUXDB_INIT_ORG=my-org \            — 사용할 조직명
      -e DOCKER_INFLUXDB_INIT_BUCKET=my-bucket \  — 초기 생성할 버킷명
      influxdb
 
  $ docker exec -it influxdb /bin/bash

 

 

- InfluxDB 사용

  • InfluxDB UI
  • InfluxDB CLI
  • Restful API 
    + java client

설치 후 사용하는 방법으로는 url 접속 후 사용하는 influxdb ui가 있고
cmd에서 사용하는 cli와 restful api 가 있다.

또 자바를 통해 사용하는 influxdb client java 라이브러리가 있는데 추후 블로깅 예정이다.

 

 

이게 기본 ui로 influxdb query 하는 방법이다.
influxdb ui에서는 query builder라는 간단한 select 쿼리를 바로 만들어주는 툴을 제공한다.

weather라는 db의 forecast라는 테이블에서 windseepd 컬럼을 가져오기로 한다.


influxdb는 시계열 데이터베이스고 시간 range가 중요하다.
가져올 시간의 범위를 설정해주고 submit을 누르면 쿼리의 결과를 그래프로 볼 수 있다.

 

 

view raw data 를 하면 그래프가 아닌 실제 데이터를 볼 수 있다.

여기의 _time이 실제 데이터를 입력할 때 들어간 timestamp이다.

 

 


여기서 또 알아둬야할 부분이 이 부분이다.
query builder를 사용하면 이 aggregateWindow( ) 함수가 반드시 포함된다.
aggregateWindow( )는 window period로 지정된 만큼 aggregate 하는 함수이다.

 

Window and aggregate data in InfluxDB with Flux | InfluxDB Cloud Documentation (influxdata.com)

 

Window and aggregate data in InfluxDB with Flux | InfluxDB Cloud Documentation

Window and aggregate data with Flux A common operation performed with time series data is grouping data into windows of time, or “windowing” data, then aggregating windowed values into a new value. This guide walks through windowing and aggregating dat

docs.influxdata.com

 

이 대로 한다면
12시간 전부터의 날씨, 기상 예보, 풍속 데이터를 1분씩 잘라 평균(mean)을 내서 그래프로 그려라 라는 쿼리가 만들어진다.

 

 

이를 실제 쿼리문으로 본다면 이렇다.

 

원래  influxDB에는 기존 SQL문과 비슷한 형태의 InfluxQL이라는 언어가 있었다.
하지만 이는 join 등 함수 사용에 제한이 많아 InfluxDB 2.0 버전부터는 Flux라는 언어가 새로 등장했다.

이 쿼리문이 바로 Flux인데 이를 해석해보면 이렇다.

 

from(bucket: "weather")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "forecasts")
  |> filter(fn: (r) => r["_field"] == "windspeed")
  |> aggregateWindow(every: 1m, fn: mean, createEmpty: false)
  |> yield(name: "mean")
weather라는 bucket에서
저 기간의 시간 범위로
measurement는 forecast이고 
field는 windspeed인 데이터를
1m마다 잘라 평균을 내서 
"mean"이라는 이름의 테이블로써 결과를 보여줘라

 

이 Flux는 역시 공식 문서에 설명이 너무 잘 되어 있어서 원하는 걸 찾아 쓰면 된다.




세미나를 준비하며 자료를 잘 정리해둬서 오랜만에 블로그를 써본다.
회사에 다니며 많은 걸 접하고 배우고 있다.

잘 기록해둬야 잊지 않을텐데..
다시 블로그를 열심히 하자... 화이팅~

 

반응형

댓글