Docs Menu
Docs Home
/
MongoDB 매뉴얼
/ / /

sh.reshardCollection()

이 페이지의 내용

  • 정의
  • 호환성
  • 고려 사항
  • 리샤딩 프로세스
  • 예시
sh.reshardCollection(namespace, key, unique, options)

버전 5.0에 추가.

sh.reshardCollection() 메서드는 컬렉션의 샤드 키를 변경하고 데이터 배포를 변경합니다.

컬렉션 을 리샤딩하기 전에 리샤드 요구 사항리샤드 제한 사항을 읽어보세요.

중요

Mongo쉬 방법

이 페이지에서는 mongosh 메서드에 대해 설명합니다. 이는 데이터베이스 명령 또는 Node.js와 같은 언어별 드라이버에 대한 설명서가 아닙니다.

데이터베이스 명령에 대해서는 reshardCollection 명령을 참조하십시오.

MongoDB API 드라이버의 경우 언어별 MongoDB 드라이버 설명서를 참조하세요.

sh.reshardCollection() 은(는) 다음 필드를 사용합니다.

필드
유형
설명

namespace

문자열

"<database>.<collection>" 형식으로 샤딩할 컬렉션의 네임스페이스입니다.

key

문서

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

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

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

샤드 키 인덱스도 참조하세요.

unique

부울

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

options

문서

선택 사항. numInitialChunks, collationzones 를 포함한 선택적 필드가 포함된 문서입니다.

options 필드는 다음 필드를 지원합니다.

필드
유형
설명

numInitialChunks

integer

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

collation

문서

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

zones

배열

선택 사항. 구역 을 유지 관리하거나 추가하려면 컬렉션의 구역을 배열로 지정합니다.

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

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

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

중요

이 명령은 M0, M2 및 M5 클러스터에서 지원되지 않습니다. 자세한 내용은 지원되지 않는 명령을 참조하세요.

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

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

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

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

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

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

샤드는 기증자와 수신자가 동시에 될 수 있습니다. 구역을 사용하지 않는 한 기증자 샤드 세트는 수신자 샤드와 동일합니다.

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

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

인덱스 단계 중:

  • 각 샤드 수신자는 기존 샤드 컬렉션과 동일한 컬렉션 옵션을 사용하여 빈 샤드 컬렉션을 새로 생성합니다. 이 새로운 샤드 컬렉션은 수신자 샤드가 새 데이터를 쓰는 위치의 대상입니다.

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

복제, 적용 및 따라잡기 단계에서 다음을 수행합니다.

  • 각 샤드 수신자는 새 샤드 키 하에 소유하게 될 문서의 초기 사본을 복제합니다.

  • 각 샤드 수신자는 수신자가 데이터를 복제한 후에 발생한 작업의 oplog 항목을 적용하기 시작합니다.

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

    참고

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

  • 리샤딩 프로세스가 커밋 단계에 도달한 후에는 sh.abortReshardCollection() 으로 프로세스를 종료할 수 없습니다.

  • 모든 샤드가 엄격한 일관성에 도달하면 리샤딩 조정자가 리샤딩 작업을 커밋하고 새 라우팅 테이블을 설치합니다.

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

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

    다음도 참조하세요.

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

sh.reshardCollection( "sales.orders", { order_id: 1 } )

출력 예시:

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

변화하는 요구 사항을 충족하거나 성능을 개선하기 위해 클러스터의 샤드 전체에 데이터 분산을 조정해야 하는 경우 구역으로 컬렉션을 리샤딩합니다.

다음 예시 에서 test.scores 컬렉션 은 shard0shard1 에 있습니다. 현재 샤드 키 는 { _id: 1} 입니다.

1

이 예시 에서는 이 구역 을 NewZone 이라고 합니다.

sh.addShardToZone( "shard2", "NewZone" )
sh.addShardToZone( "shard3", "NewZone" )
2
sh.reshardCollection(
"test.scores",
{ "studentId": 1, "testId": 1},
{ zones: [ {
min: { "studentId": MinKey(), "testId": MinKey() },
max: { "studentId": MaxKey(), "testId": MaxKey() },
zone: "NewZone" }
]
} )

리샤딩 작업은 NewZone 구역 의 샤드를 수신자로 추가합니다. 데이터베이스 프라이머리 샤드 는 구역 정의에서 누락된 범위에 대한 백스탑으로 수신자로 추가됩니다. 누락된 범위가 없는 경우 컬렉션 은 "NewZone" 의 샤드에 복제됩니다(예: 이 예시 에서는 shard2shard3 ). sh.reshardCollection 은 다음을 반환합니다.

{
ok: 1,
'$clusterTime': {
clusterTime: Timestamp( { t: 1699484530, i: 54 } ),
signature: {
hash: Binary.createFromBase64( "90ApBDrSSi4XnCpV3OWIH4OGO0Y=", 0 ),
keyId: Long( "7296989036055363606" )
} },
operationTime: Timestamp( { t: 1699484530, i: 54 } )
}

다음도 참조하세요.

돌아가기

sh.removeTagRange