일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Linux
- docker
- Git
- JPA
- nodejs
- NCP
- mybatis
- springboot
- VSCode
- Kubernetes
- intellijIDEA
- gradle
- IntelliJ
- log4j2
- tibero
- JavaScript
- gson
- react
- sapfiorielements
- MySQL
- LOG4J
- useEffect
- Windows
- BPMN
- Spring
- dbeaver
- nginx
- Java
- database
- maven
- Today
- Total
두 손끝의 창조자
InfluxDB의 개념 및 RDB와 용어 차이 본문
오늘날 IoT 장치, 모니터링 시스템, 금융 거래 등 다양한 분야에서 시간에 따른 데이터 측정이 중요해지고 있습니다. 이러한 시계열 데이터를 효율적으로 저장하고 분석하기 위한 특별한 데이터베이스가 필요한데, 그 중 가장 인기 있는 것이 바로 InfluxDB입니다. 이 블로그에서는 InfluxDB의 핵심 개념과 기존의 관계형 데이터베이스(RDB)와의 차이점을 살펴보겠습니다.
시계열 데이터베이스란?
시계열 데이터베이스(Time Series Database, TSDB)는 시간에 따라 수집된 데이터를 저장하고 관리하기 위해 특별히 설계된 데이터베이스입니다. 시계열 데이터의 특징은 일반적으로:
- 시간 기반의 고유 식별자를 가짐
- 대량의 쓰기 작업이 발생함
- 주로 추가만 발생하고 업데이트는 드묾
- 시간 기반의 쿼리가 빈번함
InfluxDB는 이러한 특성에 최적화된 오픈 소스 시계열 데이터베이스입니다.
RDB와 InfluxDB의 용어 비교
관계형 데이터베이스에 익숙한 사용자가 InfluxDB를 처음 접할 때 다른 용어들이 혼란스러울 수 있습니다. 아래 표는 주요 개념들을 비교한 것입니다:
RDB 용어 | InfluxDB 용어 | 설명 |
---|---|---|
데이터베이스 | 버킷(Bucket) | InfluxDB 2.0부터 '데이터베이스'와 '보존 정책'이 '버킷'으로 통합됨 |
테이블 | 측정(Measurement) | 관련된 시계열 데이터의 컬렉션 |
기본 키 | 타임스탬프(Timestamp) + 태그(Tags) | 각 데이터 포인트는 시간과 태그 세트로 고유하게 식별됨 |
컬럼 | 필드(Field), 태그(Tag) | 필드는 값을 저장, 태그는 메타데이터로 인덱싱됨 |
행 | 포인트(Point) | 하나의 데이터 포인트(시간, 측정값, 태그 세트, 필드 세트 포함) |
InfluxDB의 데이터 모델
InfluxDB의 데이터 모델은 다음과 같은 주요 구성 요소로 이루어져 있습니다:
1. 포인트(Point)
단일 데이터 포인트는 다음 요소로 구성됩니다:
- 측정(Measurement): 데이터가 속한 컬렉션
- 태그 세트(Tag Set): 인덱싱된 메타데이터 (키-값 쌍)
- 필드 세트(Field Set): 실제 측정된 값 (키-값 쌍)
- 타임스탬프(Timestamp): 데이터가 기록된 정확한 시간
2. 태그와 필드의 차이
- 태그(Tags):
- 인덱싱되어 빠른 검색 가능
- 주로 메타데이터 저장에 사용
- 문자열 값만 가능
- 시계열을 구분하는 데 사용
- 필드(Fields):
- 인덱싱되지 않음
- 실제 측정된 값 저장
- 다양한 데이터 타입 지원 (정수, 실수, 문자열, 불리언)
- 쿼리가 필드를 기준으로 필터링할 때 전체 스캔 필요
3. 시리즈(Series)
시리즈는 동일한 측정, 태그 세트, 필드 키를 공유하는 데이터 포인트들의 집합입니다. 시계열 데이터의 논리적 그룹화라고 볼 수 있습니다.
Line Protocol: InfluxDB의 데이터 입력 형식
InfluxDB에 데이터를 입력할 때 사용되는 텍스트 기반 형식을 'Line Protocol'이라고 합니다. 이 프로토콜은 간결하고 효율적으로 시계열 데이터를 표현합니다.
기본 구조
<measurement>[,<tag_key>=<tag_value>,...] <field_key>=<field_value>[,<field_key>=<field_value>,...] [<timestamp>]
예시
cpu,host=server01,region=us-west usage_idle=92.6,usage_user=3.8 1635789640000000000
위 예시를 분석하면:
cpu
: 측정(measurement)host=server01,region=us-west
: 태그 세트usage_idle=92.6,usage_user=3.8
: 필드 세트1635789640000000000
: 나노초 단위의 타임스탬프
Line Protocol의 특징
- 효율성: 간결한 텍스트 형식으로 네트워크 전송과 처리가 빠름
- 유연성: 스키마 없이 새로운 태그와 필드를 자유롭게 추가 가능
- 배치 처리: 여러 데이터 포인트를 한 번에 전송 가능 (줄바꿈으로 구분)
- 타임스탬프 옵션: 타임스탬프를 지정하지 않으면 서버 시간 사용
Line Protocol은 InfluxDB의 데이터 입력에 최적화되어 있어, 높은 처리량과 낮은 지연 시간을 제공합니다.
Flux: InfluxDB의 새로운 쿼리 언어
InfluxDB 2.0부터는 기존의 InfluxQL 대신 Flux라는 새로운 쿼리 언어를 도입했습니다. Flux는 단순한 쿼리 언어가 아닌, 데이터 스크립팅 언어로서 다음과 같은 특징을 가집니다:
Flux의 주요 특징
- 함수형 언어: 파이프라인 방식으로 데이터를 변환하고 처리
- 강력한 데이터 변환: 집계, 조인, 피벗 등 다양한 데이터 변환 가능
- 다중 데이터 소스: InfluxDB뿐만 아니라 다른 데이터 소스와의 통합 가능
- 사용자 정의 함수: 복잡한 로직을 재사용 가능한 함수로 구현 가능
간단한 Flux 쿼리 예시
from(bucket: "monitoring")
|> range(start: -1h)
|> filter(fn: (r) => r._measurement == "cpu" and r.host == "server01")
|> mean()
|> yield(name: "mean_cpu_usage")
이 쿼리는 다음을 수행합니다:
- "monitoring" 버킷에서 데이터를 가져옴
- 지난 1시간 동안의 데이터만 선택
- "cpu" 측정값 중 "server01" 호스트에 대한 데이터만 필터링
- 평균값을 계산
- "mean_cpu_usage"라는 이름으로 결과를 반환
Flux는 SQL보다 더 표현력이 풍부하며, 시계열 데이터 처리에 특화된 다양한 함수를 제공합니다. 또한, 버전 관리가 가능한 스크립트 형태로 저장하고 공유할 수 있어 협업에도 유리합니다.
InfluxDB의 장점
- 시계열 최적화: 시간 기반 데이터를 위한 인덱싱과 스토리지 최적화
- 확장성: 대용량 데이터 처리와 고속 쓰기 작업에 최적화
- 보존 정책: 오래된 데이터의 자동 삭제와 다운샘플링 지원
- 내장 시각화: Chronograf 같은 도구를 통한 데이터 시각화 지원
- 다양한 통합: Telegraf, Grafana 등 생태계 도구와의 연동
RDB와 비교한 InfluxDB의 단점
- 복잡한 관계 모델링: 관계형 데이터를 표현하기 어려움
- 트랜잭션 지원 부족: ACID 트랜잭션 지원이 제한적
- 학습 곡선: 새로운 개념과 쿼리 언어 학습 필요
- 범용성: 모든 유형의 애플리케이션에 적합하지 않음
정리
InfluxDB는 시계열 데이터를 효율적으로 저장하고 분석하기 위한 특화된 데이터베이스입니다. RDB와는 다른 용어와 개념을 사용하지만, 시간 기반 데이터를 다루는 애플리케이션에서는 탁월한 성능을 발휘합니다. Line Protocol과 Flux를 통해 데이터의 입력과 쿼리가 간편하며, IoT, 모니터링, 분석 등 시계열 데이터를 다루는 다양한 분야에서 활용될 수 있습니다.
시계열 데이터의 중요성이 계속 증가함에 따라, InfluxDB의 역할과 활용 범위도 더욱 확대될 것으로 기대됩니다. 시계열 데이터를 다룰 예정이라면, InfluxDB를 검토해보는 것이 좋은 선택이 될 수 있습니다.