개요
MongoDB는 쓰기 작업을 일괄적으로 수행할 수 있는 기능을 제공합니다. 대량 쓰기 작업은 단일 컬렉션에 영향을 줍니다. MongoDB를 사용하면 애플리케이션이 대량 쓰기 작업에 필요한 허용 가능한 승인 수준을 결정할 수 있습니다.
db.collection.bulkWrite() 메서드는 대량 삽입, 업데이트 및 삭제 작업을 수행할 수 있는 기능을 제공합니다.
MongoDB는 db.collection.insertMany() 메서드를 통한 대량 삽입도 지원합니다.
순서가 지정된 연산과 순서가 지정되지 않은 연산
대량 쓰기 (write)작업은 순차적으로 실행되거나( 순서가지정됨), 임의의 순서로( unordered) 실행됩니다. 기본값 으로 작업은 순서가 지정되며 첫 번째 오류가 발생하면 중지됩니다. 순서가 지정되지 않은 작업은 오류에도 불구하고 계속되며 병렬로 실행될 수 있으므로 일반적으로 샤딩된 컬렉션의 경우 더 빨라집니다.
실행 동작 및 오류 처리에 대한 자세한 내용은 를 db.collection.bulkWrite() 참조하세요.
지원되는 작업
대량 쓰기 (write) 작업 지원: 1개 삽입, 1개 업데이트, 다수 업데이트, 1개 바꾸기, 1개 삭제 및 다수 삭제.
분할된 컬렉션에 대한 대량 삽입을 위한 전략Strategies for bulk inserts to a Sharded Collection
대규모 대량 삽입 작업은 샤딩된 클러스터 성능에 영향 수 있습니다. 샤딩된 컬렉션에서 대량 쓰기를 최적화하려면 다음을 수행합니다.
컬렉션 사전 분할
샤딩된 컬렉션이 비어 있고 샤드 키의 첫 번째 키에 해시된 샤딩을 사용하지 않는 경우, 컬렉션에는 단일 샤드에 위치한 하나의 초기 청크만 있습니다. 그 후 MongoDB가 데이터를 수신하고 청크를 사용 가능한 샤드에 배포하는 데에는 시간이 걸립니다. 이러한 성능 비용을 방지하려면 샤딩된 클러스터에서 범위를 생성하여 컬렉션을 미리 분할하세요.
정렬되지 않은 쓰기 대상 mongos
샤딩된 클러스터에 대한 쓰기 (write) 성능을 향상시키려면 대량 쓰기 (write) 수행할 ordered 때 을 로 설정하여 false 순서가 지정되지 않은 대량 쓰기 (write) 수행합니다. mongos 는 여러 샤드에 동시에 쓰기를 전송하려고 시도합니다.빈 컬렉션의 경우 먼저 샤드 클러스터의청크 분할에 설명된 대로 컬렉션 을 미리 분할합니다.
단조로운 스로틀링 피하기
삽입하는 동안 샤드 키가 단조롭게 증가하면 모든 삽입된 데이터는 컬렉션의 마지막 청크로 이동하며 항상 단일 샤드에 저장됩니다. 따라서 클러스터의 삽입 용량은 해당 단일 샤드의 삽입 용량을 초과하지 않습니다.
삽입 볼륨이 단일 샤드로 처리할 수 있는 것보다 크거나 단조롭게 증가하는 샤드 키를 피할 수 없는 경우 애플리케이션을 다음과 같이 수정할 수 있습니다.
샤드 키의 이진 비트를 반전시킵니다. 이는 정보를 보존하고 값 시퀀스 증가와 삽입 순서의 상관 관계를 방지합니다.
인서트의 첫 번째와 마지막 16비트 단어를 "shuffle" 으로 바꿉니다.
예시
다음 예제는 C++에서 생성된 BSON ObjectId의 선행 및 후행 16비트 단어를 교체하여 더 이상 단조롭게 증가하지 않도록 합니다.
using namespace mongo; OID make_an_id() { OID x = OID::gen(); const unsigned char *p = x.getData(); swap( (unsigned short&) p[0], (unsigned short&) p[10] ); return x; } void foo() { // create an object BSONObj o = BSON( "_id" << make_an_id() << "x" << 3 << "name" << "jane" ); // now we may insert o into a sharded collection }