Amazon DocumentDB의 폐영역 회수 - Amazon DocumentDB

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Amazon DocumentDB의 폐영역 회수

Amazon DocumentDB는 모든 업데이트 작업에 대한 문서 및 인덱스 항목의 새 버전을 생성하는 다중 버전 동시성 제어(MVCC) 데이터베이스 아키텍처를 구현합니다. 이 아키텍처는 트랜잭션 격리를 활성화하여 한 트랜잭션의 변경 사항이 다른 트랜잭션에 나타나지 않도록 합니다.

Amazon DocumentDB의 가비지 수집 이해

폐영역 회수(GC)는 Amazon DocumentDB에서 최적의 시스템 성능과 가용성을 유지하는 자동화된 백그라운드 프로세스입니다. 여러 최신 데이터베이스와 마찬가지로 Amazon DocumentDB의 MVCC 아키텍처는 각 업데이트마다 새 문서 및 인덱스 버전을 생성합니다. 각 쓰기 작업은 유한 카운터에서 고유한 MVCC ID를 사용합니다. 이러한 IDs 문서 버전이 속한 트랜잭션과 커밋 또는 롤백 여부를 식별합니다. 시간이 지남에 따라 이러한 이전 버전과 해당 MVCC IDs 누적되므로 성능 저하를 방지하기 위해 정리가 필요합니다.

폐영역 회수의 함수

폐영역 회수기는 세 가지 필수 함수를 제공합니다.

  • 스토리지 공간 회수 - 활성 쿼리에 더 이상 필요하지 않은 더 이상 사용되지 않는 문서 및 인덱스 버전을 제거하여 향후 쓰기 작업을 위한 공간을 확보합니다.

  • MVCC ID 오버플로 방지 - MVCC ID의 유한 카운터를 관리하여 MVCC ID 오버플로를 방지합니다. 이 관리가 없으면 카운터가 결국 한도에 도달하여 데이터베이스를 ID가 재활용될 때까지 임시 읽기 전용 모드로 강제 적용합니다,

  • 쿼리 성능 유지 - 쿼리 처리가 누적되고 느려지는 데드 문서 버전을 제거하여 최적의 쿼리 성능을 유지합니다.

폐영역 회수 프로세스

GC 프로세스는 컬렉션별로 작동하며 여러 컬렉션에서 여러 프로세스를 동시에 실행할 수 있습니다. 이 프로세스는 4개의 순차적 단계로 구성됩니다.

  1. 식별 - 시스템은 활성 트랜잭션 또는 쿼리에서 더 이상 참조하지 않는 문서 및 인덱스 버전을 식별합니다.

  2. 메모리 로드 - 문서와 인덱스 항목이 아직 없는 경우 이전 문서와 인덱스 항목이 메모리에 로드됩니다.

  3. 삭제 - 더 이상 사용되지 않는 버전이 영구적으로 삭제되어 스토리지 공간을 회수합니다.

  4. MVCC ID 재활용 - 시스템은 새 작업을 위해 삭제된 버전에서 MVCC ID를 재활용합니다.

폐영역 회수가 이전 문서 버전 처리를 완료하면 시스템에서 가장 오래된 MVCC ID가 제거됩니다. 이 정리는 MVCC ID를 재활용하여 클러스터 전체에서 새 쓰기 작업에 사용할 수 있도록 하여 MVCC ID 오버플로를 방지하는 데 매우 중요합니다. 이 재활용 프로세스가 없으면 시스템은 결국 유한 MVCC ID 카운터를 소진하고 읽기 전용 상태가 됩니다.

폐영역 회수 일정

폐영역 회수는 주기적으로 백그라운드에서 자동으로 실행됩니다. 타이밍 및 빈도는 시스템 로드, 사용 가능한 리소스, 쓰기 볼륨 및 MVCC ID 소비 수준에 따라 동적으로 조정됩니다. 쓰기 작업이 많은 동안에는 GC 프로세스가 더 자주 실행되어 문서 버전의 수가 증가합니다.

스토리지 아키텍처 및 확장 스토리지

Amazon DocumentDB는 문서 스토리지를 두 개의 개별 세그먼트로 분리하는 정교한 스토리지 아키텍처를 사용합니다.

