2013-09-23 1 views
1

저는 820 만 개가 넘는 문서를 보유하고 있습니다. 나는 쿼리에 의해 2 ~ 3 백만 가지를 제거해야합니다 (속성 또는 두 속성이 색인 됨).쿼리로 수백만 개의 문서를 삭제할 때 ReplicaSet에 미치는 영향은 무엇입니까?

내 관심사는 oplog가 내가 가질 수있는 것보다 큰 성장을 한 다음 백업에서 모든 것을 다시 시드해야 할 필요가있어 제 2 차를 뒤지게 만드는 것입니다.

이 싶습니다 뭔가 ...

db.my_collection.remove({attribute_1:'xyz'},false); 

또는

db.my_collection.remove({attribute_1:'xyz',attribute_2:'abc'},false); 

은 (실제로 문서를 제거 외에) 내 세컨더리에 부정적인 영향이 없을 것 하나 oplog 항목을 수? 아니면 복제를 위해 2-3 백만 건의 작업으로 변환됩니까?

대답은 그것이 하나의 작업이 될 것이라고 생각하고 복구해야 할 수도있는 조각화가 있지만 반드시 oplog/secondary sync 문제 일 필요는 없습니다.

답변

2

기본에서 제거 된 모든 문서에 대해 oplog의 개별 항목이 생깁니다.

따라서 기본 문서에서 300 만 개의 문서가 제거 된 경우 보조 문서의 _id 키를 사용하여 300 만 개의 문 삭제가 완료됩니다.

나는 그들을 일괄 처리하고 지연을 기준으로 삭제를 제한 한 다음 나중에 압축하거나 다시 동기화합니다.

많은 문서 이동이있는 경우 paddingFactor 세트로 압축하는 것이 좋습니다.

+0

, 뭔가 당신이 구문을 분석하는 것보다 알고 있습니다 더있다 db.printReplicationInfo() 또는 db.printSlaveReplicationInfo()의 출력? –

+0

스크립팅하는 경우 기본 replSetGetStatus 명령을 사용합니다. – jeffl

2

컬렉션을 만들고 일치하는 문서 몇 개를 remove()에 추가하면 쉽게 테스트 할 수 있습니다.

그런 다음 생성되는 어떤 항목을 볼 수 oplog를 검사 할 수 있습니다 : 같은 문서를 보장하기 위해

use local 
db.oplog.rs.find({op:'d'}) 

은 제거 된 각 문서는 oplog에 항목을 생성, 기본 및 보조 노드에서 삭제됩니다.

는 예를 들어, remove() 일치하는 두 개의 문서 후에 oplog (op: 'd')에서 항목을 삭제 : 나는 스크립트에 그런 일을 원한다면

{ 
    "ts" : Timestamp(1379971718, 1), 
    "h" : NumberLong("8227301495520897544"), 
    "v" : 2, 
    "op" : "d", 
    "ns" : "test.foo", 
    "b" : true, 
    "o" : { 
     "_id" : ObjectId("5240b21e2fa8b603e8aaaceb") 
    } 
} 
{ 
    "ts" : Timestamp(1379971718, 2), 
    "h" : NumberLong("-5339031341149346886"), 
    "v" : 2, 
    "op" : "d", 
    "ns" : "test.foo", 
    "b" : true, 
    "o" : { 
     "_id" : ObjectId("5240b2202fa8b603e8aaacec") 
    } 
} 
+0

충분히 명확합니다. 여기에 MongoDB의 권장 모범 사례가 있습니까? –

+0

복제 지연에 대한 영향이 우려되는 경우 jeffl의 일괄 삭제 및 스로틀 링 방식은 매우 유용합니다. 서버 환경에 대한 자세한 리소스/성능 세부 정보가 없으면 삭제의 영향 (예 : 보조 서버가 정상적으로 유지 될 수 있음)을 말하기 어렵습니다. 64 비트 Linux 시스템의 [기본 oplog 크기] (http://docs.mongodb.org/manual/core/replica-set-oplog/#oplog-size)는 사용 가능한 디스크 공간의 5 %이므로, 당신이 아마 수백만 건의 삭제로 롤백 할 가능성은 희박합니다. 스테이징/QA 환경에서 테스트하는 것이 가장 좋습니다. – Stennie

+0

이 두 가지 대답이 모두 올바른 것으로 간주됩니다. 감사. –

관련 문제