Docs Menu
Docs Home
/
MongoDB 매뉴얼
/ /

샤드 클러스터에서 샤드 제거

이 페이지의 내용

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

샤드 를 제거 하려면 샤드의 데이터가 클러스터 의 나머지 샤드로 마이그레이션되었는지 확인해야 합니다. 이 절차에서는 데이터를 안전하게 마이그레이션 하고 샤드 를 제거 하는 방법을 설명합니다.

  1. 이 절차에서는 sh.moveCollection() 메서드를 사용하여 제거된 샤드 에서 컬렉션을 이동합니다. 이 절차를 시작하기 전에 moveCollection 고려 사항요구 사항 을 검토 하여 명령 동작을 이해하세요.

  2. 샤드 를 제거 하려면 먼저 를 사용하여 클러스터의 인스턴스 중 mongos 하나에 mongosh 연결합니다.

1

샤드 에서 데이터를 마이그레이션 하려면 밸런서 프로세스 를 활성화해야 합니다. 밸런서 상태 를 확인하려면 sh.getBalancerState() 메서드를 사용합니다.

sh.getBalancerState()

작업이 true 을 반환하면 밸런서 가 활성화된 것입니다.

작업이 false 을 반환하는 경우 밸런서 활성화를 참조하세요.

2

샤드 의 이름을 찾으려면 listShards 명령을 실행 합니다.

db.adminCommand( { listShards: 1 } )

shards._id 필드 에는 샤드 이름이 포함됩니다.

3

제거 하려는 샤드 에 대해 removeShard 명령을 실행합니다.

db.adminCommand( { removeShard: "<shardName>" } )

참고

removeShard 연산은 다음을 반환합니다.

{
"msg" : "draining started successfully",
"state" : "started",
"shard" : "<shardName>",
"note" : "you need to drop or movePrimary these databases",
"dbsToMove" : [
"db1",
"db2"
],
"ok" : 1,
"operationTime" : Timestamp(1575398919, 2),
"$clusterTime" : {
"clusterTime" : Timestamp(1575398919, 2),
"signature" : {
"hash" : BinData(0,"Oi68poWCFCA7b9kyhIcg+TzaGiA="),
"keyId" : NumberLong("6766255701040824328")
}
}
}

샤드 는 draining 상태 가 되고 밸런서 는 제거된 샤드 에서 클러스터 의 다른 샤드로 청크를 마이그레이션하기 시작합니다. 이러한 마이그레이션은 전체 클러스터 에 미치는 심각한 영향 을 방지하기 위해 천천히 진행됩니다. 네트워크 용량 과 데이터 양에 따라 이 작업을 완료하는 데 몇 분에서 며칠까지 걸릴 수 있습니다.

샤드 가 draining 상태 인 동안 reshardCollection 명령을 사용하여 제거된 샤드 에서 데이터를 재배포할 수 있습니다.

reshardCollection 으)로 데이터를 이동하는 것이 밸런서 가 청크를 마이그레이션 할 때까지 기다리는 것보다 빠를 수 있습니다. 클러스터 는 데이터가 배출 샤드에 배치되지 않도록 합니다. moveCollection 작업과 reshardCollection 작업을 동시에 실행 수 없습니다.

4

샤딩된 컬렉션 네임스페이스 목록을 반환하려면 $shardedDataDistribution 단계를 사용하여 ns 필드 를 프로젝트 합니다.

use admin
db.aggregate(
[
{ $shardedDataDistribution: { } },
{ $project: { ns: 1 } }
]
)

이 튜토리얼의 뒷부분에서 참조할 수 있도록 출력을 기록합니다.

5
db.adminCommand( { listDatabases: 1, nameOnly: true } )
6

