Docs Menu

reshardCollection

reshardCollection

버전 5.0에 추가.

reshardCollection 명령은 컬렉션의 샤드 키를 변경하고 데이터 배포를 변경합니다.

mongosh에서 이 명령을 sh.reshardCollection() 헬퍼 메서드를 통해서도 실행할 수 있습니다.

헬퍼 메서드는 mongosh 사용자에게 편리하지만 데이터베이스 명령과 동일한 수준의 정보를 반환하지 못할 수 있습니다. 편의가 필요하지 않거나 추가 리턴 필드가 필요한 경우 데이터베이스 명령을 사용합니다.

이 명령은 다음 환경에서 호스팅되는 배포에서 사용할 수 있습니다.

  • MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스

참고

이 명령은 모든 MongoDB Atlas 클러스터에서 지원됩니다. 모든 명령에 대한 Atlas 지원에 관해 자세히 알아보려면 지원되지 않는 명령을 참조하십시오.

명령은 다음과 같은 구문을 가집니다:

db.adminCommand(
{
reshardCollection: "<database>.<collection>",
key: <shardkey>,
unique: <boolean>,
numInitialChunks: <integer>,
collation: { locale: "simple" },
zones: [
{
min: <document with same shape as shardkey>,
max: <document with same shape as shardkey>,
zone: <string> | null
},
...
],
forceRedistribution: <bool>
}
)

이 명령은 다음 필드를 사용합니다.

필드
유형
설명

reshardCollection

문자열

리샤딩할 컬렉션의 네임스페이스 입니다. <database>.<collection> 형식을 취합니다.

key

문서

샤드 키로 사용할 새 필드를 지정하는 문서입니다.

{ <field1>: <1|"hashed">, ... }

필드 값을 다음 중 하나로 설정합니다.

unique

부울

선택 사항. 샤드 키에 고유성 제약 조건이 있는지 여부를 지정합니다. false 만 지원됩니다. 기본값은 false 입니다.

numInitialChunks

integer

선택 사항. 컬렉션 을 리샤딩할 때 클러스터 의 모든 샤드에 생성할 초기 청크 수를 지정합니다. 기본값 은 90입니다. 그런 다음 MongoDB 클러스터 전체에 청크를 생성하고 균형을 맞춥니다. numInitialChunks 는 샤드 당 8192 미만이어야 합니다.

collation

문서

선택 사항. reshardCollection 에 지정된 collection에 기본 데이터 정렬 이 있는 경우 { locale : "simple" } 과 데이터 정렬 문서를 포함 해야 하며 , 그렇지 않으면 reshardCollection 명령이 실패합니다.

zones

배열

선택 사항. 컬렉션 의 구역을 지정합니다.

구역을 유지하거나 추가하려면 컬렉션 의 구역을 배열 지정합니다.

[
{
min: <document with same shape as shardkey>,
max: <document with same shape as shardkey>,
zone: <string> | null
},
...
]

forceRedistribution

부울

선택 사항. true 로 설정하면 새 샤드 키가 이전 샤드 키와 동일한 경우에도 작업이 실행됩니다. zones 옵션과 함께 사용하여 데이터를 특정 구역으로 이동합니다.

버전 8.0에 추가 되었습니다.

리샤딩 중에 발생하는 인덱스 빌드는 자동으로 실패할 수 있습니다.

  • 리샤딩 프로세스 중에는 인덱스를 생성하지 마세요.

  • 진행 중인 인덱스 빌드가 있는 경우 리샤딩 프로세스 를 시작하지 마세요.

컬렉션 리샤딩 작업에서 샤드는 다음과 같을 수 있습니다.

  • 기증자는 현재 샤딩된 컬렉션의 청크를 저장합니다.

  • 수신자샤드 키구역을 기반으로 샤드 컬렉션의 새 청크를 저장합니다.

샤드는 기증자와 수신자가 동시에 될 수 있습니다.

config 서버 프라이머리는 항상 리샤딩 코디네이터이며 리샤딩 작업의 각 단계를 시작합니다.

초기화 단계에서 리샤딩 코디네이터는 샤딩된 컬렉션에 대한 새 데이터 분포를 결정합니다.

