티스토리 뷰

반응형

이번에는 대표적인 TSDB 중 하나인 InfluxDB에 대해 알아보고자 합니다.

 

 

 

1. InfluxDB란?


[ InfluxDB란? ]

Influx DB란 많은 쓰기 작업과 쿼리 부하를 처리하기 위해 2013년에 Go 언어로 개발된 오픈소스 Time Series Database(시계열 데이터베이스)로써 Tick Stack(Telegraf + InfluxDB + Chronograf + Kapacitor)의 필수 컴포넌트 중 하나이다. Influx DB는 많은 TSDB들(Prometheus, TimescaleDB, Graphite, 등) 중에서 가장 유명하고, 많이 사용되는 데이터베이스이다. Influx DB는 Distributed, Scale horizontally하게 설계되어 새로운 노드만 추가하면 손쉽게 scale-out할 수 있으며, Restful API를 제공하고 있어 API 통신이 가능하다.

 

  • 많은 쓰기 작업과 쿼리 부하를 처리하기 위해 2013년에 Go 언어로 개발된 오픈소스 TSDB
  • Tick Stack의 필수 컴포넌트 중 하나
  • 가장 유명하고, 많이 사용되는 TSDB
  • Distributed, Scale horizontally하게 설계되어 scale-out이 쉬우며, Restful API를 제공하고 있어 API 통신이 가능

 

 

위에서 설명한 TICK Stack이란 InfluxData에서 나온 4가지 오픈소스 컴포넌트들을 기반으로 구축한 시스템이다. 4가지 컴포넌트들은 조합되어 모니터링할 데이터를 수집하여 저장하고, 알림을 보낸다.

  • Telegraf: Metrics와 Events를 수집하고 리포팅하는 모듈
  • InfluxDB: Time Series DB(시계열 데이터베이스)
  • Kapacitor: Real-time 스트리밍 데이터 전송 엔진
  • Chronograf: 시각화 도구

 

 

 

[ InfluxDB의 특징 - Continuous Query(Task), Retention Policy(Retention Period) ]

InfluxDB는 2가지 핵심 기능을 제공하고 있는데, 그것은 바로 일정 주기마다 데이터를 처리하여 새롭게 저장하는 기능과 일정 주기마다 데이터를 자동으로 삭제하는 기능이다.

위의 2가지 핵심 기능은 대량으로 쌓이는 시계열 데이터를 보다 편리하게 처리할 수 있도록 제공하고 있다.

 

 

Continous Query(연속적인 쿼리), Task

Influx DB의 핵심 목적은 시간에 따른 데이터(시계열 데이터)의 처리이다. InfluxDB는 데이터를 처리하여 새롭게 저장하는 Down Sampling(다운 샘플링)을 일정 주기마다 실행되도록 하는 Continous Query(연속적인 쿼리)를 제공하고 있다.

InfluxDB2에서는 Continous Query를 대체하는 Task를 제공하고 있다.

 

 

Retention Policy(보존 정책), Retention Period

Influx DB의 핵심 목적은 시간에 따른 데이터의 삽입과 조회이므로 직접 Delete를 이용하는 경우는 거의 없다. 하지만 데이터가 계속해서 쌓이면 저장 공간 및 처리 속도 등에 문제가 생기므로 데이터를 자동으로 삭제해주는 Retention Policy(보존 정책)를 지원하고 있다.

Retention Policy란 오래된 데이터를 자동으로 삭제해주는 정책으로써 데이터베이스 단위로 정의되며 일반적으로 1개의 데이터베이스는 여러 개의 보존 정책을 가지고 있다.

만약 별도의 설정을 하지 않았다면 autogen이라는 기본 정책으로 적용된다. autogen은 보존 기간이 무제한이므로, 별도의 설정을 해주지 않으면 데이터가 계속해서 쌓이고 문제를 일으키게 된다. 그러므로 별도의 설정을 해줌으로써 오래된 데이터들을 관리하는 작업이 필요하다.

