refineCollectionShardKey
정의
refineCollectionShardKey
기존 키에 접미사로 새 필드 를 추가하여 컬렉션의 샤드 키 를 수정합니다. 컬렉션의 샤드 키 를 수정하면 기존 키가 불충분한 카디널리티 로 인해 점보(즉, 분할할 수 없는) 청크 가 되는 상황을 주소 수 있습니다.
참고
데이터 분산
샤드 키 구체화의 일환으로 refineCollectionShardKey
명령은 기존 키 필드의 범위 값을 수정하지 않고 새 필드를 통합하도록 청크 범위 및 구역 범위 를 업데이트합니다. 즉, 샤드 키 를 세분화해도 샤드 또는 구역에 걸친 청크 분포에 즉시 영향을 미치지 않습니다. 향후 청크 분할 또는 마이그레이션 은 일상적인 샤딩 작업의 일부로 발생합니다.
호환성
이 명령은 다음 환경에서 호스팅되는 배포에서 사용할 수 있습니다.
MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스
중요
이 명령은 M10+ 클러스터 또는 서버리스 인스턴스에서 지원되지 않습니다. 자세한 내용은 지원되지 않는 명령을 참조하세요.
MongoDB Enterprise: MongoDB의 구독 기반 자체 관리 버전
MongoDB Community: MongoDB의 소스 사용 가능 무료 자체 관리 버전
구문
참고
refineCollectionShardKey
명령을 사용하려면 샤드 클러스터의 기능 호환성 버전(fcv) 이 4.4
이어야 합니다.
refineCollectionShardKey
명령은 admin
데이터베이스 에 대해 실행 해야 하며 다음과 같은 형식을 갖습니다.
db.adminCommand( { refineCollectionShardKey: "<database>.<collection>", key: { <existing key specification>, <suffix1>: <1|"hashed">, ... } } )
명령 필드
refineCollectionShardKey
명령에는 다음과 같은 필드가 있습니다.
필드 | 유형 | 설명 |
---|---|---|
문자열 |
| |
문서 | 컬렉션의 새 샤드 키로 사용할 필드를 지정하는 문서입니다.
접미사 필드의 경우 필드 값을 다음 중 하나로 설정합니다.
|
액세스 제어
액세스 제어와 함께 실행하는 경우 명령을 실행하려면 사용자에게 데이터베이스 및/또는 refineCollectionShardKey
collection 에 대한 권한 조치가 있어야 합니다. 즉, 사용자에게는 다음 권한 을 부여하는 역할 이 있어야 합니다.
{ resource: { db: <database>, collection: <collection> }, actions: [ "refineCollectionShardKey" ] }
기본 제공 clusterManager
역할은 적절한 권한을 제공합니다.
고려 사항
인덱스 고려 사항
- 인덱스 존재 여부
명령을 실행 하기 전에 명령에 지정된 키 를 지원하는 인덱스가 존재해야 합니다.
지원 인덱스는 새 샤드 키 사양으로 시작하는 인덱스입니다. 즉, 인덱스 접두사 가 새 샤드 키 사양과 일치합니다. 즉, 샤드 키를 로 변경하려면
{ x: 1, y: 1 }
{ x: 1 }
로 시작하는 인덱스가{ x: 1, y: 1 }
있어야 합니다. 예{ x: 1, y: 1 }
{ x: 1, y: 1, a: 1, b: 1}
참고
지원 인덱스는 부분 인덱스가 될 수 없습니다.
지원 인덱스는 희소 인덱스일 수 없습니다.
If the collection에서
simple
이 아닌 데이터 정렬을 사용하는 경우 지원 인덱스는{ locale: "simple" }
데이터 정렬을 지정해야 합니다.
- 고유 인덱스
현재 샤드 인덱스에 고유성 제약 조건 이 있는 경우 새 샤드 키 인덱스에도 고유성 제약 조건이 있어야 합니다.
After creating the unique index to support the new shard key, drop the old shard key index before runningrefineCollectionShardKey
.Also, if the current shard index has a unique constraint, then the new shard key cannot specify"hashed"
for any of its fields.See also Sharded Collection and Unique Indexes.
- 인덱스 데이터 정렬
- 샤딩된 collection에
simple
이 아닌 기본 데이터 정렬 이 있는 경우 인덱스에는{ locale : "simple" }
가 있는 데이터 정렬 문서가 포함 되어야 합니다 . 샤드 키 패턴을 지원하는 필드가 있는 인덱스 중 하나 이상에는 단순 데이터 정렬이 있어야 합니다.
경고
현재 샤드 키 필드의 범위 또는 해시 유형을 수정하지 마세요. 데이터 불일치를 유발합니다. 예를 들어 샤드 키를 { customer_id: 1 }
에서 { customer_id:
"hashed", order_id: 1 }
로 수정하지 마세요.
예시
test
데이터베이스에서 예시를 설정하려면 다음을 수행합니다.
샤딩 이 아직 활성화되지 않은 경우 데이터베이스 에서 샤딩 을 활성화합니다.
sh.enableSharding("test") 다음
shardCollection
작업을 사용하여test
데이터베이스에서orders
collection을 샤딩합니다. 이 작업은customer_id
필드를 초기 샤드 키로 사용합니다.db.adminCommand( { shardCollection: "test.orders", key: { customer_id: 1 } } )
샤드 키를 customer_id
필드 및 order_id
필드 { customer_id: 1, order_id: 1 }
로 수정하려면 다음을 수행합니다.
Create the index
인덱스가 아직 존재하지 않는 경우 새 샤드 키를 지원합니다.db.getSiblingDB("test").orders.createIndex( { customer_id: 1, order_id: 1 } ) refineCollectionShardKey
명령을 실행하여order_id
필드를 접미사로 추가합니다.db.adminCommand( { refineCollectionShardKey: "test.orders", key: { customer_id: 1, order_id: 1 } } )
명령이 성공적으로 완료되면 collection의 샤드 키가 { customer_id: 1, order_id: 1 }
로 변경됩니다. sh.status()
을(를) 실행하여 확인할 수 있습니다.
팁
샤드 키를 세분화한 후에는 컬렉션의 모든 문서에 접미사 필드가 없는 경우가 있을 수 있습니다. 누락된 샤드 키 필드를 채우려면 누락된 샤드 키 필드를 참조합니다.
샤드 키를 세분화하기 전에 컬렉션의 모든 문서 또는 대부분의 문서에 접미사 필드가 있는지 확인하여 나중에 필드를 채울 필요가 없도록 하세요.
이simple
아닌 데이터 정렬이 있는 컬렉션
test
데이터베이스에서 예시를 설정하려면 다음을 수행합니다.
샤딩 이 아직 활성화되지 않은 경우 데이터베이스 에서 샤딩 을 활성화합니다.
sh.enableSharding("test") cafés
collection을test
fr
기본 데이터 정렬 로 지정하여 데이터베이스에 만듭니다.db.getSiblingDB("test").createCollection( "cafés", { collation: { locale: "fr" } } ); customer_id
필드를 초기 샤드 키로 사용하여 collection을 샤딩합니다. 컬렉션에는 기본fr
데이터 정렬이 있고simple
데이터 정렬은 없으므로shardCollection
명령에는collation: { locale: "simple" }
옵션이 포함되어야 합니다.db.adminCommand( { shardCollection: "test.cafés", key: { customer_id: 1 }, collation: { locale: "simple" } } )
샤드 키를 customer_id
필드와 order_id
필드 { customer_id: 1, order_id: 1 }
모두로 수정하려면 다음을 수행합니다.
인덱스가 아직 존재하지 않는 경우
Create the index
를 사용하여 새 샤드 키를 지원합니다. collection이 비단순 데이터 정렬 을 사용하기 때문에 인덱스에collation: { locale: "simple" }
옵션이 포함되어야 합니다.db.getSiblingDB("test").cafés.createIndex( { customer_id: 1, order_id: 1 }, { collation: { locale: "simple" } } ) refineCollectionShardKey
명령을 실행하여order_id
필드를 접미사로 추가합니다.db.adminCommand( { refineCollectionShardKey: "test.cafés", key: { customer_id: 1, order_id: 1 } } )
명령이 성공적으로 완료되면 collection의 샤드 키가 { customer_id: 1, order_id: 1 }
로 변경됩니다. sh.status()
을(를) 실행하여 확인할 수 있습니다.
팁
샤드 키를 세분화한 후에는 컬렉션의 모든 문서에 접미사 필드가 없는 경우가 있을 수 있습니다. 누락된 샤드 키 필드를 채우려면 누락된 샤드 키 필드를 참조합니다.
샤드 키를 세분화하기 전에 컬렉션의 모든 문서 또는 대부분의 문서에 접미사 필드가 있는지 확인하여 나중에 필드를 채울 필요가 없도록 하세요.