MongoDB Timeseries를 활용기
사건의 발단
안녕하세요, 비브로스에서 백엔드 개발을 하고 있는 배정석입니다.
비브로스에는 기존부터 운영하고 있는 로그 관련 서비스를 제공하는 서버가 있었습니다.
이름하야 로-그 서버!
...는 레거시라고 밖에 부를 수 없는 신세가 되어 있었죠.
그래서 이참에 리팩토링하고, 플랫폼화 하여서 다양한 로그들을 수집하고 분석할 수 있게 만들어보자!
라는 얘기가 나오면서 Timeseries DB
를 활용해서 만들어보자는 얘기까지 진척되게 됩니다.
그 이후로 여차저차해서 그 일은 제 일이 됩니다.
Timeseries DB가 뭐야?
저는 Timeseries 이름만 들어봤지, 써본 적이 없어서 공부를 시작했습니다.
아래는 제가 Timeseries 를 공부하면서 정리한 내용 중 일부입니다.
정의
- 시계열 데이 터를 저장하는 데이터베이스
시계열 데이터(Timeseries Data)
: 일정 시간 간격으로 배치된 데이터셋
특징
- 데이터를 시간을 기준으로 인덱싱하여 보관.
- mongoDB를 기준으로 설명하자면, 버킷 패턴을 내부적으로 구현. ( 시간의 범위에 대한 부분을
granulity
로 표현) - 시간에 따라 데이터들이 최적화되어있기 때문에, 시간이 지나도 데이터를 수집하는 속도가 느려지지 않고 빠른 처리 속도를 보여줌.
- mongoDB를 기준으로 설명하자면, 버킷 패턴을 내부적으로 구현. ( 시간의 범위에 대한 부분을
- 과거의 데이터를 시간과 함께 기록용으로 저장하므로 주된 작업은
CREATE
와 조회기능인READ
UPDATE
와DELETE
기능은 상당히 제한됨.
시간 순으로 저장한다는게 어떤 것일까?
시계열 데이터가 무엇인지 알아보았고, 이번엔 시계열 데이터를 어떻게 저장하는지에 대해 알아봅시다.
좌: 일반 컬렉션, 우: Timeseries 컬렉션
![]() | ![]() |
---|
좌측의 일반 컬렉션과, 우측의 시계열 컬렉션의 데이터 수집/저장 방식을 보면 차이점을 확연하게 알 수 있습니다.
왜 위와 같은 방식이 고안되었는가에 대한 내용은 mongoDB Timeseries
의 전신이나 마찬가지인 Bucket Pattern
을 보면 알 수 있습니다.
Bucket Pattern
좌: 일반 데이터, 우: Bucket Pattern 이 적용된 데이터
Bucket Pattern
은 스키마 디자인 패턴 중의 하나입니다.
일반적으로 데이터를 DB에 적재하게 될 때, 좌측 데이터와 같은 형태로 쌓게 됩니다.
여기서 각 document
에 timestamp
의 범위를 제한한다고 해봅시다. 이 경우에는 특정 구간의 timestamp && sensor_id
를 기준으로 Index
를 만든 것이나 마찬가지가 됩니다.
위 패턴은 효율적으로 1:N 관계
를 표현할 수 있었지만, 여럿 불편한 점이 있었습니다.
가령 BSON
의 크기 제한인 16mb
를 넘어가는 경우에는 별도의 처리를 해줘야 한다던지, 적재한 데이터를 다시 분리해서 가져오는 과정 등이 말이죠.
MongoDB 5.x
부터 내부적으로 Bucket pattern
을 구현한 Timeseries collection
을 지원하면서 이런 번거로움이 사라졌죠.
MongoDB 영업사원 아닙니다.