샤드 클러스터에서 샤드 제거
샤드 를 제거 하려면 샤드의 데이터가 클러스터 의 나머지 샤드로 마이그레이션되었는지 확인해야 합니다. 이 절차에서는 데이터를 안전하게 마이그레이션 하고 샤드 를 제거 하는 방법을 설명합니다.
이 작업에 대하여
이 절차를 수행하는 동안 컬렉션을 생성, 샤딩 또는 이동하면 중단이 발생하여 예기치 않은 결과가 발생할 수 있습니다.
이 절차를 사용하여 전체 클러스터 를 새 hardware 로 마이그레이션 하지 마세요. 마이그레이션하려면 자체 관리형 샤드 클러스터를 다른 하드웨어로마이그레이션 을 참조하세요.
청크 분포가 균일하지 않은 클러스터에서 샤드를 제거하면 밸런서는 먼저 드레이닝 샤드에서 청크를 제거한 다음 나머지 불균등 청크 분포를 조정합니다.
샤드 를 제거하면 열려 있는 변경 스트림 커서 가 닫힐 수 있으며, 닫힌 변경 스트림 커서 가 완전히 재개되지 않을 수 있습니다.
샤드 제거 프로세스 중에 클러스터 를 안전하게 다시 시작할 수 있습니다. 진행 중인 배출 프로세스 중에 클러스터 를 다시 시작하면 클러스터 구성 요소가 다시 시작된 후 자동으로 배출 이 계속됩니다. MongoDB 는
config.shards
컬렉션 에 샤드 배출 상태를 기록합니다.
시작하기 전에
이 절차에서는
sh.moveCollection()
메서드를 사용하여 제거된 샤드 에서 컬렉션을 이동합니다. 이 절차를 시작하기 전에moveCollection
고려 사항 및 요구 사항 을 검토 하여 명령 동작을 이해하세요.샤드 를 제거 하려면 먼저 를 사용하여 클러스터의 인스턴스 중
mongos
하나에mongosh
연결합니다.
단계
밸런서 가 활성화되어 있는지 확인
샤드 에서 데이터를 마이그레이션 하려면 밸런서 프로세스 를 활성화해야 합니다. 밸런서 상태 를 확인하려면 sh.getBalancerState()
메서드를 사용합니다.
sh.getBalancerState()
작업이 true
을 반환하면 밸런서 가 활성화된 것입니다.
작업이 false
을 반환하는 경우 밸런서 활성화를 참조하세요.
제거할 샤드의 이름 결정
샤드 의 이름을 찾으려면 listShards
명령을 실행 합니다.
db.adminCommand( { listShards: 1 } )
shards._id
필드 에는 샤드 이름이 포함됩니다.
샤드에서 청크 제거
제거 하려는 샤드 에 대해 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
작업을 동시에 실행 수 없습니다.
샤딩된 컬렉션 네임스페이스 나열
샤딩된 컬렉션 네임스페이스 목록을 반환하려면 $shardedDataDistribution
단계를 사용하여 ns
필드 를 프로젝트 합니다.
use admin db.aggregate( [ { $shardedDataDistribution: { } }, { $project: { ns: 1 } } ] )
이 튜토리얼의 뒷부분에서 참조할 수 있도록 출력을 기록합니다.
컬렉션을 샤드 밖으로 이동
admin 및 config 를 제외한 클러스터 의 각 데이터베이스 에 대해 다음 단계를 수행합니다.
데이터베이스 컬렉션 나열
데이터베이스 의 컬렉션을 나열하고, 다음 컬렉션 유형은 생략합니다.
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 } ) 필요한 컬렉션 이동
getCollectionInfos()
에서 반환된 각 컬렉션 에 대해 다음 단계를 수행합니다.참고
한 번에 하나의
moveCollection
작업만 진행할 수 있습니다. 다음 컬렉션 으로 이동하기 전에 모든 하위 단계를 완료합니다.컬렉션 을 이동해야 하는지 여부를 결정합니다.
$collStats
집계 단계를 실행하고ns
및shard
필드를 프로젝트 합니다.db.<collName>.aggregate( [ { $collStats: { } }, { $project: { ns: 1, shard: 1 } } ] ) 다음 기준 중 하나라도 충족되면 컬렉션 을 건너뛰고 데이터베이스 의 다음 컬렉션 을 위해
i
단계로 돌아갑니다.ns
필드 는 4 단계의$shardedDataDistribution
출력에 있습니다.shard
필드 는 제거되는 샤드 가 아닙니다.
앞의 기준 중 어느 것도 충족하지 않는 경우 현재 컬렉션 에 대해
ii
단계를 계속 진행합니다.컬렉션 을 이동합니다.
컬렉션 을 이동하려면 컬렉션 에서
sh.moveCollection()
를 실행 합니다.sh.moveCollection( "<namespace>.<collection>", "<ID of recipient shard>" ) 참고
moveCollection
샤딩된 된 네임스페이스 에서 명령을 실행 하면 실패합니다. 이 오류 메시지가 표시되면 이를 무시하고 다음 컬렉션 을 위해i
단계로 돌아갑니다.데이터베이스 의 각 컬렉션 에 대해
i
단계로 돌아갑니다.
다른 데이터베이스에 대해 이 절차를 반복합니다.
클러스터 의 각 데이터베이스 에 대해 6 단계, Move collections off of the shard 단계(및 하위 단계)를 반복합니다.
프라이머리 샤드 변경
db.printShardingStatus()
메서드를 실행합니다.
db.printShardingStatus()
명령 출력의 databases
섹션에서 database.primary
필드 를 확인합니다. primary
필드 가 제거된 샤드 인 경우 해당 데이터베이스의 프라이머리 샤드를 다른 샤드 로 이동해야 합니다.
데이터베이스의 프라이머리 샤드 를 변경하려면 movePrimary
명령을 실행 합니다.
경고
movePrimary
을(를) 실행 하면 Move collections off of the shard 단계에서 이동되지 않은 컬렉션은 movePrimary
프로세스 중에 사용할 수 없습니다.
db.adminCommand( { movePrimary: <dbName>, to: <shardName> } )
마이그레이션 상태 확인
마이그레이션 진행 상황을 확인하려면 admin
데이터베이스 에서 removeShard
를 다시 실행 합니다.
db.adminCommand( { removeShard: "<shardName>" } )
출력에서 remaining
필드 에는 다음과 같은 필드가 포함됩니다.
필드 | 설명 |
---|---|
| 현재 샤드 에 남아 있는 청크의 수 |
| 프라이머리 샤드 가 샤드 인 데이터베이스의 수입니다. 이러한 데이터베이스는 |
| 전체
|
남은 청크 수가 0 이 될 때까지 removeShard
명령의 상태를 계속 확인합니다.
db.adminCommand( { removeShard: "<shardName>" } )
샤드 제거 완료
샤드 제거 프로세스 를 완료하려면 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 }) }