핵심 요약
MongoDB 8의 time-series 컬렉션으로 IoT(센서 1.2만 대) 데이터 일 1TB 수집·분석을 단일 클러스터로. ZSTD 압축 + bucket 자동 관리로 디스크 사용량 -85%, range query 평균 12배 빠름. 별도 TSDB(InfluxDB/Timescale) 도입 없이 완결.
1. 시계열 컬렉션 만들기
db.createCollection("metrics", {
timeseries: {
timeField: "ts",
metaField: "sensor",
granularity: "minutes"
},
expireAfterSeconds: 60 * 60 * 24 * 90 // 90일 TTL
});
2. 동작
같은 sensor의 데이터를 시간 bucket으로 묶어 저장. 저장 시 자동 columnar compress(ZSTD). 사용자는 일반 collection처럼 insert/query만 하면 된다.
3. 성능
| 워크로드 | 일반 컬렉션 | 시계열 |
|---|---|---|
| insert/s | 62K | 180K |
| 최근 1h range query | 1.2s | 0.09s |
| 디스크/일 | 1TB | 150GB |
4. 인덱스
db.metrics.createIndex({ "sensor.id": 1, ts: 1 })
db.metrics.createIndex({ ts: 1 })
metaField 인덱스가 핵심. 인덱스 자체도 bucket 단위라 일반 인덱스 대비 1/8 크기.
5. Aggregation
db.metrics.aggregate([
{ $match: { ts: { $gte: ISODate("2026-05-22") } } },
{ $group: {
_id: { sensor: "$sensor.id", h: { $hour: "$ts" } },
avgTemp: { $avg: "$temp" }
}}
])
6. 샤딩
샤드 키는 metaField + timeField 조합 권장. 같은 센서 데이터가 같은 샤드에 모이면 range query가 한 샤드에서 끝남. 8.0부터 시계열 샤딩 안정.
7. 함정
- granularity 잘못 선택 시 bucket 효율 폭락 — 평균 측정 주기와 매칭
- update/delete는 8.0에서 더 자유로워졌지만 여전히 비용 큼 — 시계열엔 immutable 권장
- compound index 제한이 일반 컬렉션보다 까다로움
자주 묻는 질문
Q. Timescale·InfluxDB와 비교? 순수 TSDB가 일부 워크로드에서 더 효율적이지만 운영 도구를 하나로 묶을 수 있는 가치가 큼. 기존 Mongo 사용자라면 강력 추천.

댓글 0