기본 스토리지 세그먼트

기본 스토리지 세그먼트에는 기본 문서 데이터와 메타데이터가 포함되어 있습니다. 이 세그먼트는 다음을 저장합니다.

  • 표준 페이지 크기(8KB)에 맞는 콘텐츠를 문서화합니다.

  • 메타데이터 및 구조 정보를 문서화합니다.

  • 기본 인덱스 및 해당 항목.

  • 컬렉션 수준 통계 및 구성.

확장 스토리지 세그먼트

확장 스토리지 세그먼트는 표준 스토리지 페이지 크기를 초과하는 문서를 처리하도록 설계된 특수 대형 문서 객체 스토어를 활용합니다. 이 세그먼트는 다음을 제공합니다.

  • 효율적인 대용량 문서 처리 - 기본 스토리지 임계값보다 큰 문서는 확장 스토리지 세그먼트로 자동으로 이동됩니다.

  • 최적화된 스토리지 레이아웃 - 세그먼트는 큰 객체에 최적화된 다른 스토리지 형식을 사용하여 조각화를 줄이고 액세스 패턴을 개선합니다.

  • 독립 가비지 수집 - 확장 스토리지 세그먼트에는 기본 스토리지 정리와 독립적으로 실행할 수 있는 자체 가비지 수집 프로세스가 있습니다.

  • 투명한 액세스 - 애플리케이션이 데이터가 포함된 스토리지 세그먼트를 알 필요 없이 대용량 문서에 원활하게 액세스합니다.

확장 스토리지 세그먼트는 다음과 같은 경우에 특히 유용합니다.

  • 대형 임베디드 배열이 포함된 문서가 포함된 컬렉션입니다.

  • 광범위한 중첩 구조가 있는 문서.

  • 바이너리 데이터 또는 큰 텍스트 필드를 저장하는 컬렉션입니다.

  • 일부 문서가 평균 크기를 크게 초과하는 혼합 문서 크기가 있는 애플리케이션.

폐영역 회수 모니터링

클러스터 수준 지표

AvailableMVCCIds

  • 위치 - Amazon CloudWatch

  • 설명 - 최대 18억 개의 제한에서 사용 가능한 나머지 쓰기 작업 수를 보여주는 카운터입니다. 이 카운터가 0에 도달하면 ID가 회수되고 재활용될 때까지 클러스터가 읽기 전용 모드로 전환됩니다. 카운터는 각 쓰기 작업에 따라 감소하고 폐영역 회수가 이전 MVCC ID를 재활용함에 따라 증가합니다.

  • 권장 사항 - 값이 13억 미만으로 떨어질 때 경보를 설정합니다. 이 조기 경고를 사용하면 나중에 설명하는 권장 단계를 수행할 수 있습니다.

LongestActiveGCRuntime

  • 위치 - Amazon CloudWatch

  • 설명 - 가장 긴 활성 폐영역 회수 프로세스의 초 단위 기간입니다. 1분마다 업데이트하고 1분 내에 완료되는 프로세스를 제외한 활성 작업만 추적합니다.

  • 권장 사항 - gcRuntimeStats 과거 데이터와 비교하여 대량 삭제 중 연장된 런타임과 같은 비정상적인 가비지 수집 동작을 식별합니다.

컬렉션 수준 지표

MVCCIDStats: MVCCIdScale

  • 위치 - 데이터베이스 collStats 명령

  • 설명 - 0~1의 척도로 MVCC ID 수명을 측정합니다. 여기서 1은 클러스터가 읽기 전용 상태가 되기 전의 최대 수명을 나타냅니다. 이 지표를 AvailableMVCCIds와 함께 사용하여 클러스터를 노후화하는 가장 오래된 MVCC ID가 포함된 컬렉션을 식별합니다.

  • 권장 사항 - 각 컬렉션에 대해 0.3 미만의 값을 유지합니다.

gcRuntimeStats

  • 위치 - 데이터베이스 collStats 명령

  • 설명 - 총 실행 횟수, 평균 기간, 최대 기간을 포함한 폐영역 회수 지표의 2개월 기록을 제공합니다. 의미 있는 통계를 보장하기 위해 5분 이상 지속되는 폐영역 회수 작업만 포함합니다.

중요

