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

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
선택 사항. 컬렉션을 리샤딩할 때 클러스터의 모든 샤드에 생성할 초기 청크 수를 지정합니다. 기본값은 현재 샤드 키 패턴에 따라 컬렉션에 존재하는 청크의 수입니다. 그런 다음 MongoDB는 클러스터 전체에 청크를 생성하고 균형을 맞춥니다. numInitialChunks 의 결과는 샤드당 8192 미만이어야 합니다.
collation
문서
선택 사항. reshardCollection 에 지정된 collection에 기본 데이터 정렬 이 있는 경우 { locale : "simple" } 과 데이터 정렬 문서를 포함 해야 하며 , 그렇지 않으면 reshardCollection 명령이 실패합니다.
zones
배열
선택 사항. 구역 을 유지 관리하거나 추가하려면 컬렉션의 구역을 배열로 지정합니다.
forceRedistribution
부울

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

버전 7.2에 새로 추가되었습니다.

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

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

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

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

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

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

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

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

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

인덱스 단계 중:

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

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

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

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

  • 각 샤드 수신자는 수신자가 데이터를 복제한 후에 발생한 작업의 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 7.2부터는 동일한 키의 collection을 리샤딩할 수 있으며, 이를 사용하여 새 샤드에 데이터를 재배분할 수 있습니다.

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

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

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

다음 명령은 accounts.sales 동일한 샤드 키를 사용하여 collection의 데이터를 재배포하여 zone01 zones zone02 zone03 및 에서 및 로 데이터를 zone04 이동합니다.

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() }
}
]
})

돌아가기

removeShardFromZone