와이어드타이거 스토리지 엔진
WiredTiger 스토리지 엔진은 기본 스토리지 엔진입니다. 기존 배포의 경우 --storageEngine
또는 storage.engine
설정을 지정하지 않으면, mongod
인스턴스가 --dbpath
또는 storage.dbPath
에서 데이터 파일을 만드는 데 사용된 스토리지 엔진을 자동으로 결정할 수 있습니다.
다음 환경에서 호스팅되는 배포에서는 WiredTiger 스토리지 엔진을 사용할 수 있습니다.
MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스
참고
모든 MongoDB Atlas 배포는 WiredTiger 스토리지 엔진을 사용합니다.
MongoDB Enterprise: MongoDB의 구독 기반 자체 관리 버전
MongoDB Community: MongoDB의 소스 사용 가능 무료 자체 관리 버전
MongoDB Atlas에서 호스팅되는 배포에 WiredTiger 메모리를 사용하는 방법에 대한 자세한 내용은 메모리를 참조하십시오.
작업 및 제한 사항
WiredTiger 엔진에는 다음과 같은 작동 참고 사항 및 제한 사항이 적용됩니다.
WiredTiger 캐시에 문서를 고정할 수 없습니다.
WiredTiger는 캐시의 일부를 읽기용으로, 다른 일부는 쓰기용으로 예약하지 않습니다.
쓰기 워크로드가 많으면 성능에 영향을 줄 수 있지만 WiredTiger는 이러한 경우 인덱스 캐싱을 우선시합니다.
WiredTiger는 전체
mongod
에 캐시를 할당합니다. WiredTiger는 데이터베이스별 또는 컬렉션별 수준에서 캐시를 할당하지 않습니다.
문서 수준 동시성
WiredTiger는 쓰기 작업에 문서 수준 동시성 제어를 사용합니다. 결과적으로 여러 클라이언트가 컬렉션의 서로 다른 문서를 동시에 수정할 수 있습니다.
대부분의 읽기 및 쓰기 작업에서 WiredTiger는 낙관적인 동시성 제어를 사용합니다. WiredTiger는 글로벌, 데이터베이스, 컬렉션 수준에서 의도락(intent lock)만 사용합니다. 스토리지 엔진이 두 작업 간의 충돌을 감지하면, 한 작업이 쓰기 충돌이 발생하여 MongoDB가 해당 작업을 투명하게 재시도하게 됩니다.
일부 글로벌 작업, 일반적으로 여러 데이터베이스를 포함하는 수명이 짧은 작업에는 여전히 글로벌 '인스턴스 전체' 락 이 필요합니다. renameCollection
와 같은 다른 일부 작업은 특정 상황에서 여전히 배타적 데이터베이스 락 이 필요합니다.
스냅샷 및 체크포인트
WiredTiger는 MVCC(MultiVersion Concurrency Control)를 사용합니다. 작업 시작 시 WiredTiger는 데이터에 대한 특정 시점 스냅샷을 제공합니다. 스냅샷은 인메모리 데이터에 대한 일관적인 뷰를 제공합니다.
디스크에 쓸 때 WiredTiger는 스냅샷의 모든 데이터를 모든 데이터 파일에서 일관된 방식으로 디스크에 씁니다. 이제지속형 데이터는 데이터 파일에서 체크포인트 역할을 합니다. 체크포인트 는 데이터 파일이 마지막 체크포인트까지 일관성이 있는지 확인합니다. 즉, 체크포인트는 복구 지점 역할을 할 수 있습니다.
MongoDB는 WiredTiger를 구성하여 체크포인트를 생성하고, 구체적으로 60초 간격으로 스냅샷 데이터를 디스크에 기록합니다.
새 체크포인트를 작성하는 동안 이전 체크포인트는 여전히 유효합니다. 따라서 새 체크포인트를 작성하는 동안 MongoDB가 종료되거나 오류가 발생하더라도 다시 시작하면 마지막으로 유효한 체크포인트에서 복구할 수 있습니다.
WiredTiger의 메타데이터 테이블이 새 체크포인트를 참조하도록 원자적으로 업데이트되면 새 체크포인트에 액세스할 수 있고 영구적으로 변경됩니다. 새 체크포인트에 액세스할 수 있게 되면 WiredTiger는 이전 체크포인트에서 페이지를 해제합니다.
저널링 없이도 WiredTiger를 사용하면 MongoDB는 마지막 체크포인트에서 복구할 수 있습니다. 그러나 마지막 체크포인트 이후의 변경 사항을 복구하려면 저널링과 함께 실행합니다.
참고
WiredTiger 스토리지 엔진 을 사용하는 복제본 세트 멤버에 대해서는 --nojournal
옵션 또는 storage.journal.enabled: false
를 지정할 수 없습니다.
스냅샷 기록 보존
MongoDB 5.0부터는 minSnapshotHistoryWindowInSeconds
매개변수를 사용하여 WiredTiger가 스냅샷 기록을 보관하는 기간을 지정할 수 있습니다.
minSnapshotHistoryWindowInSeconds
값을 늘리면 서버가 지정된 기간 내에 이전에 수정된 값의 기록을 유지해야 하므로 디스크 사용량이 늘어납니다. 사용되는 디스크 공간은 워크로드에 따라 다르며, 워크로드가 클수록 더 많은 디스크 공간이 필요합니다.
MongoDB는 지정한 dbPath
에 있는 WiredTigerHS.wt
파일에 스냅샷 기록을 보관합니다.
Journal
WiredTiger는 미리 쓰기 로그(즉, 저널)를 체크포인트와 함께 사용하여 데이터 내구성을 보장합니다.
WiredTiger 저널은 체크포인트 사이의 모든 데이터 수정 사항을 유지합니다. MongoDB가 체크포인트 사이에 종료되면 저널을 사용하여 마지막 체크포인트 이후 수정된 모든 데이터를 재생합니다. MongoDB가 저널 데이터를 디스크에 기록하는 빈도에 대한 자세한 내용은 저널링 프로세스를 참조하세요.
WiredTiger 저널은 snappy 압축 라이브러리를 사용해 압축됩니다. 다른 압축 알고리즘을 지정하거나 압축을 하지 않으려면 storage.wiredTiger.engineConfig.journalCompressor
설정을 사용합니다. 저널 컴프레서 변경에 대한 자세한 내용은 WiredTiger 저널 컴프레서 변경을 참조하세요.
참고
로그 레코드가 128바이트(WiredTiger의 최소 로그 기록 크기) 이하인 경우 WiredTiger는 해당 레코드를 압축하지 않습니다.
storage.journal.enabled
를 false
로 설정하여 독립형 인스턴스에 대한 저널링을 비활성화할 수 있으며, 이렇게 하면 저널 유지 관리에 드는 오버헤드를 줄일 수 있습니다. 독립형 인스턴스의 경우 저널을 사용하지 않는다는 것은 MongoDB가 예기치 않게 종료될 때 마지막 체크포인트 이후의 모든 데이터 수정 사항을 잃게 됨을 의미합니다.
참고
WiredTiger 스토리지 엔진 을 사용하는 복제본 세트 멤버에 대해서는 --nojournal
옵션 또는 storage.journal.enabled: false
를 지정할 수 없습니다.
압축
MongoDB는 WiredTiger에 모든 컬렉션 및 인덱스에 대한 압축을 지원합니다. 압축은 CPU를 추가하는 대신 스토리지 사용을 최소화합니다.
기본적으로 WiredTiger는 모든 컬렉션에 대해 스내피 압축 라이브러리와 함께 차단 압축을 사용하고, 모든 인덱스에 대해 접두사 압축을 사용합니다.
컬렉션의 경우 다음의 차단 압축 라이브러리도 사용할 수 있습니다.
대체 압축 알고리즘을 지정하거나 압축을 하지 않으려면 storage.wiredTiger.collectionConfig.blockCompressor
설정을 사용합니다.
인덱스에 접두사 압축을 사용하지 않으려면 storage.wiredTiger.indexConfig.prefixCompression
설정을 사용하세요.
압축 설정은 컬렉션 및 인덱스 생성 중에 컬렉션별 및 인덱스별로 구성할 수도 있습니다. 스토리지 엔진 옵션 지정 및 db.collection.createIndex() storageEngine 옵션을 참조하세요.
대부분의 워크로드에서 기본 압축 설정은 스토리지 효율성과 처리 요구 사항의 균형을 유지합니다.
WiredTiger 저널도 기본적으로 압축되어 있습니다. 저널 압축에 대한 자세한 내용은 저널링을 참조하세요.
메모리 사용량
MongoDB는 WiredTiger를 통해 내부 캐시와 파일 시스템 캐시 모두를 활용합니다.
기본 WiredTiger 내부 캐시 크기는 다음 중 더 큰 값입니다.
(RAM - 1GB)의 50%
256 MB.
예를 들어 총 4 GB RAM이 있는 시스템에서 WiredTiger 캐시는 1.5 GB RAM(0.5 * (4 GB - 1 GB) =
1.5 GB
)을 사용합니다. 반대로, 총 RAM이 1.25 GB인 시스템에서는 WiredTiger는 WiredTiger 캐시에 256 MB를 할당하는데, 이는 전체 RAM에서 1 GB(0.5 * (1.25 GB - 1 GB) = 128 MB < 256 MB
)를 뺀 값의 절반 이상이기 때문입니다.
참고
컨테이너에서 실행할 때 등의 일부 인스턴스에서는 데이터베이스 메모리 제한이 총 시스템 메모리보다 낮을 수 있습니다. 이러한 인스턴스에서는 총 시스템 메모리가 아니라 이 메모리 제한이 사용 가능한 최대 RAM으로 사용됩니다.
메모리 제한을 보려면 hostInfo.system.memLimitMB
참조하세요.
기본적으로 WiredTiger는 모든 컬렉션에 Snappy 블록 압축을 사용하고 모든 인덱스에 접두사 압축을 사용합니다. 압축 기본값은 전역 수준에서 구성할 수 있으며 컬렉션 및 인덱스 생성 중에 컬렉션 및 인덱스별로 설정할 수도 있습니다.
WiredTiger 내부 캐시와 온디스크 형식의 데이터에는 서로 다른 표현이 사용됩니다.
파일 시스템 캐시의 데이터는 온디스크 형식과 동일하며, 데이터 파일에 대한 모든 압축의 이점을 누릴 수 있습니다. 파일시스템 캐시는 운영 체제에서 디스크 I/O를 줄이기 위해 사용됩니다.
WiredTiger 내부 캐시에 로드된 인덱스는 온디스크 형식과는 다른 데이터 표현을 갖지만, 인덱스 접두사 압축을 활용하여 RAM 사용량을 줄일 수 있습니다. 인덱스 접두사 압축은 인덱싱된 필드에서 공통 접두사를 중복 제거합니다.
WiredTiger 내부 캐시의 컬렉션 데이터는 압축되지 않으며 온디스크 형식과 다른 표현을 사용합니다. 차단 압축은 상당한 온디스크 스토리지 절감을 제공할 수 있지만 서버에서 데이터를 조작하려면 압축을 풀어야 합니다.
MongoDB는 파일 시스템 캐시를 통해 자동으로 WiredTiger 캐시나 다른 프로세스에서 사용되지 않는 모든 여유 메모리를 사용합니다.
와이어드타이거 내부 캐시 크기를 조정하려면 storage.wiredTiger.engineConfig.cacheSizeGB
및 --wiredTigerCacheSizeGB
를 참조하세요. WiredTiger 내부 캐시 크기를 기본값 이상으로 늘리지 마세요.