복제 단계 중:

  • 각 수신자 샤드 기증자 샤딩된 컬렉션 과 동일한 컬렉션 옵션을 사용하여 임시로 빈 샤딩된 컬렉션 생성합니다. 이 새 컬렉션 수신자 샤드가 새 데이터를 쓰기 (write) 위치의 대상입니다. 수신자 샤드는 인덱스 단계까지 _id 인덱스 제외한 인덱스 생성하지 않습니다.

  • 각 수신자 샤드 수신자 샤드 새 샤드 키 하에 소유한 모든 문서를 포함하여 기증자 샤드 의 컬렉션 데이터를 복제합니다.

인덱스 단계에서 각 수신자 샤드 필요한 새 인덱스를 빌드합니다. 여기에는 샤딩된 컬렉션 의 모든 기존 인덱스와 새 샤드 키 패턴 과 호환되는 인덱스 (해당 인덱스 샤딩된 컬렉션 에 아직 존재하지 않는 경우)가 포함됩니다.

적용 및 따라잡기 단계:

  • 각 수신자 샤드 수신자가 데이터를 복제한 후 해당 기증자 샤드 에 기록된 oplog 항목을 적용하기 시작합니다.

  • 리샤딩 작업을 완료하는 데 남은 예상 시간이 2초 미만인 경우, 기증자 샤드 는 소스 컬렉션 에 대한 쓰기를 차단합니다.

참고

원하는 경우 commitReshardCollection 명령을 실행하여 리샤딩 작업을 수동으로 강제로 완료할 수 있습니다. 이는 리샤딩 작업을 완료하는 데 걸리는 현재 예상 시간이 컬렉션에서 쓰기를 차단하기에 적합한 기간인 경우에 유용합니다. commitReshardCollection 명령은 쓰기를 조기에 차단하고 리샤딩 작업을 강제로 완료합니다. 쓰기가 차단되는 기간 동안 애플리케이션의 지연 시간이 증가합니다.

커밋 단계에서 다음을 수행합니다.

  • 리샤딩 조정자는 모든 샤드가 엄격한 일관성 에 도달할 때까지 기다린 다음 리샤딩 작업을 커밋합니다.

  • 리샤딩 조정자는 각 기증자와 수신자 샤드 프라이머리에 독립적으로 임시 샤드 컬렉션의 이름을 바꾸도록 지시합니다. 임시 컬렉션은 새로운 리샤딩 컬렉션이 됩니다.

  • 각 기증자 샤드는 이전 샤드 컬렉션을 삭제합니다.

참고

리샤딩 프로세스 커밋 단계에 도달하면 로 프로세스 종료할 수 abortReshardCollection 없습니다.

다음 예시에서는 새 샤드 키 { order_id: 1 } 을(를) 사용하여 sales.orders 컬렉션을 리샤딩합니다.

db.adminCommand({
reshardCollection: "sales.orders",
key: { order_id: 1 }
})

출력:

{
ok: 1,
'$clusterTime': {
clusterTime: Timestamp(1, 1624887954),
signature: {
hash: Binary(Buffer.from("0000000000000000000000000000000000000000", "hex"), 0),
keyId: 0
}
},
operationTime: Timestamp(1, 1624887947)
}

다음도 참조하세요.

MongoDB 8.0부터는 동일한 키로 컬렉션 리샤딩할 수 있으며, 이를 사용하여 데이터를 새 샤드에 재배포할 수 있습니다.

cluster에 샤드를 추가한 후 reshardCollection 명령과 forceRedistribution 옵션을 사용하여 cluster 전체에 데이터를 재배포합니다.

db.adminCommand({
reshardCollection: "accounts.invoices",
key: { store_id: "hashed" },
forceRedistribution: true
})

MongoDB 8.0부터는 reshardCollection 명령을 사용하여 샤드 키 변경하지 않고도 데이터를 새 구역으로 이동할 수 있습니다.

다음 명령은 동일한 샤드 키 사용하여 accounts.sales 컬렉션 에 대한 데이터를 재배포하고 데이터를 구역 zone04zone05와 연결된 샤드로 이동합니다.

db.adminCommand({
reshardCollection: "accounts.sales",
key: { region_id: "hashed" },
forceRedistribution: true,
zones: [
{
zone: "zone04",
min: { region_id: MinKey() },
max: { region_id: 10 }
},
{
zone: "zone05",
min: { region_id: 10 },
max: { region_id: MaxKey() }
}
]
})