Time Series 데이터 정보
내부적으로 MongoDB 는 일반적인 metaField
값을 기반으로 time series 컬렉션 의 문서를 그룹화하여 Time Series 데이터 를 최적화합니다. 유용한 항목을 선택하면 저장 밀도 및 쿼리 성능이 크게 최적화됩니다. 자세한 내용은 metaFields를 참조하세요.
Time Series 데이터의 속성
시계열 데이터에는 다른 데이터 형식과 구별되는 몇 가지 속성이 있습니다.
문서가 순서대로 도착하므로 문서를 추가하려면 삽입 작업을 자주 수행해야 합니다.
각 문서 가 단일 점 을 나타내기 때문에 업데이트 작업은 거의 이루어지지 않습니다.
애플리케이션 이 광범위한 기록 기록 를 보유하는 것이 도움이 되는 경우 삭제 작업은 거의 이루어지지 않습니다.
데이터는 시간과 해당 데이터가 속한 고유한 Time Series를 식별하는 식별자(예: 주식 시세)를 기준으로 인덱싱됩니다.
각 개별 Time Series에는 지속적으로 증가하는 많은 수의 문서가 필요하기 때문에 데이터의 볼륨이 높습니다.
이러한 요인을 고려하기 위해 MongoDB 는 각 time series의 문서를 함께 그룹화하는 특수 열 형식을 사용합니다. 다음과 같은 이점이 있습니다.
저장 및 인덱스 크기 감소
쿼리 효율성 향상
읽기 작업을 위한 I/O 감소
WiredTiger 인메모리 캐시 사용량 증가, 쿼리 속도 더욱 향상
시계열 데이터 작업의 복잡성 감소
Time Series 컬렉션과 일반 컬렉션 비교
일반 컬렉션 에서 데이터는 디스크에 블록으로 순차적으로 저장되어 쓰기 (write) 속도를 최적화합니다. 그러나 각 데이터 점 에 대해 하나의 인덱스 가 필요하며, 이는 매우 빠르게 증가합니다. 또한 사용자가 단일 시리즈를 쿼리 할 수 있도록 시계열 식별자와 타임스탬프 자체를 포함하는 두 번째 인덱스 가 필요합니다. 이 데이터를 읽으려면 MongoDB 는 차단 에 관련 문서 가 하나만 포함되어 있더라도 해당 데이터가 포함된 모든 데이터베이스 및 디스크 블록을 프로세스 해야 합니다.
이 모델은 CRUD 작업과 빈번한 업데이트에 최적화되어 있습니다. 은행 계좌 잔액은 현재 상태 만 반영하면 되므로 정보가 변경될 때마다 각 계정 소유자의 문서 가 업데이트됩니다.
이를 time series 컬렉션 과 비교합니다. 시계열 컬렉션은 데이터를 순서대로 쓰기 (write) 하므로 최근 트랜잭션을 메모리에 보관하여 훨씬 빠르게 검색할 수 있습니다. 순서대로 기록되기 때문에 문서가 함께 저장되므로 문서 가 더 이상 메모리에 없는 후에 모든 디스크 차단 을 읽을 필요가 없습니다. 데이터는 metaField
에 의해 인덱싱되어 인덱스가 훨씬 작아집니다.
버킷팅 작동 방식
time series 컬렉션 을 만들면 MongoDB 는 자동으로 system.buckets
시스템 컬렉션 을 만듭니다. MongoDB 는 다음 두 가지가 모두 포함된 문서를 그룹화합니다.
Time Series를 고유하게 식별해야 하는 동일한
metaField
값입니다.metaField
이 객체 또는 배열 인 경우 MongoDB 는 모든 객체 필드 또는 배열 요소가 일치하는 경우에만 그룹화합니다.timeField
서로 가까이 있는 값입니다. time series 컬렉션의granularity
,bucketMaxSpanSeconds
및bucketRoundingSeconds
매개변수는 각 버킷이 다루는 시간 범위를 제어합니다. 자세한 내용 은 Time Series 데이터의 세분성 설정을 참조하세요.
예를 예시 seconds
세분성을 사용하면 MongoDB 는 같은 시간 내에 문서를 버킷합니다. 버킷에 metaField
값이 sensorA
이고 timeField
값이 2024-08-01T18:23:21Z
인 문서 가 포함된 경우 metaField
가 sensorB
인 수신 문서 는 시간에 관계없이 별도의 버킷으로 이동합니다. sensorA
에서 들어오는 문서 는 timeField
가 2024-08-01T18:00:00Z
와 2024-08-01T18:59:59Z
사이인 경우에만 동일한 버킷으로 이동합니다.
시간이 2023-03-27T16:24:35Z
인 문서가 기존 버킷에 맞지 않는 경우, MongoDB는 최소 시간이 2023-03-27T16:00:00Z
이고 최대 시간이 2023-03-27T19:59:59Z
인 새 버킷을 생성합니다.
참고
time series 컬렉션의 세분성을 수정할 수 있지만 버킷 적용 범위를 분 단위에서 시간 단위로 확장하는 등 더 세분화된 측정값에서 더 거친 측정값으로 변경할 수만 있습니다. 이렇게 하면 컬렉션의 뷰 정의가 업데이트되지만 기존 버킷에 데이터가 저장되는 방식은 변경되지 않습니다.
metaField가 버킷팅에 미치는 영향
metaField
값은 그룹 문서와 정확히 일치해야 하므로 time series 컬렉션 의 버킷 수는 고유한 metaField
값의 수에 따라 달라집니다. metaField
값이 세분화되거나 변경되는 컬렉션은 희박하게 채워진 수명이 짧은 버킷을 많이 생성합니다. 이로 인해 저장 및 쿼리 효율성 이 감소합니다.
예를 예시, 다음 문서 에서 metadata
은 지정된 날씨 센서의 데이터를 쉽게 쿼리 할 수 있으므로 metaField
을 선택하는 것이 좋습니다. MongoDB 는 이러한 필드를 사용하여 단일 센서의 판독값을 함께 버킷합니다.
{ timestamp: ISODate("2021-05-18T00:00:00.000Z"), metadata: { sensorId: 5578, type: 'temperature' }, temp: 12, _id: ObjectId("62f11bbf1e52f124b84479ad") }
버킷 카탈로그
버킷 카탈로그는 WiredTiger 의 특수 인메모리 캐시 입니다. 버킷을 추적하여 지연 시간 을 최소화하고 동시 쓰기를 조정합니다.
열려 있는 각 버킷에 대해 카탈로그는 metaField
, 활성 작성자, 적용 기간, 문서 수, 크기 및 최근 작업과 같은 정보를 유지 관리합니다. MongoDB 는 metaField
이 다른 문서에 대해 별도의 버킷을 생성하기 때문에 일반적으로 여러 버킷이 동시에 열립니다.
경합 조건으로 인한 불일치를 방지하기 위해 충돌하는 작업이 실행될 때 버킷이 닫히고 버킷 카탈로그에서 제거될 수 있습니다. mongod
다시 시작하면 모든 버킷이 닫히고 버킷 카탈로그가 재설정됩니다.
창조
MongoDB 는 수신 문서 에 적합한 버킷이 없는 경우 새 버킷을 생성합니다. 이는 다음 중 하나에 해당하는 경우 발생합니다.
metaField
문서 가 어떤 활성 버킷과도 일치하지 않습니다.문서 타임스탬프가 모든 활성 버킷의 범위 를 벗어납니다.
문서 가 모든 활성 버킷의 남은 크기 또는 문서 제한을 초과합니다.
새 버킷의 시작 타임스탬프는 컬렉션의 세분성 에 따라 반올림됩니다. 이는 타임스탬프가 순서가 맞지 않는 문서가 연속해서 도착하는 경우를 처리합니다.
폐쇄
MongoDB 는 다음과 같은 상황에서 버킷을 닫습니다.
버킷의 경계를 벗어난 수신 문서 타임스탬프에 표시된 대로 시간이 해당 기간을 앞 또는 뒤로 이동했습니다. 이러한 경계는 컬렉션의 세분성 설정에 따라 결정됩니다.
버킷이 문서 제한(기본값 1000)에 도달했습니다.
버킷이 저장 크기 제한을 초과했습니다. 이는 다음과 같은 경우에 발생합니다.
크기가 허용된 최대값(기본값 125KiB)을 초과합니다.
문서 수가 최소 개수(기본값 10) 미만이고 크기가 12MiB 미만입니다.
이는 데이터가 더 적은 수의 더 큰 문서로 구성된 경우 성능을 최적화하는 내부 제한 설정하다.
활성 버킷 설정하다 가 허용된 스토리지 엔진 캐시 크기에 맞지 않습니다.
collStats
데이터베이스 명령 을 사용하여 이 정보를 검토 할 수 있습니다.
버킷 카탈로그가 허용된 총 메모리 할당량( 기본값 으로 사용 가능한 시스템 메모리의 2.5%)을 초과합니다.
청크 마이그레이션 또는 업데이트 와 같이 충돌하는 작업은 버킷의 디스크 상태 를 변경합니다.
mongod
다시 시작합니다. 이렇게 하면 모든 버킷이 닫힙니다.
삭제
MongoDB 는 다음과 같은 경우 버킷을 삭제합니다.
최대 허용 타임스탬프가 현재 시간에서 컬렉션의
expireAfterSeconds
매개 변수를 뺀 값보다 작습니다. 이는 TTL 컬렉션의 TTL(Time To Live )과 동일합니다.delete
또는db.collection.deleteMany()
명령은 버킷의 마지막 문서 를 삭제합니다.