자체 관리형 배포서버를 위한 인메모리 스토리지 엔진
인메모리 스토리지 엔진은 64비트 빌드에서 정식 버전(GA)으로 제공됩니다. 일부 메타데이터 및 진단 데이터 외에 인메모리 스토리지 엔진은 구성 데이터, 인덱스, 사용자 자격 증명 등을 포함한 온디스크 데이터를 유지하지 않습니다.
인메모리 스토리지 엔진은 디스크 I/O를 피함으로써 데이터베이스 작업의 지연 시간을 보다 예측 가능하게 합니다.
인메모리 스토리지 엔진 지정
인메모리 스토리지 엔진을 선택하려면 다음을 지정합니다:
inMemory
--storageEngine
옵션 또는 구성 파일을 사용하는 경우storage.engine
설정입니다.--dbpath
, 또는 구성 파일을 사용하는 경우storage.dbPath
입니다. 인메모리 스토리지 엔진은 파일 시스템에 데이터를 쓰지 않지만--dbpath
에서 작은 메타데이터 파일과 진단 데이터, 대규모 인덱스 작성을 위한 임시 파일을 유지합니다.
다음은 명령줄에서의 예시입니다.
mongod --storageEngine inMemory --dbpath <path>
또는 YAML 구성 파일 형식을사용하는 경우:
storage: engine: inMemory dbPath: <path>
이 스토리지 엔진과 관련된 구성 옵션은 inMemory 옵션을 참조하세요. 대부분의 mongod
구성 옵션은 데이터 지속성과 관련된 옵션(예: 저널링, 미사용 데이터 암호화 설정)을 제외하고 인메모리 스토리지 엔진에서 사용할 수 있습니다.
경고
인메모리 스토리지 엔진은 프로세스가 종료된 후에 데이터를 유지하지 않습니다.
동시성
인메모리 스토리지 엔진은 쓰기 작업에 문서 수준 동시성 제어를 사용합니다. 결과적으로 여러 클라이언트가 컬렉션의 서로 다른 문서를 동시에 수정할 수 있습니다.
메모리 사용량
메모리 내 스토리지 엔진을 사용하려면 모든 데이터(인덱스,mongod
인스턴스가 복제본 세트의 일부인 경우 oplog 포함)가 YAML 구성 파일의 --inMemorySizeGB
명령줄 옵션 또는 storage.inMemory.engineConfig.inMemorySizeGB
설정에 맞아야 합니다.
인메모리 스토리지 엔진은 물리적 RAM에서 1GB를 뺀 값의 50%를 사용하도록 기본 설정되어 있습니다.
쓰기 작업으로 인해 데이터가 지정된 메모리 크기를 초과하면 MongoDB는 다음 오류를 반환합니다.
"WT_CACHE_FULL: operation would overflow cache"
새 크기를 지정하려면 storage.inMemory.engineConfig.inMemorySizeGB
YAML 구성 파일 형식의 설정을 사용합니다:
storage: engine: inMemory dbPath: <path> inMemory: engineConfig: inMemorySizeGB: <newSize>
또는 명령줄 옵션 --inMemorySizeGB
을 사용하세요.
mongod --storageEngine inMemory --dbpath <path> --inMemorySizeGB <newSize>
지속성
이 스토리지 엔진은 비영구적이며 영구 스토리지에 데이터를 쓰지 않습니다. 비영구 데이터에는 사용자, 권한, 인덱스, 복제본 세트 구성, 샤드 클러스터 구성 등의 애플리케이션 및 시스템 데이터가 포함됩니다.
따라서 인메모리 스토리지 엔진에는 저널 또는 데이터가 지속형이 될 때까지 대기하는 개념이 적용되지 않습니다.
복제본 세트의 투표권을 가진 멤버가 인메모리 스토리지 엔진을 사용하는 경우 writeConcernMajorityJournalDefault
를 false
로 설정해야 합니다.
참고
버전 4.2(및 4.0.13 및 3.6.14 ), 복제본 세트 멤버가 in-memory storage engine (투표 또는 비투표)을 사용하지만 복제본 세트에 writeConcernMajorityJournalDefault
가 true로 설정되어 있는 경우 복제본 세트 멤버는 시작 경고를 기록합니다.
writeConcernMajorityJournalDefault
를 false
로 설정하면 MongoDB는 w: "majority"
쓰기가 디스크 저널에 작성되는 것을 기다리지 않고 쓰기를 확인합니다. 따라서 주어진 복제본 세트의 노드 과반수 이상이 일시적으로 손실된 경우(충돌, 재시작 등), "majority"
쓰기 작업이 롤백될 가능성이 있습니다.
쓰기 작업에서 쓰기 려사항으로 journaled
이 지정되면, 해당 작업은 즉시 승인됩니다. mongod
인스턴스가 shutdown
명령이나 시스템 오류로 인해 종료되면, 인메모리 데이터의 복구는 불가능합니다.
트랜잭션
트랜잭션은
프라이머리 노드가 WiredTiger 스토리지 엔진을 사용하고
세컨더리 노드는 WiredTiger 스토리지 엔진 또는 인메모리 스토리지 엔진을 사용하는 복제본 세트 및 샤딩된 클러스터에서 지원됩니다.
참고
storage engine 을 사용하는 투표 멤버가 있는 샤드와 같이 로 설정된 샤드가 있는 cluster에서는 트랜잭션을 실행할 수 없습니다.writeConcernMajorityJournalDefault
false
배포 아키텍처
인메모리 스토리지 엔진을 사용하는 mongod
인스턴스는 독립 실행 형태, 복제본 세트의 일부, 또는 샤드 클러스터의 일부로 운영될 수 있습니다.
복제본 세트
인메모리 스토리지 엔진을 복제본 세트의 일부로 사용하는 mongod
인스턴스를 배포할 수 있습니다. 예를 들어, 3명의 멤버로 구성된 복제본 세트의 일부로 설정합니다.
인메모리 스토리지 엔진으로 실행되는
mongod
인스턴스 2개.WiredTiger 스토리지 엔진으로 실행되는
mongod
인스턴스가 1개. WiredTiger 멤버를 숨겨진 멤버로 구성합니다(예:hidden: true
및priority: 0
).
이 배포 모델을 사용하면 인메모리 스토리지 엔진으로 실행되는 mongod
인스턴스만 프라이머리가 될 수 있습니다. 클라이언트는 인메모리 스토리지 엔진 mongod
인스턴스에만 연결됩니다. 인메모리 스토리지 엔진을 실행하는 mongod
인스턴스가 모두 충돌했다가 다시 시작하더라도 WiredTiger를 실행하는 멤버에서 동기화할 수 있습니다. WiredTiger로 실행되는 숨겨진 mongod
인스턴스는 사용자 데이터, 인덱스 및 복제 구성 정보를 포함하여 데이터를 디스크에 유지합니다.
참고
인메모리 스토리지 엔진에서는 모든 데이터(mongod
가 복제본 세트의 일부인 경우 oplog 등)가 지정된 --inMemorySizeGB
명령줄 옵션 또는 storage.inMemory.engineConfig.inMemorySizeGB
설정에 맞아야 합니다. 메모리 사용을 참조하세요.
샤딩된 클러스터
이 스토리지 엔진을 사용하는 mongod
인스턴스는 샤드 클러스터의 일부로 배포할 수 있습니다. 인메모리 스토리지 엔진은 디스크 I/O를 방지하여 데이터베이스 작업의 지연 시간을 보다 예측 가능하게 만듭니다. 샤드 클러스터에서 샤드는 단일 mongod
인스턴스 또는 복제본 세트로 구성될 수 있습니다. 가령 다음 복제본 세트로 구성된 하나의 샤드가 있을 수 있습니다.
인메모리 스토리지 엔진으로 실행되는 2개의
mongod
인스턴스WiredTiger 스토리지 엔진으로 실행되는
mongod
인스턴스가 1개. WiredTiger 멤버를 숨겨진 멤버로 구성합니다(예:hidden: true
및priority: 0
).
이 샤드에 tag
inmem
을 추가합니다. 예를 들어, 이 샤드의 이름이 shardC
라면 mongos
에 연결하여 sh.addShardTag()
을 실행할 수 있습니다.
예를 들면 다음과 같습니다.
sh.addShardTag("shardC", "inmem")
다른 샤드에는 persisted
별도의 태그를 지정합니다.
sh.addShardTag("shardA", "persisted") sh.addShardTag("shardB", "persisted")
각 샤드 컬렉션은 inmem
샤드에 있어야 하며,assign to the entire chunk range
에 inmem
태그를 지정해야 합니다.
sh.addTagRange("test.analytics", { shardKey: MinKey }, { shardKey: MaxKey }, "inmem")
각 샤드 컬렉션은 persisted
샤드에 걸쳐 있어야 하며,assign to the entire chunk range
에 persisted
태그를 지정해야 합니다.
sh.addTagRange("salesdb.orders", { shardKey: MinKey }, { shardKey: MaxKey }, "persisted")
inmem
샤드의 경우 데이터베이스를 생성하거나 데이터베이스를 이동합니다.
참고
읽기 고려 수준 "snapshot"
은 인메모리 스토리지 엔진에서 공식적으로 지원되지 않습니다.