admin 및 config 를 제외한 클러스터 의 각 데이터베이스 에 대해 다음 단계를 수행합니다.

  1. 데이터베이스 컬렉션 나열

    데이터베이스 의 컬렉션을 나열하고, 다음 컬렉션 유형은 생략합니다.

    • CSFLE를 지원 하는 내부 컬렉션

    • 시스템 컬렉션

    • Time Series collection

    • 조회수

    use <databaseName>
    db.getCollectionInfos(
    {
    $and: [
    { type: { $nin: [ "view", "timeseries" ] } },
    { name: { $not: { $regex: "^system\." } } },
    { name: { $not: { $regex: "^enxcol_\..*(\.esc|\.ecc|\.ecoc|\.ecoc\.compact)$" } } }
    ]
    },
    { nameOnly: true }
    )
  2. 필요한 컬렉션 이동

    getCollectionInfos() 에서 반환된 각 컬렉션 에 대해 다음 단계를 수행합니다.

    참고

    한 번에 하나의 moveCollection 작업만 진행할 수 있습니다. 다음 컬렉션 으로 이동하기 전에 모든 하위 단계를 완료합니다.

    1. 컬렉션 을 이동해야 하는지 여부를 결정합니다.

      $collStats 집계 단계를 실행하고 nsshard 필드를 프로젝트 합니다.

      db.<collName>.aggregate(
      [
      {
      $collStats: { }
      },
      {
      $project: {
      ns: 1,
      shard: 1
      }
      }
      ]
      )

      다음 기준 중 하나라도 충족되면 컬렉션 을 건너뛰고 데이터베이스 의 다음 컬렉션 을 위해 i 단계로 돌아갑니다.

      • ns 필드 는 4 단계의 $shardedDataDistribution 출력에 있습니다.

      • shard 필드 는 제거되는 샤드 가 아닙니다.

      앞의 기준 중 어느 것도 충족하지 않는 경우 현재 컬렉션 에 대해 ii 단계를 계속 진행합니다.

    2. 컬렉션 을 이동합니다.

      컬렉션 을 이동하려면 컬렉션 에서 sh.moveCollection() 를 실행 합니다.

      sh.moveCollection( "<namespace>.<collection>", "<ID of recipient shard>" )

      참고

      moveCollection 샤딩된 된 네임스페이스 에서 명령을 실행 하면 실패합니다. 이 오류 메시지가 표시되면 이를 무시하고 다음 컬렉션 을 위해 i 단계로 돌아갑니다.

    3. 데이터베이스 의 각 컬렉션 에 대해 i 단계로 돌아갑니다.

  3. 다른 데이터베이스에 대해 이 절차를 반복합니다.

    클러스터 의 각 데이터베이스 에 대해 6 단계, Move collections off of the shard 단계(및 하위 단계)를 반복합니다.

7

db.printShardingStatus() 메서드를 실행합니다.

db.printShardingStatus()

명령 출력의 databases 섹션에서 database.primary 필드 를 확인합니다. primary 필드 가 제거된 샤드 인 경우 해당 데이터베이스의 프라이머리 샤드를 다른 샤드 로 이동해야 합니다.

데이터베이스의 프라이머리 샤드 를 변경하려면 movePrimary 명령을 실행 합니다.

경고

movePrimary 을(를) 실행 하면 Move collections off of the shard 단계에서 이동되지 않은 컬렉션은 movePrimary 프로세스 중에 사용할 수 없습니다.

db.adminCommand(
{
movePrimary: <dbName>,
to: <shardName>
}
)
8

마이그레이션 진행 상황을 확인하려면 admin 데이터베이스 에서 removeShard 를 다시 실행 합니다.

db.adminCommand( { removeShard: "<shardName>" } )

출력에서 remaining 필드 에는 다음과 같은 필드가 포함됩니다.

필드
설명
chunks
현재 샤드 에 남아 있는 청크의 수
dbs
프라이머리 샤드 가 샤드 인 데이터베이스의 수입니다. 이러한 데이터베이스는 dbsToMove 출력 필드 에 지정됩니다.
jumboChunks

전체 chunks 개수 중 점보인 숫자입니다.

jumboChunks 가 0 보다 큰 경우 샤드 에 jumboChunks 만 남을 때까지 기다립니다. jumbo 청크만 배출 이 완료되기 전에 점보 플래그를 수동으로 지워야 합니다. jumbo 플래그 지우기를 참조하세요.

jumbo 플래그를 지우면 밸런서가 이러한 청크를 마이그레이션할 수 있습니다. 마이그레이션 절차에 대한 자세한 내용은 범위 마이그레이션 절차를 참조하세요.

남은 청크 수가 0 이 될 때까지 removeShard 명령의 상태를 계속 확인합니다.

db.adminCommand( { removeShard: "<shardName>" } )
9

샤드 제거 프로세스 를 완료하려면 removeShard 명령을 다시 실행합니다.

db.adminCommand( { removeShard: <shardName> } )

참고

DDL 작업

클러스터 가 DDL 작업(예: 컬렉션 을 수정하는 작업 reshardCollection)을 실행하는 동안 샤드 를 제거 하면 동시 DDL 작업이 완료된 후 removeShard 작업이 실행됩니다.

샤드 가 제거되면 명령 출력은 다음과 유사합니다.

{
msg: 'removeshard completed successfully',
state: 'completed',
shard: '<shardName>',
ok: 1,
'$clusterTime': {
clusterTime: Timestamp({ t: 1721941519, i: 7 }),
signature: {
hash: Binary.createFromBase64('AAAAAAAAAAAAAAAAAAAAAAAAAAA=', 0),
keyId: Long('0')
}
},
operationTime: Timestamp({ t: 1721941519, i: 7 })
}

돌아가기

샤드에 구성원 추가