Time Series 데이터 정보
내부적으로 MongoDB는 공통 metaField
값을 기반으로 Time Series 컬렉션의 문서를 그룹화하여 Time Series 데이터를 최적화합니다. 유용한 것을 선택하면 스토리지 밀도와 쿼리 성능이 크게 최적화됩니다. 자세한 내용은 metaFields를 참조하세요.
Time Series 데이터의 속성
Time Series 데이터에는 다른 데이터 형식과 차별화되는 다음과 같은 몇 가지 속성이 있습니다.
문서는 순서대로 도착하므로 이를 추가하기 위해 빈번한 삽입 작업이 필요합니다.
각 문서가 단일 시점을 나타내므로 업데이트 작업은 드뭅니다.
애플리케이션에 광범위한 과거 기록이 있는 경우 삭제 작업은 거의 발생하지 않습니다.
데이터는 시간과 주식 티커와 같은 식별자에 따라 인덱스화되며, 해당 데이터가 속한 고유한 Time Series을 식별합니다.
각각의 개별 Time Series에는 지속적으로 증가하는 대량의 문서가 필요하기 때문에 데이터의 양이 많습니다.
이러한 요소를 고려하기 위해 MongoDB는 각 Time Series의 문서를 그룹화하는 특수한 열 형식을 사용합니다. 이 기능은 다음과 같은 이점이 있습니다.
스토리지 및 인덱스 크기 감소
쿼리 효율성 향상
읽기 작업을 위한 I/O 감소
WiredTiger 메모리 내 캐시 사용 증가로 쿼리 속도 더욱 향상
시계열 데이터 작업의 복잡성 감소
Time Series 컬렉션과 일반 컬렉션 비교
일반 컬렉션에서는 데이터가 디스크에 블록 단위로 순차적으로 저장되므로 쓰기 속도가 최적화됩니다. 그러나 각 데이터 포인트마다 하나의 인덱스가 필요하므로 빠르게 매우 커집니다. 또한 사용자가 단일 Time Series을 쿼리할 수 있도록 Time Series 식별자와 타임스탬프 자체를 포함하는 두 번째 인덱스가 필요합니다. 이 데이터를 읽기 위해 MongoDB는 블록에 관련 문서가 하나만 포함되어 있어도 해당 데이터가 포함된 모든 데이터베이스 및 디스크 블록을 처리해야 합니다.
이 모델은 CRUD 작업과 빈번한 업데이트에 최적화되어 있습니다. 은행 계좌 잔액은 현재 상태만 반영하면 되므로 해당 정보가 변경되면 각 계좌 소유자의 문서가 업데이트됩니다.
이를 Time Series 컬렉션과 비교하세요. Time Series 컬렉션은 데이터를 순서대로 기록하므로 최근 트랜잭션이 메모리에 보관되어 훨씬 빠르게 검색할 수 있습니다. 문서가 순서대로 작성되기 때문에 함께 저장되며 메모리에 더 이상 존재하지 않는 문서를 위해 모든 디스크 블록을 읽을 필요가 없습니다. 데이터는 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
인 새 버킷을 생성합니다.
참고
시계열 컬렉션의 세분성을 수정할 수는 있지만, 더 세밀한 측정 단위에서 더 긴 측정 단위로만 변경할 수 있습니다. 예를 들어, 버킷 범위를 분 단위에서 시간 단위로 확장할 수 있습니다. 이렇게 하면 컬렉션의 보기 정의가 업데이트되지만 기존 버킷에 데이터가 저장되는 방식은 변경되지 않습니다.
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 컬렉션의 수명과 동일합니다.delete
또는db.collection.deleteMany()
명령은 버킷의 마지막 문서를 삭제합니다.