Docs Menu
Docs Home
/
MongoDB 매뉴얼
/ /

기존 샤딩된 클러스터에서 샤드 제거하기

이 페이지의 내용

  • 고려 사항
  • 밸런서 프로세스가 허용되어 있는지 확인
  • 제거할 샤드의 이름 결정
  • 샤드에서 청크 제거
  • 마이그레이션 상태 확인
  • 데이터베이스를 다른 프라이머리 샤드로 이동
  • 마이그레이션 완료

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

청크 분포가 균일하지 않은 클러스터에서 샤드를 제거하면 밸런서는 먼저 드레이닝 샤드에서 청크를 제거한 다음 나머지 불균등 청크 분포를 조정합니다.

이 절차에서는 클러스터 에서 샤드 를 제거 하는 방법을 설명합니다. 이 절차를 사용하여 전체 클러스터 를 새 hardware 로 마이그레이션 하지 마세요 . 마이그레이션 하려면 자체 관리형 샤드 클러스터를 다른 하드웨어로 마이그레이션하기를 대신 참조하세요.

샤드 를 제거 하려면 먼저 를 사용하여 클러스터의 인스턴스 중 하나에 mongos mongosh연결합니다. 그런 다음 이 문서 의 작업 순서에 따라 클러스터 에서 샤드 를 제거 하세요.

샤드 제거로 인해 열려 있던 변경 스트림 커서가 닫힐 수 있으며, 닫힌 변경 스트림 커서는 완전히 재개되지 않을 수 있습니다.

샤드에서 데이터를 성공적으로 마이그레이션하려면 밸런서 프로세스를 활성화해야 합니다. mongoshsh.getBalancerState()도우미를 사용하여 밸런서 상태를 확인하세요. 자세한 내용은 밸런서 연산 섹션을 참조하세요.

샤드의 이름을 확인하려면 mongos 또는 다음을 mongos 인스턴스에 연결합니다.

  • 다음과 같이 listShards 명령을 사용합니다.

    db.adminCommand( { listShards: 1 } )
  • sh.status() 또는 db.printShardingStatus() 메서드를 실행합니다.

shards._id 필드에는 각 샤드의 이름이 나열됩니다.

admin 데이터베이스에서 removeShard 명령을 실행하세요. 이렇게 하면 제거하려는 샤드에서 cluster의 다른 샤드로 청크를 "배출"하기 시작합니다. 예를 들어, mongodb0라는 이름의 샤드에 대해 다음을 실행합니다.

db.adminCommand( { removeShard: "mongodb0" } )

mongosremoveShard 명령의 쓰기 문제"majority"으로 변환합니다.

이 연산은 다음과 같은 응답을 반환합니다.

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

밸런서는 mongodb0라는 이름의 샤드의 청크를 cluster의 다른 샤드로 마이그레이션하기 시작합니다. 이러한 마이그레이션은 전체 cluster에 과도한 부하를 주지 않기 위해 느리게 수행됩니다. 네트워크 용량과 데이터 양에 따라 이 연산을 완료하는 데 몇 분에서 며칠까지 걸릴 수 있습니다.

참고

출력에는 샤드가 프라이머리 샤드인 데이터베이스(있는 경우)를 나타내는 필드 dbsToMove가 포함됩니다. 샤드에서 모든 청크를 삭제한 후에는 데이터베이스에 대해 movePrimary 또는 데이터베이스를 제거(관련 데이터 파일 삭제)해야 합니다.

프로세스의 어느 단계에서든 마이그레이션 진행 상황을 확인하려면 admin 데이터베이스에서 removeShard 다시 실행하세요. 예를 들어, mongodb0라는 이름의 샤드에 대해 다음을 실행합니다.

db.adminCommand( { removeShard: "mongodb0" } )

mongosremoveShard 명령의 쓰기 문제"majority"으로 변환합니다.

이 명령은 다음과 유사한 출력을 반환합니다.

{
"msg" : "draining ongoing",
"state" : "ongoing",
"remaining" : {
"chunks" : NumberLong(2),
"dbs" : NumberLong(2),
"jumboChunks" : NumberLong(0)
},
"note" : "you need to drop or movePrimary these databases",
"dbsToMove" : [
"fizz",
"buzz"
],
"ok" : 1,
"operationTime" : Timestamp(1575399086, 1655),
"$clusterTime" : {
"clusterTime" : Timestamp(1575399086, 1655),
"signature" : {
"hash" : BinData(0,"XBrTmjMMe82fUtVLRm13GBVtRE8="),
"keyId" : NumberLong("6766255701040824328")
}
}
}

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

필드
설명

chunks

현재 샤드에 남아 있는 청크의 총 개수입니다.

dbs

프라이머리 샤드가 샤드인 데이터베이스의 총 개수입니다. 이러한 데이터베이스는 dbsToMove 출력 필드에 지정되어 있습니다.

jumboChunks

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

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

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

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

db.adminCommand( { removeShard: "mongodb0" } )

샤드가 클러스터에 있는 하나 이상의 데이터베이스에 대한 프라이머리 샤드인 경우, 해당 데이터베이스가 다른 샤드를 프라이머리 샤드로 사용하도록 설정해야 합니다. removeShard(이)가 명령 출력의 dbsToMove 필드에 이동해야 하는 모든 데이터베이스를 나열합니다. 해당 샤드가 데이터베이스의 프라이머리 샤드가 아닌 경우, 다음 작업인 마이그레이션 완료로 건너뛰세요.

데이터베이스를 다른 샤드로 이동하려면 movePrimary 명령을 사용합니다.

중요

원활한 마이그레이션을 위해 movePrimary를 실행하기 전에 movePrimary 명령 설명서의 고려 사항을 참조하세요.

fizz 데이터베이스를 mongodb0에서 mongodb1으로 마이그레이션하려면 다음 명령을 실행하세요.

db.adminCommand( { movePrimary: "fizz", to: "mongodb1" })

mongosmovePrimary에 대해 "majority" 쓰기 고려를 사용합니다.

이 명령은 MongoDB가 모든 데이터 이동을 완료할 때까지 반환되지 않습니다. 이 명령의 응답은 다음과 비슷합니다.

{
"ok" : 1,
"operationTime" : Timestamp(1575400369, 9),
"$clusterTime" : {
"clusterTime" : Timestamp(1575400369, 9),
"signature" : {
"hash" : BinData(0,"2Nz8QCcVXB0LJLm1hsXfpTCaM0M="),
"keyId" : NumberLong("6766255701040824328")
}
}
}

모든 메타데이터 정보를 정리하고 제거를 완료하려면 removeShard 다시 실행해야 합니다. 예를 들어, mongodb0이라는 이름의 샤드에 대해 다음을 실행합니다.

db.adminCommand( { removeShard: "mongodb0" } )

mongosremoveShard 명령의 쓰기 문제"majority"으로 변환합니다.

완료되면 다음과 같은 성공 메시지가 표시됩니다.

{
"msg" : "removeshard completed successfully",
"state" : "completed",
"shard" : "mongodb0",
"ok" : 1,
"operationTime" : Timestamp(1575400370, 2),
"$clusterTime" : {
"clusterTime" : Timestamp(1575400370, 2),
"signature" : {
"hash" : BinData(0,"JjSRciHECXDBXo0e5nJv9mdRG8M="),
"keyId" : NumberLong("6766255701040824328")
}
}
}

state 필드의 값이 'completed'가 되면 mongodb0 샤드를 구성하는 인스턴스를 안전하게 중지할 수 있습니다.

돌아가기

샤드 추가