파일 시스템 스냅샷으로 자체 관리 샤딩된 클러스터 백업
개요
이 문서 에서는 샤딩된 클러스터 의 모든 구성 요소를 백업 하는 절차를 설명합니다. 이 절차에서는 파일 시스템 스냅샷을 사용하여 mongod
인스턴스 의 복사본을 캡처합니다.
중요
샤딩된 클러스터를 백업하려면 클러스터에 대한 모든 쓰기를 중지해야 합니다.
MongoDB 의 백업 및 특히 샤딩된 클러스터의 백업에 대한 자세한 내용 은 자체 관리형 배포서버를 위한 백업 방법 및 자체 관리형 샤드 클러스터 백업 및 복원을 참조하세요.
고려 사항
샤드 간 트랜잭션
파일 시스템 스냅샷으로 백업을 생성하려면 먼저 클러스터에서 밸런서를 중지하고 쓰기 및 스키마 변환 작업을 중지해야 합니다.
MongoDB는 다음 서비스를 통해 밸런서 및 실행 중인 트랜잭션과 함께 실행할 수 있는 백업 및 복원 작업을 제공합니다.
암호화된 스토리지 엔진(MongoDB Enterprise에만 해당)
AES256-GCM
암호화 모드를 사용하는 암호화된 스토리지 엔진의 경우 AES256-GCM
은 모든 프로세스가 키와 함께 고유한 카운터 블록 값을 사용하도록 요구합니다.
2} 암호로 구성된 암호화된 스토리지 엔진의 경우: AES256-GCM
- 핫 백업에서 복원
- 4.2부터 "hot" 백업을 통해 가져온 파일에서 복원하는 경우(즉,
mongod
가 실행 중일 때), MongoDB는 시작 시 "더티" 키를 감지하고 데이터베이스 키를 자동으로 롤오버하여 IV(초기화 벡터) 재사용을 방지할 수 있습니다.
- 콜드 백업에서 복원
그러나 "cold" 백업을 통해 가져온 파일에서 복원하는 경우(즉,
mongod
가 실행 중이 아닌 경우), MongoDB는 시작 시 "더티" 키를 감지할 수 없으며, IV를 재사용하면 기밀성 및 무결성 보증이 무효화됩니다.4.2부터 콜드 파일 시스템 스냅샷에서 복원한 후 키 재사용을 방지하기 위해 MongoDB는 새로운 명령줄 옵션
--eseDatabaseKeyRollover
를 추가합니다.--eseDatabaseKeyRollover
옵션으로 시작하면mongod
인스턴스는AES256-GCM
암호로 구성된 데이터베이스 키를 롤오버하고 종료합니다.
밸런서
백업을 캡처하기 전에 밸런서를 반드시 중지해야 합니다.
백업을 캡처하는 동안 밸런서가 활성 상태이면 백업을 기록하는 동안 청크가 마이그레이션될 수 있으므로 백업 아티팩트가 불완전하거나 데이터가 중복될 수 있습니다.
정밀도
이 절차에서는 클러스터 밸런서를 중지하고 config 데이터베이스를 백업한 다음 파일 시스템 스냅샷 도구를 사용하여 클러스터의 각 샤드를 백업합니다. 시스템의 정확한 특정 시점의 스냅샷이 필요한 경우 파일 시스템 스냅샷을 찍기 전에 모든 쓰기를 중지해야 합니다. 그렇지 않으면 스냅샷은 대략적인 특정 시점의 스냅샷만 찍게 됩니다.
일관성
샤딩된 클러스터를 백업하려면 fsync
명령 또는 db.fsyncLock()
메서드를 사용하여 클러스터에 대한 쓰기를 중지해야 합니다. 이렇게 하면 백업에서 불일치가 발생할 가능성을 줄이는 데 도움이 됩니다.
참고
이러한 단계는 정확히 따르고 시작할 때 진행 중인 작업이 없는 경우에만 일관된 백업을 생성할 수 있습니다.
RAID 10 구성에서 Amazon EBS를 사용한 스냅샷
배포가 인스턴스 내에 RAID가 구성된 Amazon의 EBS(Elastic Block Storage)에 의존하는 경우, 플랫폼의 스냅샷 도구를 사용하여 모든 디스크에서 일관된 상태를 얻는 것은 불가능합니다. 대안으로 다음 중 하나를 수행할 수 있습니다.
백업 프로세스 중에 일관되지 않은 상태가 발생할 가능성을 줄이려면
fsync
잠금을 설정하여 모든 쓰기를 플러시하고 새 쓰기에 대비하여 클러스터를 잠급니다.이 옵션을 선택하는 경우 별도의 볼륨에 저널 파일로 인스턴스 백업하기 혹은 저널링 없이 인스턴스 백업하기를 참조하세요.
시스템 내 RAID 위에 MongoDB 데이터 파일을 실행하고 보관하도록 LVM을 구성합니다.
이 옵션을 선택하는 경우 스냅샷 생성에 설명된 LVM 백업 작업을 수행합니다.
버전 호환성
이 절차를 수행하려면 mongos
에서 fsync 잠금을 지원하는 MongoDB 버전이 필요합니다.
MongoDB 7.1 부터 시작( 7.0.2 부터 사용 가능), 6.0.11 및 5.0.22) fsync
및 fsyncUnlock
명령을 mongos
에서 실행하여 샤드 클러스터를 잠그고 잠금 해제할 수 있습니다.
시작하기 전에
MongoDB 8.0 부터는 directShardOperations
역할 을 사용하여 샤드 에 대해 직접 명령을 실행해야 하는 유지 관리 작업을 수행할 수 있습니다.
경고
directShardOperations
역할 을 사용하여 명령을 실행하면 클러스터 가 올바르게 작동하지 않고 데이터가 손상될 수 있습니다. directShardOperations
역할 은 유지 관리 목적으로만 사용하거나 MongoDB 지원 의 지침 에 따라 사용하세요. 유지 관리 작업 수행이 완료되면 directShardOperations
역할 사용을 중지합니다.
단계
샤드된 클러스터의 자체 관리형 백업을 수행하려면 다음 단계를 완료하세요.
밸런서 중지
청크 마이그레이션으로 인해 백업이 중단되는 것을 방지하려면 sh.stopBalancer()
메서드를 사용하여 밸런서를 중지합니다.
sh.stopBalancer()
현재 밸런싱 라운드가 진행 중이면 밸런싱이 완료될 때까지 작업이 대기합니다.
밸런서가 중지되었는지 확인하려면 sh.getBalancerState()
메서드를 사용하세요.
use config while( sh.isBalancerRunning().mode != "off" ) { print("waiting..."); sleep(1000); }
클러스터 잠금
데이터베이스에 쓰면 백업 불일치가 발생할 수 있습니다. 데이터베이스 쓰기를 방지하려면 샤딩된 클러스터를 잠그세요.
샤딩된 클러스터를 잠그려면 db.fsyncLock()
메서드를 사용하세요.
db.getSiblingDB("admin").fsyncLock()
config 서버의 mongos
및 프라이머리 mongod
모두에서 다음 집계 파이프라인을 실행합니다. 잠금을 확인하려면 fysncLocked
필드가 true
를 반환하고 fsyncUnlocked
필드가 false
를 반환하는지 확인합니다.
db.getSiblingDB("admin").aggregate( [ { $currentOp: { } }, { $facet: { "locked": [ { $match: { $and: [ { fsyncLock: { $exists: true } } ] } }], "unlocked": [ { $match: { fsyncLock: { $exists: false } } } ] } }, { $project: { "fsyncLocked": { $gt: [ { $size: "$locked" }, 0 ] }, "fsyncUnlocked": { $gt: [ { $size: "$unlocked" }, 0 ] } } } ] )
[ { fsyncLocked: true }, { fsyncUnlocked: false } ]
프라이머리 샤드 백업
파일 시스템 스냅샷 으로 자체 관리 배포서버 백업 및 스냅샷에 있는 절차를 사용하여 각 샤드 의 프라이머리 멤버에 대해 파일 시스템 스냅샷 을 수행합니다.
클러스터 잠금 해제
백업이 완료된 후 쓰기를 재개할 수 있도록 클러스터를 잠금 해제해야 합니다.
클러스터 잠금을 해제하려면 db.fsyncUnlock()
메서드를 사용합니다.
db.getSibling("admin").fsyncUnlock()
mongos
및 config 서버의 프라이머리 mongod
모두에서 다음의 집계 파이프라인을 실행합니다. 잠금 해제를 확인하려면 fysncLocked
필드가 false
를 반환하고 fsyncUnlocked
필드가 true
를 반환하는지 확인합니다.
db.getSiblingDB("admin").aggregate( [ { $currentOp: { } }, { $facet: { "locked": [ { $match: { $and: [ { fsyncLock: { $exists: true } } ] } }], "unlocked": [ { $match: { fsyncLock: { $exists: false } } } ] } }, { $project: { "fsyncLocked": { $gt: [ { $size: "$locked" }, 0 ] }, "fsyncUnlocked": { $gt: [ { $size: "$unlocked" }, 0 ] } } } ] )
[ { fsyncLocked: false }, { fsyncUnlocked: true } ]
밸런서 재시작
밸런서를 다시 시작하려면 sh.startBalancer()
메서드를 사용합니다.
sh.startBalancer()
밸런서가 실행 중인지 확인하려면 sh.getBalancerState()
메서드를 사용합니다.
sh.getBalancerState()
true
이 명령은 밸런서가 실행 중일 때 true
를 반환합니다.