샤드 를 제거 하려면 샤드의 데이터가 클러스터 의 나머지 샤드로 마이그레이션되었는지 확인해야 합니다. 이 절차에서는 데이터를 안전하게 마이그레이션 하고 샤드 를 제거 하는 방법을 설명합니다.
이 작업에 대하여
이 절차를 수행하는 동안 컬렉션을 생성, 샤딩 또는 이동하면 중단이 발생하여 예기치 않은 결과가 발생할 수 있습니다.
이 절차를 사용하여 전체 클러스터 를 새 hardware 로 마이그레이션 하지 마세요. 마이그레이션하려면 자체 관리형 샤드 클러스터를 다른 하드웨어로마이그레이션 을 참조하세요.
청크 분포가 균일하지 않은 클러스터에서 샤드를 제거하면 밸런서는 먼저 드레이닝 샤드에서 청크를 제거한 다음 나머지 불균등 청크 분포를 조정합니다.
샤드 를 제거하면 열려 있는 변경 스트림 커서 가 닫힐 수 있으며, 닫힌 변경 스트림 커서 가 완전히 재개되지 않을 수 있습니다.
샤드 제거 프로세스 중에 클러스터 를 안전하게 다시 시작할 수 있습니다. 진행 중인 배출 프로세스 중에 클러스터 를 다시 시작하면 클러스터 구성 요소가 다시 시작된 후 자동으로 배출 이 계속됩니다. MongoDB 는
config.shards컬렉션 에 샤드 배출 상태를 기록합니다.
시작하기 전에
이 절차에서는
sh.moveCollection()메서드를 사용하여 제거된 샤드 에서 컬렉션을 이동합니다. 이 절차를 시작하기 전에moveCollection고려 사항 및 요구 사항 을 검토 하여 명령 동작을 이해하세요.샤드 를 제거 하려면 먼저 를 사용하여 클러스터의 인스턴스 중
mongos하나에mongosh연결합니다.
참고
여러 샤드를 제거할 때는 한 번에 하나씩 제거하지 말고 동시에 제거 . 한 번에 하나의 샤드 제거하면 밸런서 데이터를 나머지 샤드로 배출합니다. 샤드 한 번에 하나 청크 마이그레이션 에만 참여할 수 있으므로 샤드 하나를 제거하면 데이터 마이그레이션 처리량 제한됩니다.
단계
밸런서 활성화되어 있는지 확인합니다.
샤드 에서 데이터를 마이그레이션 하려면 밸런서 프로세스 를 활성화해야 합니다. 밸런서 상태 를 확인하려면 sh.getBalancerState() 메서드를 사용합니다.
sh.getBalancerState()
작업이 true 을 반환하면 밸런서 가 활성화된 것입니다.
작업이 false 을 반환하는 경우 밸런서 활성화를 참조하세요.
제거 할 샤드 의 이름을 확인합니다.
샤드 의 이름을 찾으려면 listShards 명령을 실행 합니다.
db.adminCommand( { listShards: 1 } )
shards._id 필드 에는 샤드 이름이 포함됩니다.
샤드 배출 시작합니다.
명령을 실행하여 샤딩된 컬렉션에서 클러스터 의 다른 샤드로 청크 이동을 시작합니다.startShardDraining
db.adminCommand( { startShardDraining: "shard04" } )
여러 샤드를 제거 해야 하는 경우 배출 프로세스를 시작하여 병렬로 실행 수 있습니다.
컬렉션을 이동합니다.
에서 mongos 컬렉션 생성하고 를 호출하지 않는 경우, 해당 컬렉션 샤딩되지 않은 상태로 유지되며 MongoDB 클러스터 의 특정 샤드 에 컬렉션 전체를 저장합니다. 샤드 프라이머리 로 사용하는 데이터베이스도 샤드 에 컬렉션을 저장 .shardCollection
제거 하려는 샤드 에 샤딩되지 않은 컬렉션 이나 프라이머리 데이터베이스 포함된 경우 컬렉션 다른 샤드 로 이동해야 합니다.
shardDrainingStatus 제거 하려는 collectionsToMove 샤드 에 이러한 컬렉션 이 포함되어 있는지 확인하고 배출 상태를 확인하려면 명령을 실행 하고 출력 필드 의 배열 확인합니다.
db.adminCommand( { shardDrainingStatus: "shard04" } )
{ msg: "draining ongoing", state: "ongoing", remaining: { chunks: Long(2), dbs: Long(2), jumboChunks: Long(0), collectionsToMove: Long(2) }, shard: "shard04", note: "you need to call moveCollection for collectionsToMove and afterwards movePrimary for the dbsToMove", dbsToMove: [ "accounts", ], collectionsToMove: [ "accounts.us-east", "accounts.us-west", "locations.us", ], ok: 1, operationTime: Timestamp(1575399086, 1655), $clusterTime: { clusterTime: Timestamp(1575399086, 1655), signature: { hash: BinData(0,"XBrTmjMMe82fUtVLRm13GBVtRE8="), keyId: Long("6766255701040824328") } } }
collectionsToMove 필드 에서 발견된 모든 컬렉션 은 이 샤드 에 저장된 컬렉션 입니다. 샤드 제거 하려면 먼저 이러한 컬렉션을 다른 샤드 로 이동해야 합니다.
컬렉션 다른 샤드 로 이동하려면 명령을 moveCollection 사용합니다.
db.adminCommand( { moveCollection: "accounts.us-east", toShard: "shard05" } )
프라이머리 이동.
샤드 클러스터는 데이터베이스 의 프라이머리 샤드 제공 할 특정 샤드 지정합니다. 제거 하려는 샤드 가 프라이머리 인 경우, 다른 샤드 로 이동해야 합니다.
프라이머리를 식별하려면 명령을 실행 shardDrainingStatus 하고 dbsToMove 출력 필드 의 배열 확인합니다.
db.adminCommand( { shardDrainingStatus: "shard04" } )
{ msg: "draining ongoing", state: "ongoing", remaining: { chunks: Long(2), dbs: Long(2), jumboChunks: Long(0), collectionsToMove: Long(2) }, shard: "shard04", note: "you need to call moveCollection for collectionsToMove and afterwards movePrimary for the dbsToMove", dbsToMove: [ "accounts", ], collectionsToMove: [ ], ok: 1, operationTime: Timestamp(1575399086, 1655), $clusterTime: { clusterTime: Timestamp(1575399086, 1655), signature: { hash: BinData(0,"XBrTmjMMe82fUtVLRm13GBVtRE8="), keyId: Long("6766255701040824328") } } }
dbsToMove 필드 에 표시된 각 데이터베이스 는 다른 샤드 로 이동해야 하는 데이터베이스 입니다.
데이터베이스 이동하려면 명령을 사용합니다.movePrimary
db.adminCommand( { movePrimary: "accounts", to: "shard05" })
샤드 제거합니다.
샤드 제거 전에 배출 작업이 완료되었는지 확인합니다.
배출 작업의 상태를 확인하려면 명령을 실행 shardDrainingStatus .
db.adminCommand( { shardDrainingStatus: "shard04" } )
{ "msg" : "draining completed successfully", "state" : "drainingComplete", "ok" : 1, "$clusterTime" : { "clusterTime" : Timestamp(1771839836, 139), "signature" : { "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), "keyId" : NumberLong(0) } }, "operationTime" : Timestamp(1771839836, 139) }
state 필드 제거 하려는 샤드 에 대해 drainingComplete 을 반환하면 배출 프로세스 완료된 것입니다. 이제 샤드 제거 할 수 있습니다.
샤드 제거 하려면 명령을 실행 commitShardRemoval .
db.adminCommand( { commitShardRemoval: "shard04" } )
{ "ok" : 1, "$clusterTime" : { "clusterTime" : Timestamp(1771840037, 12), "signature" : { "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), "keyId" : NumberLong(0) } }, "operationTime" : Timestamp(1771840037, 12) }
샤드 완전히 비워지지 않으면 명령은 오류를 반환합니다.