2013-04-16 4 views
1

백그라운드 스레드에서 전체 컬렉션을 동시에 업데이트해야하지만 읽기 작업이 동시에 수행 될 수 있습니다. 컬렉션을 벤치 마크 할 때 컬렉션을 업데이트하는 데 약 3 초가 걸립니다. 컬렉션을 업데이트하는 동안 컬렉션을 잠글 수있는 방법이 있습니까? 새 컬렉션을 만들고 모든 문서를 그 안에 삽입하고 "dropToTarget = true"로 원래 컬렉션의 이름을 변경하려고 시도하지만 샤딩 측면에서 얼마나 안전하고 안정적인지 확신 할 수 없습니다. 나는 renameCollection이 샤딩과 호환되지 않는다는 것을 읽었다.mongodb - mongodb java 클라이언트로 컬렉션을 잠그는 법

누군가가 좋은 아이디어가 있다면 제안 할 수 있다면 좋을 것입니다.

감사합니다.

+0

이전 수집 데이터를 삭제하는 것을 당신은 무엇을하려고합니까? 필드로 데이터를 버전화할 수 있습니까? – WiredPrairie

+0

우리는 오래된 데이터를 사용하지 않기 때문에 DB에 보관하지 않습니다. 그리고 우리는 항상 새로운 데이터를 사용자에게 제공합니다. – user826323

+0

제 질문은 사용 방법에 관한 것입니다. 버전으로 데이터에 태그를 지정하면 새 데이터를 쓰고 해당 버전에서 읽을 클라이언트를 업데이트 한 후 다음 업데이트에서 가장 오래된 버전을 삭제할 수 있습니다. – WiredPrairie

답변

0

컬렉션을 업데이트하는 두 가지 전략을 제시 했습니까? 하나는 잠금이 적용된 인라인이고 다른 하나는 임시 컬렉션이있는 컬렉션입니다.

mongodb 문서에 명확하게 지정된 컬렉션 (http://docs.mongodb.org/manual/reference/command/renameCollection/)에서는 작동하지 않는다고 명시되어 있습니다. 내 이해에서 이것은 당신이 이전에 보관 된 샤딩 (정보)을 거의 잃어 버릴 것이라는 실제 이름을 바꾸기 전에 다른 콜렉션을 삭제해야하므로 이름을 바꾸려는 콜렉션이 샤드되지 않았 음을 의미합니다. 따라서 샤딩을 다시 활성화해야합니다. 특히 데이터를 공유하는 경우 특히 두 가지 수집 방법을 사용하지 않는 것이 좋습니다.
sharded 컬렉션의 모든 데이터를 가져 와서 중앙 집중식으로 저장해야합니다. 업데이트가 끝나면 컬렉션의 이름을 바꾸고 다시 파쇄해야합니다. 이로 인해 전체 시스템, 특히 업데이트를 수행중인 클라이언트에 대해 많은 I/O가 발생합니다.

시스템 아키텍처에 따라 (단일 입력 지점을 사용하여). 현재 콜렉션 업데이트가 실행 중인지 알려주는 글로벌 플래그를 쉽게 보유 할 수 있습니다. 다른 쓰기 작업을 금지합니다.
MongoDB에 여러 개의 진입 점이있는 경우 $ 격리 시키려고 시도 할 수 있지만 공유 된 컬렉션에서는 작동하지 않습니다. 읽기 작업이 가능한지 확실하지 않지만 문서가 명확하지 않습니다.

업데이트가 진행되는 동안 어떤 데이터도 쓰지 못하도록 금지되어 있습니까? 어떤 유형의 업데이트를 수행합니다. 서로 영향을 줄 수 있습니까? 또는 동시 쓰기가 가능합니까?

+0

클라이언트가 데이터를 쓰거나 업데이트하지 않습니다. 클라이언트 측에서만 읽기 전용입니다. 내 백엔드 구성 요소 만 하루에 한 번씩 새 데이터로 업데이트하거나 씁니다. 모든 데이터를 삭제하고 매일 삽입하고 싶습니다. 그래서 모든 데이터를 삭제하거나 새로운 데이터를 쓸 때 클라이언트가 이전 데이터 대신 새로운 데이터를 기다리거나 읽도록하고 싶습니다. 컬렉션 이름을 바꾸는 방법을 사용하고 싶지 않습니다.그래서 컬렉션을 잠그는 방법을 찾아 내려고합니다. – user826323

관련 문제