데이터 백업
#
Find similar titles
- 최초 작성자
- 최근 업데이트
Structured data
- Category
- Management
모든 정보화시스템은 축적되는 데이터에 대한 효과적인 백업과 복구 절차가 구비되어야 한다. 예상치 못한 사고에 의해 데이터가 유실될 수 있다. 또는 과거에 실수로 삭제한 데이터를 복구해야할 필요도 있다.
Table of Contents
개요 #
백업시스템과 RAID를 혼동하는 경우가 많은데, RAID는 실시간 하드디스크 고장에 대비하는 1차적인 대비책이며, 백업시스템은 3일전, 일주일전 데이터를 사용할 수 있도록 보장하는 2차적인 대비책이다.
다음 두가지로 크게 구분할 수 있다.
- 전체백업: 전체 데이터를 백업한다. 백업주기가 짧으면, 데이터 저장 낭비가 심해진다는 단점이 있다. cp 혹은 rsync 명령을 이용하여, 특정 디렉토리를 주기적으로 백업한다.
- 증분백업: 최초 전체 백업 후, 이후 백업주기마다 변화량만 저장한다. 오픈소스 rdiff-backup 혹은 상용솔루션 이용할 수 있다. 주기적으로 복구가 잘 되는지 확인해야 할 필요가 있다.
백업은 잘 동작하고 있는지 주기적으로 확인하는 것이 중요하다. 또한, 백업 데이터로 어떻게 복구하는지도 충분한 테스트가 있어야 한다.
어디에 백업할 것인가도 중요한 문제이다.
- 동일한 컴퓨터, 동일한 파일시스템
- 별도의 파일시스템
- 별도의 백업 컴퓨터, 동일한 서버실 (SSH key 설정 필요)
- 원격 백업 컴퓨터
기본적으로 최소한 별도의 파일시스템에 해야 한다. 하드디스크 고장은 상대적으로 자주 일어나는 일이며, 때문에 별도의 하드디스크, 파일시스템에 데이터를 복사한다. 자원이 허용하면 가능한 원격 백업 컴퓨터를 이용하는 것이 좋다. ( 삼성SDS 화재사건시 데이터가 유실되었을 수도 있다는 보도가 나온 적 있다.) 국가적 재난 등을 고려하면 국외로 백업하는 것도 안전성을 위한 방법 가운데 하나이다.
백업 시스템을 구현하는 일반적인 절차는 다음과 같다.
- 백업해야할 데이터 선별, 백업 주기 결정, 백업 장소, 지난 데이터 관리
- 백업 스크립트
- 복구 스크립트
- 스케줄 설정 (crontab)
실제 어플리케이션 예제 (my-django-app) #
실제 어플리케이션에 구현한 백업 및 복구 스크립트를 예로 살펴보자. my-django-app 웹 어플리케이션은 Django 웹 어플리케이션이며, PostgreSQL, Mongodb 데이터베이스를 사용하며, 첨부파일이 저장되는 별도의 파일 경로가 있다. 이 어플리케이션의 백업 정책을 다음처럼 정했다.
- 하루 1회 별도의 파일시스템에 전체 데이터 백업하고, 압축한 날짜별 파일을 만든다. (휴대용 NAS를 시스템에 연결한다.)
- 지난데이터는 수동으로 삭제한다.
백업 대상 데이터는 다음과 같다.
- PostgreSQL에 저장된 관계형 데이터
- 파일첨부 데이터 (Django 웹 어플리케이션의 파일 첨부 디렉토리 media_dir)
- Mongodb에 저장된 별도 데이터
백업 스크립트 backup.sh (#usage: ./backup.sh target_dir media_dir)
#!sh
target=my-django-app-backup-$(date +%Y%m%d)
mkdir $1/$target
cd $1/$target
pg_dump my-django-app > my-django-app-postgres.dump
mongodump --db my-django-app --out my-django-app-mongo >& /dev/null
cp -R $2 .
## tar zcvf media.tgz $2 (tar save the path)
cd ..
tar zcvf $target.tgz $target >& /dev/null
rm -rf $target
복구 스크립트 restore.sh (#usage: ./restore.sh backup.tgz project_dir)
#!sh
read -p "It will replace my-django-app DB to this backup file. Are you sure? " -n 1 -r
if [[ $REPLY =~ ^[Yy]$ ]]
then
dirname=`dirname $1`
filename=`basename $1`
target=${filename/.tgz/}
cd $dirname
tar zxvf $filename >& /dev/null
dropdb my-django-app
createdb my-django-app
psql my-django-app < $target/my-django-app-postgres.dump >& /dev/null
mongo my-django-app --eval "db.dropDatabase()" >& /dev/null
mongorestore $target/my-django-app-mongo >& /dev/null
rm -rf $2/media_dir
mv $target/media_dir $2
rm -rf $target
fi
스케줄링 설정 (매일 새벽 2시에 당일 날짜 이름의 백업파일 생성)
$ crontab -l
0 2 * * * /Users/hygkim/srv/my-django-app/scripts/backup.sh /target_dir /User/hygkim/srv/my-django-app/media_dir/
위 스크립트를 써서 백업 시스템 구현시 주의사항이 있다.
- crontab에 등록한 프로세스는 항상 바로 잘 동작하는지 확인해봐야 한다. 쉘에서 직접 구동하는 것과 cron을 통해 구동하는 것은 환경변수 설정이 다를 수 있다. 반드시 확인해봐야 한다.
- 파일시스템 디렉토리를 복사할 때 경로명 마지막에 "/" 중요하다. 해당 디렉토리로 덮어쓰느냐 하위 디렉토리에 쓰느냐 차이가 있다. 자칫 잘못하면 복구를 못할 수 도 있다.
- 테스트중 원래 데이터가 소실되지 않도록 주의해야 한다. 반드시 첫 백업 파일을 별도의 장소에 보관한 뒤, 테스트한다.
백업시스템은 주기적으로 백업 여부를 확인하고, 복구를 테스트해보는 것이 생명이다. 만일의 사고에 항상 잘 대비할 수 있도록 충분히 준비해야 한다.