meme이랑 비슷한 상황,,
클라우드에 올린 클러스터들이 많아서 비용문제로 인해 클러스터 삭제가 필요했다.
이에따라 DB 데이터를 백업해야하는 상황.
현재 MongoDB를 사용하고 있으므로, MongoDB 데이터를 안전하게 백업하는 방법에 대해서 정리하겠다.
실행 중인 MongoDB 파드를 확인해야한다.
kubectl get pods -A
MongoDB 파드에 접속해서 실제로 데이터가 있는지 확인한다.
# 파드 접속
kubectl exec -it [mongoDB파드 이름] -n [네임스페이스] -- bash
# MongoDB 접속 및 데이터 확인
mongo
> show dbs
> use [db이름]
> show collections
> db.resources.count()
> exit
> exit
MongoDB의 mongodump 명령어를 사용해 모든 데이터를 BSON 형식으로 백업
kubectl exec -it [파드이름] -n [네임스페이스] -- mongodump --out /tmp/backup
데이터 타입 무손실
- ObjectId, Date, NumberLong, Binary, Decimal128 등 모든 MongoDB 타입 보존
- 인덱스 정보도 함께 백업됨
빠른 복원 속도
- 바이너리 형식이라 복원이 매우 빠름
- 대용량 데이터에서 특히 효과적
# 백업 디렉토리 확인
kubectl exec -it [파드이름] -n [네임스페이스] -- ls -la /tmp/backup/
# 백업 크기 확인
kubectl exec -it [파드이름] -n [네임스페이스] -- du -sh /tmp/backup/
네트워크 전송을 위해 백업 파일 압축 필요
# 파드 내에서 압축
kubectl exec -it [파드이름] -n [네임스페이스] -- tar -czf /tmp/mongodb-backup.tar.gz -C /tmp backup
# 압축 파일 크기 확인
kubectl exec -it [파드이름] -n [네임스페이스] -- ls -lh /tmp/mongodb-backup.tar.gz
kubectl cp 명령어를 사용해 압축된 백업 파일을 로컬로 복사합니다.
# 로컬로 복사 (현재 디렉토리에 날짜별로 저장)
kubectl cp [네임스페이스]/[파드이름]:/tmp/mongodb-backup.tar.gz ./mongodb-backup-$(date +%Y%m%d-%H%M%S).tar.gz
# 복사된 파일 확인
ls -lh mongodb-backup-*.tar.gz
# 압축 해제
tar -xzf mongodb-backup-*.tar.gz
# 백업 내용 확인
ls -la backup/
backup/
├── admin/
│ ├── system.version.bson
│ └── system.version.metadata.json
└── [db이름]/
├── accounts.bson
├── accounts.metadata.json
├── resources.bson
├── resources.metadata.json
├── events.bson
├── events.metadata.json
└── ... (기타 컬렉션들)
각 MongoDB 컬렉션마다 두 개의 파일이 생성된다.
.bson
파일: 실제 데이터 (바이너리 형식).metadata.json
파일: 인덱스 및 컬렉션 설정 정보나중에 새로운 MongoDB 인스턴스에서 데이터를 복원할 때를 대비해 미리 작성
# 백업 파일을 새 파드로 복사
kubectl cp ./backup [네임스페이스]/[새로운 파드 이름]:/tmp/restore-backup
# 데이터 복원
kubectl exec -it [새로운 파드 이름] -n [네임스페이스] -- mongorestore /tmp/restore-backup