문서 메뉴

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

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

이 페이지의 내용

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

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

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

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

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

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

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

샤드의 이름을 확인하려면 또는 다음 mongosh 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) // Available starting in 4.2.2 (and 4.0.14)
},
"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 플래그를 지우면 밸런서가 이러한 청크를 마이그레이션할 수 있습니다. 마이그레이션 절차에 대한 자세한 내용은 Chunk 마이그레이션 절차에서 확인하세요.

4.2.2(및 4.0.14)부터 사용 가능

남은 청크 수가 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")
}
}
}

MongoDB 4.2 이하의 경우 샤딩되지 않은 collection이 포함된 데이터베이스에서 movePrimary 명령을 사용하면 다음 추가 단계를 수행해야 합니다.

참고

MongoDB 4.4에서는 샤딩되지 않은 collection이 포함된 데이터베이스를 이동할 때 이러한 추가 단계가 필요하지 않습니다.

  • MongoDB 4.2의 경우, 다음 중 하나를 수행해야 합니다.

    • 모든 mongos 인스턴스 모든 mongod 샤드 멤버(세컨더리 멤버 포함)을 다시 시작합니다.

    • 모든 mongos 인스턴스와 모든 mongod 샤드 멤버(세컨더리 멤버 포함)에서 flushRouterConfig 명령을 사용한 후 이동한 샤딩되지 않은 collection에 데이터를 읽거나 쓰기 시작합니다.

  • MongoDB 4.0 이하의 경우, 다음 중 하나를 선택해야 합니다.

    • 모든 mongos 인스턴스를 다시 시작하세요.

    • 모든 mongos 인스턴스에서 flushRouterConfig 명령을 사용한 후 이동한 샤딩되지 않은 collection에 데이터를 읽거나 쓰세요.

이 단계는 모든 cluster 노드가 프라이머리 샤드의 위치를 포함하는 메타데이터 캐시를 새로 고치도록 합니다. 그렇지 않으면 읽기 데이터를 놓칠 수 있으며 올바른 샤드에 데이터를 쓰지 못할 수도 있습니다. 복구하려면 수동으로 개입해야 합니다.

모든 메타데이터 정보를 정리하고 제거를 완료하려면 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 샤드를 구성하는 인스턴스를 안전하게 중지할 수 있습니다.

← 클러스터에 샤드 추가