728x90
이해를 돕기 위한 기존 시스템 간단 설명
- 기존시스템은 EC2에 MongoDB를 구축해서 사용하고 있었고,
- 데이터 보호와 복구를 위해, crontab을 사용해서
- 일정 시간마다 MongoDump를 하고 S3로 옮기고 삭제하는 방식을 사용하고 있었던 것 같다.
문제 상황 분석 및 예상
- 갑작스럽게 MongoDB 서비스가 다운되는 상황이 생겼다.
- 확인해 보니 EC2 인스턴스 용량 부족으로 다운이 됐었다.
- 그래서 EC2 인스턴스 용량을 확인해 보니 20GB였고 데이터를 확인해 보면 아직 충분히 여유가 있는 용량이었다.
- 명령어를 통해 어떤 폴더의 용량이 가장 큰지 파보니 백업 dump가 매우 크게 잡아먹고 있었다.
- 백업 스크립트들을 보며 분석해 봤는데 백업파일이 1시간마다 실행되고 S3로 옮기고 삭제하는 스크립트는 10분마다 실행되고 있었다. (ex: 백업 : 14:00, 15:00 ... / S3: 14:10, 14:20, 14:30)
- 두 개의 스크립트가 따로 돌아가고 있었고 파일의 이름을 ` %y%m%d-%H%M` 분까지 했기에 타이밍이 좋지 않으면 삭제가 안 된 것들이 생겨서 용량이 계속 부족하게 됐던 것 같다.
기존 스크립트
mongodump -h 127.0.0.1 -u {username} -p {password} -o /home/ec2-user/dbbackup/dump_$(TZ=Asia/Seoul date +%y%m%d-%H%M)
backup.sh
cd /home/ec2-user/dbbackup &&
tar -czvf dump_$(TZ=Asia/Seoul date -d '10 minutes ago' +%y%m%d-%H%M).tar.gz dump_$(TZ=Asia/Seoul date -d '10 minutes ago' +%y%m%d-%H%M) &&
aws s3 mv dump_$(TZ=Asia/Seoul date -d '10 minutes ago' +%y%m%d-%H%M).tar.gz s3://{bucket-name}/dumps/ --storage-class STANDARD_IA &&
rm -rf dump_$(TZ=Asia/Seoul date -d '10 minutes ago' +%y%m%d-%H%M)
rm -rf dump_$(TZ=Asia/Seoul date -d '10 minutes ago' +%y%m%d-%H%M).tar.gz
move_to_s3.sh
기존 백업 스크립트는 MongoDB 데이터를 백업하고, 이를 S3로 이동하는 두 부분으로 구성되어 있다. 먼저 `mongodump`를 사용해 데이터를 백업하고, 이후 `tar` 명령으로 압축하여 AWS S3로 옮기는 과정이다. 문제는 이 스크립트가 정확한 시점에 실행되어야 한다는 점이다. 스크립트는 '10분 전'의 타임스탬프를 사용해 파일 이름을 생성하므로, 만약 스케줄링이 정확하지 않거나 압축하는 시간이 1분이 지나게 되는 등 다양한 이유로 오류를 낼 수 있다.
➜ 즉 불안정하다!!
개선
우선 (이유가 있었겠지만) backup과 move_to_s3를 따로 한 이유를 찾지 못해 두 개를 합치기로 결정했다. 그리고 한 스크립트에서 현재 시간을 변수에 저장해서 파일명을 공유하기로 했다.
개선 스크립트
#!/bin/bash
# 현재 시간을 변수에 저장
CURRENT_TIME=$(TZ=Asia/Seoul date +%y%m%d-%H%M)
# MongoDB 백업
mongodump -h 127.0.0.1 -u {username} -p {password} -o /home/ec2-user/dbbackup/dump_$CURRENT_TIME
# 백업 폴더로 이동
cd /home/ec2-user/dbbackup
# 백업 파일 압축
tar -czvf dump_$CURRENT_TIME.tar.gz dump_$CURRENT_TIME
# S3로 백업 파일 이동
aws s3 mv dump_$CURRENT_TIME.tar.gz s3://{bucket-name}/dumps/ --storage-class STANDARD_IA
# 로컬의 백업 폴더와 압축 파일 삭제
rm -rf dump_$CURRENT_TIME
rm -rf dump_$CURRENT_TIME.tar.gz
crontab -e 실행
0 */3 * * * /home/ec2-user/dbbackup/backup_move_to_s3.sh
매 3시간마다 실행
개선과정에서 필요한 내용 정리
Linux 디스크 용량 확인 하기
- df : 디스크 남은 용량 확인 (기본 명령어)
- df -k : 킬로바이트 단위로 남은 용량 확인
- df -m : 메가바이트 단위로 남은 용량 확인
- df -h : 깔끔하게 보여줌
- df . : 현재 디렉터리가 포함된 파티션의 남은 용량 확인
- du : 현재 디렉터리에서 서브 디렉터리까지 용량 확인
- du -a : 현재 디렉터리의 사용량 파일단위로 출력
- du -s : 총 사용량
- du -h : 깔끔하게 보여줌
- du -sh * : 한 단계 서브 디렉터리 기준으로 보여줌
크론탭
- service crond start : 크론탭 시작
- service crond stop : 크론탭 중지
- service crond restart : 크론탭 재시작
- service crond status : 크론탭 상태 확인
aws s3 접근 설정이나 이런 작업이 궁금하다면 아래 블로그를 참고하면 좋을 것 같다.
https://velog.io/@seunghoking/Aws-S3%EB%A1%9C-Mongo-DB-%EB%B0%B1%EC%97%85-%EB%B0%8F-%EC%9E%90%EB%8F%99%ED%99%94-%EC%B4%9D%EC%A0%95%EB%A6%AC
언제나 잘못된 설명이나 부족한 부분에 대한 피드백은 환영입니다🤍
728x90