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

컬렉션 이동

이 페이지의 내용

  • 이 작업에 대하여
  • 액세스 제어
  • 시작하기 전에
  • 단계
  • 자세히 알아보기

MongoDB 8.0 부터는 moveCollection 명령을 사용하여 샤딩되지 않은 컬렉션 을 다른 샤드 로 이동할 수 있습니다.

  • moveCollection 샤딩된 클러스터에서만 실행 수 있습니다.

  • moveCollection 는 샤딩되지 않은 컬렉션만 이동할 수 있습니다.

  • moveCollection 한 번에 하나의 컬렉션 만 이동할 수 있습니다.

  • moveCollection 최소 지속 시간은 5 분입니다.

  • moveCollection 실행 후 Atlas Search 인덱스를 다시 작성해야 합니다.

  • moveCollection 가 완료될 때까지 샤드 추가 또는 제거 또는 임베디드 구성 서버와 전용 구성 서버 간의 전환과 같은 토폴로지 변경을 수행할 수 없습니다.

  • moveCollection 이(가) 진행 중인 동안에는 이동 중인 컬렉션 에 대해 다음 작업을 실행 수 없습니다.

  • moveCollection 이(가) 진행 중인 동안에는 클러스터 에 대해 다음 작업을 실행 수 없습니다.

  • moveCollection 이(가) 진행 중인 동안 발생하는 인덱스 빌드는 자동으로 실패할 수 있습니다.

    • moveCollection 이(가) 진행되는 동안에는 인덱스를 생성하지 마세요.

    • 진행 중인 인덱스 빌드가 있는 경우 moveCollection 를 호출하지 마세요.

배포서버 에 액세스 제어 가 활성화되어 있는 경우 enableSharding 역할 은 moveCollection 명령을 실행 수 있는 액세스 을 부여합니다.

컬렉션 을 이동하기 전에 다음 요구 사항을 충족하는지 확인하세요.

  • 애플리케이션 은 영향을 받는 컬렉션 이 쓰기를 차단하는 2초의 기간을 허용할 수 있습니다. 쓰기가 차단되는 기간 동안 애플리케이션 의 지연 시간 이 증가합니다.

  • 데이터베이스는 다음과 같은 리소스 요구 사항을 충족합니다.

    • 컬렉션 을 이동하려는 샤드 에 컬렉션 및 해당 인덱스를 위한 충분한 저장 공간이 있는지 확인합니다. 대상 샤드 에는 최소 ( Collection storage size + Index Size ) * 2 바이트의 사용 가능한 공간이 필요합니다.

    • I/O 용량 이 50% 미만인지 확인합니다.

    • CPU 로드가 80% 미만인지 확인합니다.

중요

이러한 요구 사항은 데이터베이스에 의해 적용되지 않습니다. 충분한 리소스를 할당하지 못하면 다음과 같은 결과가 발생할 수 있습니다.

  • 데이터베이스 공간이 부족하여 종료되는 경우

  • 성능 저하

  • 작업이 예상보다 오래 걸리는 경우

애플리케이션 에 트래픽이 적은 기간이 있는 경우 가능하면 해당 기간 동안 컬렉션 에 대해 이 작업을 수행합니다.

1

app 데이터베이스 의 inventory 이라는 샤딩되지 않은 컬렉션 을 shard02 샤드 로 이동하려면 moveCollection 를 실행 .

db.adminCommand(
{
moveCollection: "app.inventory",
toShard: "shard02"
}
)

사용 가능한 샤드 ID 목록을 가져오려면 sh.status() 를 실행 합니다. 자세한 내용은 sh.status() 출력을 참조하세요.

2
  1. 남은 시간을 모니터링합니다.

    moveCollection 작업에 남은 시간을 모니터 하려면 $currentOp 파이프라인 단계를 사용합니다.

    이 예시 에서는 app.inventory 컬렉션 에서 moveCollection 의 진행 상황을 확인하는 방법을 보여 줍니다.

    db.getSiblingDB("admin").aggregate( [
    { $currentOp: { allUsers: true, localOps: false } },
    {
    $match: {
    type: "op",
    "originatingCommand.reshardCollection": "app.inventory"
    }
    }
    ] )

    참고

    업데이트된 값을 확인하려면 이전 파이프라인을 계속 실행해야 합니다.

    $currentOp 파이프라인은 다음을 출력합니다.

    • totalOperationTimeElapsedSecs: 경과된 작업 시간(초)

    • remainingOperationTimeEstimatedSecs: 현재 moveCollection 작업에 남은 예상 시간(초)입니다. 새 moveCollection 작업이 시작되면 -1 으)로 반환됩니다.

    참고

    remainingOperationTimeEstimatedSecs 비관치 추정으로 설정됩니다.

    • 따라잡기 단계 시간 추정치는 복제 단계 시간으로 설정하다 되며,
      시간이 비교적 오래 걸립니다.
    • 실제로 보류 중인 쓰기 (write) 작업이 몇 개만 있는 경우
      실제 따라잡기 단계 시간은 상대적으로 짧습니다.

    이 파이프라인 단계의 출력은 다음과 유사합니다.

    [
    {
    shard: '<shard>',
    type: 'op',
    desc: 'ReshardingRecipientService | ReshardingDonorService | ReshardingCoordinatorService <reshardingUUID>',
    op: 'command',
    ns: '<database>.<collection>',
    originatingCommand: {
    reshardCollection: '<database>.<collection>',
    key: <shardkey>,
    unique: <boolean>,
    collation: { locale: 'simple' }
    },
    totalOperationTimeElapsedSecs: <number>,
    remainingOperationTimeEstimatedSecs: <number>,
    ...
    },
    ...
    ]
  2. 전송된 바이트 수를 모니터링합니다.

    전송된 바이트 수를 모니터 하려면 shardingStatistics.resharding.active.bytesCopied 를 사용하고 컬렉션 의 바이트 수와 비교합니다.

3

컬렉션 이 예상 샤드 로 이동되었는지 확인하려면 $collStats 파이프라인 단계를 사용합니다.

이 예시 에서는 예상 샤드 에 app.inventory 컬렉션 이 있는지 확인하는 방법을 보여 줍니다.

db.inventory.aggregate( [
{ $collStats: {} },
{ $project: { "shard": 1 } }
] )

이 파이프라인 단계의 출력은 다음과 유사합니다.

[ { shard: 'shard02' } ]

돌아가기

이동 가능한 컬렉션