InfluxDB2에서는 Retention Policy를 대체하는 Retention Period를 제공하고 있다.

 

 

[ InfluxDB 내부 구조 및 구성 ]

InfluxDB의 구성을 RDB와 비교하여 먼저 표로 살펴보고 자세히 살펴보도록 하자. 표에 없는 그 외에 자세한 내용들은 공식 문서를 참고하도록 하자.

Database Database
Table Measurement
Column Key
Indexed Column Tag Key (String Only)
Unindexed Column Field Key
Row Point

 

 

Measurement

시계열 데이터베이스에서 측정의 의미를 가지는 measurement는 관계형 데이터베이스의 table에 해당하며, RDB와 마찬가지로 하나의 데이터베이스 안에 여러 개의 measurement가 있을 수 있다. 이를 그림으로 표현하면 다음과 같다.

 

하지만 RDB와 차별화된 핵심 컨셉이 있는데, InfluxDB는 NoSQL의 개념을 바탕으로 만들어져서 RDB와 다르게 Schemaless(스키마가 없음) 하다는 점이다.

기존의 RDB로 개발을 할 때에는 필요한 컬럼들과 길이 및 타입 등을 설계하면서 테이블의 스키마를 구성해주어야 했다. 하지만 InfluxDB는 Schemaless 데이터베이스이므로, 새로운 데이터를 추가하는 시점에 Measurement와 관련 컬럼들이 추가되며 이러한 이유로 스키마의 변경이 매우 빠르다. InfluxDB는 이러한 구조를 가져감으로써 시계열 데이터에 유연하게 대처할 수 있도록 하였다.

 

 

Key(Tag Key, Field Key, Time Key)

컬럼의 구성은 기존의 RDB와 약간 차이가 있다. 기존의 RDB에서는 1개의 컬럼에 1개의 데이터가 저장되었는데, TSDB에서는 컬럼이 3가지 종류로 나뉘어지며, 각각의 컬럼은 (Key, Value)로 구성된다.

  • Tag key
    • RDB에서 Indexed 컬럼과 유사하며, 인덱싱되어 Select 문으로 조회하는 기준이 된다.
    • Tag의 value로는 String 타입만 가능하므로 질의 시에 따옴표(' ')로 감싸주어야 한다
  • Field key
    • RDB에서 Indexed 되지 않는 컬럼과 유사하며, 저장되는 데이터는 최소 1개 이상의 field가 있어야 한다.
    • Field value는 strings, floats, integer or Boolean 타입이 가능하며, 타입이 정해지면 변경할 수 없다.
  • Time key
    • UTC를 기준으로 1970년 1월 1일 0시 0분 0초로부터 지난 시간을 microseconds 단위로 자동 입력된다.
    • 수동으로 설정할 수도 있지만 권장하지 않는다.

 

데이터를 저장하기 위해서는 태그 또는 필드 중 하나를 선택해야 하는데, 이것은 매우 중요하다. 왜냐하면 태그에 있는 값들은 인덱싱되는 반면에 필드는 인덱싱되지 않기 때문이다. 그러므로 조회를 하기 위해 인덱싱이 되어야 하는 경우에는 태그를, 그렇지 않고 단순 데이터인 경우에는 필드로 선택하면 된다.

만약 불필요한 데이터까지 모드 태그로 잡는다면 인덱스 저장소(Index Structure)가 비대해져 메모리를 많이 사용하게 되고 처리 성능이 떨어지게 될 것이다.

 

 

Series

Series는 InfluxDB에만 존재하는 개념으로 조합 가능한 Tag Key의 집합에 해당한다. 예를 들어 Member라는 Measurement에 (이름, 나이)가 Tag Key로 지정되어 있다면 저장된 모든 데이터들 중에서 가능한 (이름, 나이)의 집합이 Series이다.

 

 

Shard와 Shard Group

