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 영업사원 아닙니다.