gcRuntimeStats및에 대한 컬렉션 수준 지표의 documentFragmentStats, storageSegmentBase 및 분류storageSegmentExtended는 Amazon DocumentDB 8.0에서만 사용할 수 있습니다.

storageSizeStats

  • 위치 - 데이터베이스 collStats 명령

  • 설명 - 다양한 스토리지 세그먼트의 스토리지 사용률을 자세히 분석합니다.

    • storageSegmentBase - 표준 문서의 기본 스토리지 세그먼트에서 사용하는 스토리지

    • storageSegmentExtended - 대용량 문서의 확장 스토리지 세그먼트에서 사용하는 스토리지

  • 사용량 - 상당히 큰 문서 스토리지가 있는 컬렉션을 식별하고 스토리지 배포 패턴을 이해하는 데 도움이 됩니다.

unusedStorageSize(수집 수준)

  • 위치 - 데이터베이스 collStats 명령

  • 설명 - 샘플링된 통계를 기반으로 컬렉션의 미사용 스토리지 공간을 추정합니다. 여기에는 삭제된 문서와 빈 세그먼트의 공간이 포함됩니다. 지표는 결합된 합계와 세그먼트별 분석을 모두 제공합니다.

    • 모든 스토리지 세그먼트unusedPercent에서 unusedBytes 및 통합

    • storageSegmentBase - 기본 스토리지 세그먼트에서 특별히 사용되지 않는 공간

    • storageSegmentExtended - 확장 스토리지 세그먼트에서 특별히 사용되지 않는 공간

documentFragmentStats

  • 위치 - 데이터베이스 collStats 명령

  • 설명 - 컬렉션 내의 문서 조각 및 데드 데이터에 대한 자세한 정보를 제공합니다. 문서 조각은 데이터베이스 엔진에서 사용하는 내부 스토리지 단위를 나타내며, 데드 조각은 더 이상 액세스할 수 없지만 아직 회수되지 않은 데이터를 나타냅니다. 이 지표에는 다음이 포함됩니다.

    • totalDocFragmentsCount - 컬렉션의 총 문서 조각 수

    • deadDocFragmentsCount - 데드(액세스할 수 없음) 데이터가 포함된 조각 수

    • deadDocFragmentsPercent - 데드 데이터가 포함된 조각의 백분율

    • deadDocFragmentBytes - 배달 못한 문서 조각에서 소비되는 예상 바이트

    • storageSegmentBase 및에 대한 세그먼트별 분석 storageSegmentExtended

  • 사용량 -이 지표를 모니터링하여 가비지 수집의 효과를 이해하고 유지 관리 작업의 이점을 얻을 수 있는 컬렉션을 식별합니다. 데드 조각의 비율이 높으면 가비지 수집이 뒤처지거나 수집이 최적화의 이점을 누릴 수 있음을 나타냅니다.

인덱스 수준 지표

unusedStorageSize(인덱스 수준)

  • 위치 - 데이터베이스 indexStats 명령

  • 설명 - 샘플링된 통계를 기반으로 인덱스의 미사용 스토리지 공간을 추정합니다. 여기에는 더 이상 사용되지 않는 인덱스 항목과 빈 세그먼트의 공간이 포함됩니다.

  • 권장 사항 - reIndex 명령을 사용하여 가동 중지 없이 인덱스를 다시 빌드하고 미사용 공간을 회수합니다. 자세한 내용은 인덱스 관리를 참조하세요.

collStats 출력 예제

다음 예제에서는 가비지 수집 및 스토리지 지표가 포함된 일반적인 collStats 출력을 보여줍니다.

