문서 메뉴

문서 홈애플리케이션 개발MongoDB 매뉴얼

refineCollectionShardKey

이 페이지의 내용

  • 정의
  • 구문
  • 액세스 제어
  • 고려 사항
  • 예제
refineCollectionShardKey

기존 키에 접미사로 새 필드를 추가하여 컬렉션의 샤드 키 를 수정합니다. 컬렉션의 샤드 키를 수정하면 기존 키가 불충분한 카디널리티로 인해 점보(즉, 분할할 수 없는) 청크 가 되는 상황을 해결할 수 있습니다.

참고

데이터 분산

샤드 키 수정의 일환으로 refineCollectionShardKey 명령은 기존 키 필드의 범위 값을 수정하지 않고 새 필드를 통합하도록 청크 범위구역 범위 를 업데이트합니다. 즉, 샤드 키를 세분화해도 샤드 또는 구역에 걸친 청크 분포에 즉시 영향을 미치지 않습니다. 향후 청크 분할 또는 마이그레이션은 일상적인 샤딩 작업의 일부로 발생합니다.

참고

refineCollectionShardKey 명령을 사용하려면 샤드 클러스터의 기능 호환성 버전(fcv)4.4 이어야 합니다.

refineCollectionShardKey 명령은 admin 데이터베이스에 대해 실행해야 하며 다음과 같은 형식을 갖습니다.

db.adminCommand( {
refineCollectionShardKey: "<database>.<collection>",
key: { <existing key specification>, <suffix1>: <1|"hashed">, ... }
} )

refineCollectionShardKey 명령에는 다음과 같은 필드가 있습니다.

필드
유형
설명
refineCollectionShardKey
문자열

"<database>.<collection>" 형식의 샤드 collection의 네임스페이스 입니다.

문서

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

{ <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}

    참고

  • 고유 인덱스

    현재 샤드 인덱스에 고유성 제약 조건 이 있는 경우 새 샤드 키 인덱스에도 고유성 제약 조건이 있어야 합니다.

    새 샤드 키를 지원하기 위해 고유 인덱스를 refineCollectionShardKey 생성한 후 를실행 하기 전에 이전 샤드 키 인덱스를 삭제 합니다.
    또한 현재 샤드 인덱스에 고유 제약 조건 이 있는 경우 새 샤드 키에는 해당 필드에 "hashed" 를 지정할 수 없습니다.
  • 인덱스 데이터 정렬
    샤딩된 collection에simple 이 아닌 기본 데이터 정렬 이 있는 경우 인덱스에는 { locale : "simple" } 가 있는 데이터 정렬 문서가 포함 되어야 합니다 . 샤드 키 패턴을 지원하는 필드가 있는 인덱스 중 하나 이상에는 단순 데이터 정렬이 있어야 합니다.

경고

현재 샤드 키 필드의 범위 또는 해시 유형을 수정하지 마세요. 데이터 불일치가 발생합니다. 예를 들어, 샤드 키를 { customer_id: 1 } 에서 { customer_id: "hashed", order_id: 1 } 로 수정하지 마세요.

test 데이터베이스에서 예시를 설정하려면 다음을 수행합니다.

  1. 샤딩이 아직 활성화되어 있지 않은 경우 데이터베이스에서 샤딩을 활성화합니다.

    sh.enableSharding("test")
  2. 다음 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 } 로 수정하려면 다음을 수행합니다.

  1. Create the index 인덱스가 아직 존재하지 않는 경우 새 샤드 키를 지원합니다.

    db.getSiblingDB("test").orders.createIndex( { customer_id: 1, order_id: 1 } )
  2. refineCollectionShardKey 명령을 실행하여 order_id 필드를 접미사로 추가합니다.

    db.adminCommand( {
    refineCollectionShardKey: "test.orders",
    key: { customer_id: 1, order_id: 1 }
    } )

명령이 성공적으로 완료되면 collection의 샤드 키가 { customer_id: 1, order_id: 1 } 로 변경됩니다. sh.status() 을(를) 실행하여 확인할 수 있습니다.

샤드 키를 세분화한 후에는 컬렉션의 모든 문서에 접미사 필드가 없을 수 있습니다. 누락된 샤드 키 필드를 채우려면 누락된 샤드 키 필드를 참조하세요 .

샤드 키를 수정하기 전에 컬렉션의 전체 또는 대부분의 문서에 접미사 필드가 있는지 확인하여 나중에 필드를 채울 필요가 없도록 합니다.

test 데이터베이스에서 예시를 설정하려면 다음을 수행합니다.

  1. 샤딩이 아직 활성화되어 있지 않은 경우 데이터베이스에서 샤딩을 활성화합니다.

    sh.enableSharding("test")
  2. cafés collection을 test fr 기본 데이터 정렬 로 지정하여 데이터베이스에 만듭니다.

    db.getSiblingDB("test").createCollection( "cafés", { collation: { locale: "fr" } } );
  3. 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 } 모두로 수정하려면 다음을 수행합니다.

  1. 인덱스가 아직 존재하지 않는 경우 Create the index 를 사용하여 새 샤드 키를 지원합니다. collection이 비단순 데이터 정렬 을 사용하기 때문에 인덱스에 collation: { locale: "simple" } 옵션이 포함되어야 합니다.

    db.getSiblingDB("test").cafés.createIndex(
    { customer_id: 1, order_id: 1 },
    { collation: { locale: "simple" } }
    )
  2. 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() 을(를) 실행하여 확인할 수 있습니다.

샤드 키를 세분화한 후에는 컬렉션의 모든 문서에 접미사 필드가 없을 수 있습니다. 누락된 샤드 키 필드를 채우려면 누락된 샤드 키 필드를 참조하세요 .

샤드 키를 수정하기 전에 컬렉션의 전체 또는 대부분의 문서에 접미사 필드가 있는지 확인하여 나중에 필드를 채울 필요가 없도록 합니다.

다음도 참조하세요.

← mergeChunks