파일 시스템 스냅샷 으로 자체 관리 배포서버 백업 및 복원
이 문서 에서는 LVM 또는 저장 어플라이언스와 같은 시스템 수준 도구를 사용하여 MongoDB 독립형 서버 및 복제본 세트의 백업을 만드는 절차와 해당 복원 전략을 설명합니다. 샤드 클러스터에 대한 자세한 내용은 파일 시스템 스냅샷으로 자체 관리형 샤딩된 클러스터 스냅샷 을 참조하세요.
이러한 파일 시스템 스냅샷 또는 '블록 수준' 백업 방법은 시스템 수준 도구를 사용하여 MongoDB의 데이터 파일을 보관하는 장치의 복사본을 만듭니다. 이러한 방법은 빠르게 완료되고 안정적으로 작동하지만, MongoDB 외부에서 추가 시스템 구성이 필요합니다.
스냅샷 개요
스냅샷은 라이브 데이터와 특수 스냅샷 볼륨 사이에 포인터를 생성합니다. 이러한 포인터는 이론적으로 '하드 링크'와 같습니다. 작업 데이터가 스냅샷에서 분리되면 스냅샷 프로세스에서는 쓰기 중 복사 전략을 사용합니다. 따라서 스냅샷은 수정된 데이터만 저장합니다.
스냅샷을 만든 후 파일 시스템에 스냅샷 이미지를 마운트하고 스냅샷에서 데이터를 복사합니다. 결과 백업에는 모든 데이터의 전체 복사본이 포함됩니다.
고려 사항
와이어드타이거 스토리지 엔진
MongoDB 인스턴스의 데이터 파일과 저널 파일이 별도의 볼륨에 있는 경우 MongoDB는 WiredTiger 스토리지 엔진을 사용하여 볼륨 수준 백업을 지원합니다. 그러나 일관성 있는 백업을 생성하려면 백업 프로세스 중에 데이터베이스를 잠그고 데이터베이스에 대한 모든 쓰기를 일시 중단해야 합니다.
암호화된 스토리지 엔진(MongoDB Enterprise에만 해당)
2} 암호화 모드를 사용하는 암호화된 스토리지 엔진의 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
암호로 구성된 데이터베이스 키를 롤오버하고 종료합니다.
스냅샷 시점에서 유효한 데이터베이스
스냅샷이 실행될 때 데이터베이스가 유효해야 합니다. 즉, 데이터베이스에서 허용하는 모든 쓰기가 디스크(저널 또는 데이터 파일)에 완전히 기록되어 있어야 합니다.
백업이 수행될 때 디스크에 없는 쓰기가 있는 경우, 백업에 이러한 변경 내용이 반영되지 않습니다.
WiredTiger 스토리지 엔진의 경우 데이터 파일은 마지막 체크포인트 시점의 일관적인 상태를 반영합니다. 체크포인트는 데이터 2GB마다 또는 1분마다 발생합니다.
전체 디스크 이미지
스냅샷은 전체 디스크 이미지의 이미지를 생성합니다. 전체 시스템을 백업해야 하는 경우가 아니라면 다른 데이터가 포함되지 않은 하나의 논리 디스크에 MongoDB 데이터 파일, 저널(해당되는 경우) 및 구성을 격리하는 것을 고려하세요.
또는 모든 MongoDB 데이터 파일을 전용 기기에 저장하여 관련 없는 데이터를 중복없이 백업할 수 있습니다.
사이트 장애 예방 조치
스냅샷에서 다른 시스템으로 데이터를 복사합니다. 이렇게 하면 사이트 장애로부터 데이터를 안전하게 보호할 수 있습니다.
증분 백업 없음
증분 백업 절차는 이 튜토리얼에 포함되어 있지 않습니다. 스냅샷 방법에 따라 제공되는 기능이 다르지만, 아래에 설명된 LVM 방법은 증분 백업을 캡처하는 능력을 제공하지 않습니다.
저널링이 포함된 스냅샷
mongod
인스턴스에서 저널링을 활성화했다면 모든 종류의 파일 시스템 또는 볼륨/블록 수준 스냅샷 도구를 사용하여 백업을 만들 수 있습니다.
Linux 기반 시스템에서 자체 인프라를 관리하는 경우, 시스템을 LVM으로 구성하여 디스크 패키지와 스냅샷 기능을 제공하도록 설정하세요. 또한 클라우드/가상화 환경 내에서 LVM 기반 설정을 사용할 수도 있습니다.
참고
LVM을 실행하면 추가적인 유연성이 제공되며 스냅샷을 사용하여 MongoDB를 백업할 수 있습니다.
RAID 10 구성에서 Amazon EBS를 사용한 스냅샷
배포가 인스턴스 내에 RAID가 구성된 Amazon의 EBS(Elastic Block Storage)에 의존하는 경우, 플랫폼의 스냅샷 도구를 사용하여 모든 디스크에서 일관된 상태를 얻는 것은 불가능합니다. 대안으로 다음 중 하나를 수행할 수 있습니다.
디스크에 대한 모든 쓰기를 플러시하고 쓰기 잠금을 생성하여 백업 프로세스 동안 일관된 상태를 유지합니다.
이 옵션을 선택하는 경우 별도의 볼륨에 저널 파일로 인스턴스 백업 혹은 저널링 없이 인스턴스 백업 을 참조하세요.
시스템 내 RAID 위에 MongoDB 데이터 파일을 실행하고 보관하도록 LVM을 구성합니다.
이 옵션을 선택하는 경우 스냅샷 만들기에 설명된 LVM 백업 작업을 수행하세요.
Linux에서 LVM을 사용한 백업 및 복원
이 섹션에서는 Linux 시스템에서 LVM을 사용하는 간단한 백업 프로세스에 대한 개요를 설명합니다. 도구, 명령 및 경로는 시스템에 따라 (약간) 다를 수 있지만, 다음 단계는 백업 작업에 대한 높은 수준의 개요를 제공합니다.
참고
다음 절차는 백업 시스템 및 인프라에 대한 지침으로만 사용하세요. 프로덕션 백업 시스템은 다양한 애플리케이션별 요구 사항 및 환경별로 고유한 요소를 고려해야 합니다.
샤드 클러스터에 대한 자세한 내용은 파일 시스템 스냅샷으로 자체 관리형 샤딩된 클러스터 스냅샷 을 참조하세요.
스냅샷 만들기
MongoDB 인스턴스를 볼륨 단위로 백업할 때 WiredTiger를 사용하면 데이터 파일과 저널이 단일 볼륨에 있지 않아도 됩니다.
LVM을 사용하여 스냅샷을 생성하려면 다음 명령을 root로 실행하세요.
lvcreate --size 100M --snapshot --name mdb-snap01 /dev/vg0/mongodb
이 명령은 vg0
볼륨 그룹에 있는 mongodb
볼륨의 mdb-snap01
이라는 LVM 스냅샷(--snapshot
옵션 사용)을 만듭니다.
이 예에서는 /dev/vg0/mdb-snap01
에 위치한 mdb-snap01
이라는 이름의 스냅샷을 만듭니다. 시스템 볼륨 그룹 및 장치의 위치와 경로는 운영 체제의 LVM 구성에 따라 약간 다를 수 있습니다.
매개 변수 --size 100M
으로 인해 스냅샷의 최대 용량은 100메가바이트입니다. 이 크기는 디스크에 있는 데이터의 총량을 반영하는 것이 아니라 /dev/vg0/mongodb
의 현재 상태와 스냅샷 생성 시점(예: /dev/vg0/mdb-snap01
) 사이의 차이의 양을 반영합니다.
경고
특히 시스템에서 데이터를 복사하거나 임시 이미지로 복사하는 데 걸리는 시간을 고려하여 데이터 증가를 수용할 수 있도록 스냅샷의 공간을 충분히 만들어야 합니다.
스냅샷 공간이 부족하면 스냅샷 이미지를 사용할 수 없게 됩니다. 이 논리 볼륨을 삭제하고 다른 논리 볼륨을 만드세요.
명령이 반환되면 스냅샷이 존재합니다. 언제든지 스냅샷에서 직접 복원하거나, 새 논리 볼륨을 생성하여 이 스냅샷에서 대체 이미지로 복원할 수 있습니다.
스냅샷은 고품질 백업을 빠르게 생성하는 데 유용하지만, 백업 데이터를 저장하기 위한 형식으로는 적합하지 않습니다. 스냅샷은 일반적으로 원본 디스크 이미지와 동일한 스토리지 인프라에 의존하고 상주합니다. 따라서 이러한 스냅샷을 아카이브하여 다른 곳에 보관하는 것이 중요합니다.
스냅샷 보관
스냅샷을 만든 후 스냅샷을 마운트하고 데이터를 별도의 스토리지에 복사합니다. 백업 이미지를 오프라인으로 옮길 때 시스템에서 압축을 시도할 수 있습니다. 또는 다음 절차에 따라 스냅샷 이미지의 블록 수준 복사본을 만듭니다.
umount /dev/vg0/mdb-snap01 dd if=/dev/vg0/mdb-snap01 | gzip > mdb-snap01.gz
위의 명령 시퀀스는 다음을 수행합니다.
/dev/vg0/mdb-snap01
장치가 마운트되지 않았는지 확인합니다. 마운트된 파일 시스템 또는 파일 시스템 스냅샷의 블록 수준 복사본을 만들지 마세요.dd
명령을 사용하여 전체 스냅샷 이미지의 블록 수준 복사를 수행하고, 결과를 현재 작업 디렉토리에 gzip 파일로 압축합니다.경고
이 명령은 현재 작업 디렉토리에 큰
gz
파일을 생성합니다. 이 명령은 여유 공간이 충분한 파일 시스템에서 실행해야 합니다.
스냅샷 복원
LVM으로 생성된 스냅샷을 복원하려면 다음 명령 시퀀스를 실행합니다.
lvcreate --size 1G --name mdb-new vg0 gzip -d -c mdb-snap01.gz | dd of=/dev/vg0/mdb-new mount /dev/vg0/mdb-new /srv/mongodb
위의 시퀀스는 다음을 수행합니다.
/dev/vg0
볼륨 그룹에mdb-new
라는 새 논리 볼륨을 생성합니다. 새 장치의 경로는/dev/vg0/mdb-new
가 됩니다.경고
이 볼륨의 최대 크기는 1기가바이트입니다. 원본 파일 시스템의 총 크기가 1GB 이상이면 복원이 실패합니다.
1G
를 원하는 볼륨 크기로 변경합니다.mdb-snap01.gz
를mdb-new
디스크 이미지로 압축을 풀고 아카이브를 해제합니다.mdb-new
디스크 이미지를/srv/mongodb
디렉토리에 마운트합니다. MongoDB 데이터 파일 위치 또는 필요에 따라 다른 위치에 해당하도록 마운트 지점을 수정합니다.
참고
복원된 스냅샷에는 오래된 mongod.lock
파일이 있습니다. 스냅샷에서 이 파일을 제거하지 않으면 MongoDB는 오래된 잠금 파일이 잘못된 종료를 나타내는 것으로 간주할 수 있습니다. db.fsyncLock()
을 사용하는 경우 mongod.lock
파일을 제거해야 합니다.
스냅샷에서 직접 복원
압축된 gz
파일에 쓰지 않고 백업을 복원하려면 다음 명령 시퀀스를 사용하세요.
umount /dev/vg0/mdb-snap01 lvcreate --size 1G --name mdb-new vg0 dd if=/dev/vg0/mdb-snap01 of=/dev/vg0/mdb-new mount /dev/vg0/mdb-new /srv/mongodb
참고
모든 MongoDB 컬렉션에는 기본적으로 UUID가 포함되어 있습니다. MongoDB가 컬렉션을 복원할 때 복원된 컬렉션은 본래의 UUID를 유지합니다. UUID가 없는 컬렉션을 복원하는 경우, MongoDB는 복원된 컬렉션에 대한 UUID를 생성합니다.
컬렉션 UUID에 대한 자세한 내용은 컬렉션을 참조하세요.
원격 백업 스토리지
결합된 프로세스와 SSH를 사용하여 시스템 외부 백업을 구현할 수 있습니다.
이 순서는 SSH를 사용하여 원격 시스템에 백업을 보관하고 압축한다는 점을 제외하면 위에서 설명한 절차와 동일합니다.
다음 절차를 고려하세요.
umount /dev/vg0/mdb-snap01 dd if=/dev/vg0/mdb-snap01 | ssh username@example.com gzip > /opt/backup/mdb-snap01.gz lvcreate --size 1G --name mdb-new vg0 ssh username@example.com gzip -d -c /opt/backup/mdb-snap01.gz | dd of=/dev/vg0/mdb-new mount /dev/vg0/mdb-new /srv/mongodb
인스턴스를 별도의 볼륨에 저널 파일로 백업 혹은 저널링 없이 인스턴스 백업
WiredTiger를 사용하여 MongoDB 인스턴스를 볼륨 단위로 백업할 때, 데이터 파일과 저널이 단일 볼륨에 있지 않아도 됩니다. 그러나 백업의 일관성을 유지하려면 백업 프로세스 중에 데이터베이스를 잠그고 데이터베이스에 대한 모든 쓰기를 일시 중단해야 합니다.
mongod
인스턴스가 저널링 없이 실행 중이거나 저널 파일이 별도의 볼륨에 있는 경우, 백업 프로세스 중에 쓰기를 방지하기 위해 모든 쓰기를 디스크에 플러시하고 데이터베이스를 잠가야 합니다. 복제본 세트 구성이 있는 경우 읽기를 수신하지 않는 세컨더리(즉, 숨겨진 멤버)를 백업에 사용합니다.
디스크에 쓰기를 플러시하고 데이터베이스를 잠가 추가 쓰기를 방지합니다.
디스크에 쓰기를 플러시하고 데이터베이스를 '잠금'하려면 다음을 참고해 mongosh
에서 db.fsyncLock()
메소드를 실행합니다.
db.fsyncLock();
스냅샷 을 만든 후 데이터베이스 의 잠금을 해제합니다.
스냅샷 을 생성한 후 데이터베이스 의 잠금을 해제하려면 mongosh
에서 다음 명령을 사용합니다.
db.fsyncUnlock();