{ "ns" : "Mvcc_consumption_test_db.mvcc_test_collection", "MVCCIdStats" : { "MVCCIdScale" : 0.03 }, "gcRuntimeStats" : { "numRuns" : 1, "historicalAvgRuntime" : 3295, "historicalMaxRuntime" : 3295, "lastRuntime" : 3295, "lastRuntimeStart" : ISODate("2025-06-24T08:47:14Z") }, "documentFragmentStats" : { "totalDocFragmentsCount" : 45000000, "deadDocFragmentsCount" : 2250000, "deadDocFragmentsPercent" : 5.0, "deadDocFragmentBytes" : 98304000, "storageSegmentBase" : { "totalDocFragmentsCount" : 30000000, "deadDocFragmentsCount" : 1500000, "deadDocFragmentsPercent" : 5.0, "deadDocFragmentBytes" : 65536000 }, "storageSegmentExtended" : { "totalDocFragmentsCount" : 15000000, "deadDocFragmentsCount" : 750000, "deadDocFragmentsPercent" : 5.0, "deadDocFragmentBytes" : 32768000 } }, "collScans" : 14, "count" : 30000000, "size" : 1320000000, "avgObjSize" : 44, "storageSize" : 6461497344, "storageSizeStats" : { "storageSegmentBase" : 4307664896, "storageSegmentExtended" : 2153832448 }, "capped" : false, "nindexes" : 2, "totalIndexSize" : 9649553408, "indexSizes" : { "_id_" : 1910661120, "c_1" : 7738892288 }, "unusedStorageSize" : { "unusedBytes" : 4201881600, "unusedPercent" : 65.05, "storageSegmentBase" : { "unusedBytes" : 2801254400, "unusedPercent" : 65.05 }, "storageSegmentExtended" : { "unusedBytes" : 1400627200, "unusedPercent" : 65.05 } }, "cacheStats" : { "collBlksHit" : 171659016, "collBlksRead" : 754061, "collHitRatio" : 99.5627, "idxBlksHit" : 692563636, "idxBlksRead" : 1177921, "idxHitRatio" : 99.8303 }, "idxScans" : 41823984, "opCounter" : { "numDocsIns" : 0, "numDocsUpd" : 20911992, "numDocsDel" : 0 }, "lastReset" : "2025-06-24 05:57:08.219711+00", "ok" : 1, "operationTime" : Timestamp(1750968826, 1) }

자주 묻는 질문(FAQ)

폐영역 회수의 효율적 작동 여부를 확인하려면 어떻게 해야 하나요?

비효율적인 폐영역 회수를 나타내는 다음 경고 신호를 모니터링합니다.

  • 과도한 수집 부풀림 - 특히 큰 인덱스의 경우 쓰기가 많거나 대량 삭제 시 unusedStorageSize 지표를 지속적으로 증가시킵니다.

  • 높은 데드 조각 비율 - 일관되게 높은 deadDocFragmentsPercent 값(10~15% 이상)을 documentFragmentStats 표시합니다.

  • 성능 저하된 쿼리 지연 시간 - 누적된 배달 못한 문서로 인해 쿼리 지연 시간이 늘어났습니다.

  • 연장된 GC 기간 -의 과거 평균보다 더 오래 걸리는 가비지 수집 작업입니다gcRuntimeStats.

  • GC 처리 기능 향상 - 가비지 수집기가 시스템 수요를 따라잡을 수 없음을 LongestActiveGCRuntime 나타냅니다.

폐영역 회수가 데이터베이스 성능에 영향을 미치나요?

정상적인 조건에서는 폐영역 회수가 성능에 미치는 영향을 최소화합니다. 그러나 폐영역 회수가 뒤처지면 다음과 같은 상황이 발생할 수 있습니다.

  • 누적된 배달 못한 문서로 인해 스토리지 비용이 증가합니다.

  • 더 이상 사용되지 않는 인덱스 항목으로 인해 쿼리 성능이 느려집니다.

  • MVCC IDs 고갈된 경우 임시 읽기 전용 모드입니다.

  • 특히 더 작은 인스턴스에서 집약적인 수집 실행 중 리소스 사용량이 증가합니다.

  • 대용량 문서에 대한 확장 스토리지 세그먼트 작업의 효율성이 감소했습니다.

폐영역 회수를 수동으로 트리거할 수 있나요?

아니요. Amazon DocumentDB의 폐영역 회수는 수동으로 트리거할 수 없습니다. 시스템은 내부 유지 관리 작업의 일부로 폐영역 회수를 자동으로 관리합니다.

운영 모범 사례로 설정해야 하는 경보는 무엇인가요?

Amazon DocumentDB 시스템의 성능을 최적화하려면 클러스터 및 컬렉션 수준 모두에서 모니터링을 설정하는 것이 좋습니다.