A Shard Group은 InfluxDB bucket에 속하며, Shard Group Duration(샤드 그룹 보존  기간)에 따라 실제 데이터를 저장하는 Shard를 관리한다. Shard(샤드)에는 ShardGroup(샤드 그룹)에 정의된 기간에 속한 데이터들이 인코딩 및 압축되어 저장된다. 특정 Shard Group Duration에 저장된 모든 포인트(데이터)들은 동일한 샤드에 저장된다.

1개의 샤드는 여러 개의 Series, 디스크에 Time-Structured Merge Tree(TSM)으로 구성된다. TSM은 내부적으로 사용되는 트리 기반의 데이터 저장소라고 생각하면 된다. 데이터가 TSM에 저장되기 전에는 메모리에 있는 것이고, Shard Group Duration(샤드 그룹 보존 기간)이 만료되면 디스크에 TSM 형태로 저장되는 것이다.

InfluxDB는 Shard Group과 Shard를 이용해 데이터를 샤딩하여 데이터가 시간이 지남에 따라 증가하여도 처리량과 전체 성능을 높이는 접근 방법을 취한다. 샤드는 데이터에 대한 임시 블록을 가지고 잇어 TSM에 매핑된다.

시간을 기반으로 분리되는 Shard를 이용함으로써 시간을 제약조건으로 사용하여 메모리에 로드할 데이터의 양 자체를 줄일 수 있다. 이는 모든 TSDB들이 기본적으로 가져가는 개념이다. 이와 관련해서는 공식 문서를 참고해도 좋다.

 

 

Shard Group Duration

Shard Group Duration(샤드 그룹 보존 기간)이란 각 샤드 그룹이 메모리에 보존되고, 새롭게 생성되는 기간을 의미한다. 만약 해당 보존 기간이 지나면 샤드 그룹은 제거된다. 기본적으로 InfluxDB는 버킷의 Retention Period에 따라 샤드 그룹 보존 기간을 설정한다.

Retention Period(보존 기간) Shard Group Duration(샤드 그룹 보존 기간)
less than 2 days 1 시간
between 2 days and 6 months 1 일
greater than 6 months 7 일

만약 별도의 설정을 하지 않았다면 샤드 그룹 보존 기간은 기본적으로 7일이다.

 

 

Retention Perid와 Shard Group Duration

위에서 간략히 Shard Group Duration(샤드 그룹 보존 기간)이 만료될 경우에 대해서 설명을 하였지만 위의 내용을 제대로 읽지 않았거나 다른 글들을 참고하였다면 Retention Period(Retention Policy)와 Shard Group Duration의 개념이 혼동될 수 있다. 예를 들어 보존 기간은 무한하면 샤드 그룹 보존 기간은 7일인데, 샤드 그룹 보존 기간이 만료되면 데이터가 삭제되는 것인지 아니면 남아있는 것인지 말이다.

샤드 그룹 보존 기간은 데이터가 메모리에 상주해있는 시간이다.(다른 거의 모든 글들에서 이에 대해 설명하지 안 그리고 이 만약 샤드 그룹보존 기간이 만료되면 해당 데이터는 메모리에서 디스크로 저장이 되는 것이다. 그러므로 보존 기간이 무한하다면 해당 데이터는 영구적으로 저장이 되지만, 샤드 그룹 보존 기간이 지났다면 해당 데이터를 조회하기 위해서 디스크에서부터 값을 읽어와야 하는 것이다.

 

 

 

 

 

관련 포스팅

  1. 시계열 데이터베이스(TSDB, Time Series Database) 란? - (1/2)
  2. InfluxDB란? 핵심 개념, 내부 구조 및 특징  - (2/2)

 

 

 

 

참고자료

 

 

반응형
댓글
댓글쓰기 폼
반응형
공지사항
Total
1,585,305
Today
1,782
Yesterday
5,473
TAG more
«   2021/10   »
          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            
글 보관함