MongoDB 5.0 Time Series
MongoDB 5.0 Time Series
MongoDB가 5.x 버전으로 릴리즈 되면서 추가된 유용한 기능 중에 하나가 바로 Time Series 컬렉션을 활용할 수 있다는 것 입니다. 쉽게 표현하면 시계열 데이터를 저장하는 기능인데 더 쉽게 표현하면 일정 시간 간격으로 한 줄로 배열된 데이터를 적재하는 기능입니다.시계열 데이터는 주기적인 시간 단위로 데이터를 수집하는 용도에 적합하며 즉, 시간 표기가 따라와야 하는 로그성 데이터를 쌓는 용도에 많이 사용합니다. object property 이외의 metadata 영역은 update가 거의 일어나지 않습니다. 즉 동일한 메타 데이터로부터 수집한 object property 값의 변화만 기록하는 방식입니다.
Timeseries 컬렉션 사용에 대한 이점
- 시간 데이터를 이용하여 데이터를 정렬하기 때문에 자동으로 시간에 대한 Index를 제공한다.
- 일반 컬렉션보다 데이터와 인덱스의 사이즈가 작다.
- 데이터 압축률이 좋다.
Timeseries Sharding
- granularity 적용 불가
- 일부 Admin Command 사용 불가
MongoDB에서 Timeseries 컬렉션을 생성하는 방법
db.createCollection( "weather", /* <-- 컬렉션 이름 */ { timeseries: { /* <-- Timeseries 컬렉션임을 정의 */ timeField: "timestamp", /* <-- 시간이 들어가는 필드명 지정 */ metaField: "metadata", /* <-- 메타 데이터 필드명 지정 */ granularity: "hours" /* <-- granularity 설정(옵션) */ }, expireAfterSeconds: 604800 /* <-- TTL 인덱스 사용가능 */ } )
데이터 적재
db.weather.insert({ "metadata": {"sensorId": 5578, "type": "temperature"}, "timestamp": new Date(), "temp": 12.8 })
insertOne과 insertMany를 모두 사용할 수 있습니다. 하지만 일반적인 update와 delete 명령을 사용할 수 없으며 metaField만 업데이트가 가능합니다.
- timeField: 인덱스을 생성하지 않는것 처럼 보이지만, 시간을 기준으로 자동으로 인덱스를 생성합니다. 정렬(sort)를 지원하지 않기 때문에 정렬이 필요한 환경에서는 별도의 인덱스를 생성해 줘야합니다.
- metaField: Timeseries 컬렉션 생성시 metaField를 정의하면 다시는 바꿀수 없기 때문에 초기 설계 시 모델링을 잘해야 합니다. 변경을 위해서는 컬렉션을 Drop 하고 다시 생성해야 합니다.
- granularity: “hours”, “minutes”, “seconds” 세가지 값을 가지고 있으며, 이 값은 옵션값으로 사용해도 되고, 사용하지 않을 수도 있습니다. 해당 값은 timeField에 대한 세분성을 나타내는데 내부적으로 저장하는 방식을 최적화 하여 성능을 향상시킬 수 있습니다. 데이터의 적재 주기를 설정하여 시간 범위에 가까운 값을 설정하면 됩니다. metaField를 지정하지 않으면 컬렉션에 삽입된 모든 측정 시간 범위를 고려해야 합니다. 더 큰 값으로는 바꿀 수 있으나, 더 작은 값으로 수정할 수 없으며, 한번에 두 단계를 넘어 바꿀 수 없습니다. 예> second → minute (O), hour → minute(x), minute → second → hour(x)
실제 데이터 적재 테스트
- 사양: 아틀라스 M30, 3-node ReplicaSet
- 100만건 데이터 입력시
일반 컬렉션 | Timeseries 컬렉션 | |
Insert 소요시간 | 102.875s | 126.129s |
데이터 크기 | 100MB | 40MB |
스토리지 크기(압축) | 27.6MB | 13MB |
인덱스 크기 | 29MB | 0MB (생성안됨) |
실제 데이터 크기 | 27.6 + 29 = 56.6MB | 13MB |
이런 결과를 보이는 Time Series 컬렉션을 이용한다면, 시간을 기준으로 로그성 데이터를 쌓는다면 좀 더 효율적인 스토리지 공간을 사용할 수 있으며, 빠른 읽기 속도를 통해 데이터 통계나 분석 작업에도 효율적으로 이용할 수 있을 것 같습니다.
최신 댓글