클러스터 수준 모니터링의 경우 먼저 임계값이 AvailableMVCCIds 13억인 지표에 대한 Amazon CloudWatch 경보를 생성합니다. 이렇게 하면 지표가 0에 도달하기 전에 조치를 취할 수 있는 충분한 시간을 확보할 수 있습니다. 그러면 클러스터가 읽기 전용 모드로 전환됩니다. 이 지표는 특정 사용 패턴에 따라 변동할 수 있습니다. 일부 고객은 가비지 수집이 작업을 완료하면 지표가 13억 미만으로 감소한 다음 15억 이상으로 복구됩니다.

Amazon CloudWatch를 통해 LongestActiveGCRuntime 지표를 모니터링하는 것도 중요합니다. 이 지표는 gcRuntimeStats와 함께 시스템 전체에서 폐영역 회수가 얼마나 효율적으로 수행되고 있는지 이해하는 데 도움이 됩니다.

컬렉션 수준 모니터링의 경우 다음 주요 지표에 집중하세요.

  • MVCCIdScale - MVCC IDs 오래되어 주의가 필요할 수 있음을 나타내는 값이 증가하는지 확인합니다.

  • gcRuntimeStats - 비정상적으로 오래 걸리거나 며칠에 걸쳐 연장되는 가비지 수집 프로세스를 식별합니다.

  • documentFragmentStats - deadDocFragmentsPercent 값 모니터링 - 지속적으로 높은 비율(10~15% 이상)은 가비지 수집이 뒤처지고 있음을 나타낼 수 있습니다.

  • storageSizeStatsunusedStorageSize- 스토리지 사용률 패턴을 추적하고 두 스토리지 세그먼트 중 하나에서 상당한 미사용 공간이 있는 컬렉션을 식별합니다.

쓰기 작업이 빈번한 컬렉션은 폐영역 회수기에 더 많은 작업을 생성하므로 각별한 주의가 필요합니다. 폐영역 회수가 워크로드를 따라잡을 수 있도록 쓰기 활동이 많은 컬렉션에 대해 이러한 지표를 더 자주 확인하는 것이 좋습니다.

이러한 모니터링 권장 사항은 시작점 역할을 합니다. 시스템 동작에 더 익숙해지면 특정 사용 패턴 및 요구 사항에 더 잘 맞게 이러한 임계값을 조정하는 것이 좋습니다.

AvailableMVCCIds가 13억 이하로 떨어지면 어떻게 해야 하나요?

AvailableMVCCIds 지표가 13억 미만으로 떨어지면 클러스터가 읽기 전용 모드로 전환되지 않도록 즉각적인 조치를 취하는 것이 좋습니다. 먼저 인스턴스 크기를 확장하여 폐영역 회수기에 더 많은 컴퓨팅 리소스를 제공하는 것이 좋습니다. 이는 애플리케이션이 가비지 수집기에 따라 잡는 데 필요한 추가 전력을 제공하면서 정상적인 작업을 계속할 수 있도록 하기 위한 기본 권장 사항입니다.

확장만으로도 상황이 개선되지 않는 경우 쓰기 작업의 감소를 고려하는 것이 좋습니다. MVCCIdScale 지표를 사용하여 주의가 필요한 이전 MVCC ID가 포함된 특정 컬렉션을 식별합니다. 또한를 모니터링documentFragmentStats하여 가비지 수집 비효율성에 기여할 수 있는 데드 조각 비율이 높은 컬렉션을 식별합니다.

이러한 컬렉션을 식별한 후에는 폐영역 회수가 따라잡을 수 있도록 컬렉션에 대한 쓰기 작업을 일시적으로 줄여야 할 수 있습니다. 복구 기간 동안 AvailableMVCCIds 지표를 면밀히 모니터링하여 작업에 원하는 효과가 있는지 확인하는 것이 좋습니다. AvailableMVCCIds 값이 15억 이상으로 반환되면 클러스터가 정상으로 간주됩니다.

이러한 단계는 시스템이 중요한 상태에 도달하기 전에 복구하는 데 도움이 되는 예방 조치입니다. 지표가 13억 미만으로 감소한 것을 확인한 후 더 빨리 조치를 취할수록 쓰기 작업에 미치는 영향을 피할 가능성이 높아집니다.