Skip to content

데이터 백업 #

Find similar titles

4회 업데이트 됨.

Edit
  • 최초 작성자
    Jehong Lee
  • 최근 업데이트
    tykim

Structured data

Category
Management

모든 정보화시스템은 축적되는 데이터에 대한 효과적인 백업복구 절차가 구비되어야 한다. 예상치 못한 사고에 의해 데이터가 유실될 수 있다. 또는 과거에 실수로 삭제한 데이터를 복구해야할 필요도 있다.

개요 #

백업시스템RAID를 혼동하는 경우가 많은데, RAID는 실시간 하드디스크 고장에 대비하는 1차적인 대비책이며, 백업시스템은 3일전, 일주일전 데이터를 사용할 수 있도록 보장하는 2차적인 대비책이다.

다음 두가지로 크게 구분할 수 있다.

  1. 전체백업: 전체 데이터를 백업한다. 백업주기가 짧으면, 데이터 저장 낭비가 심해진다는 단점이 있다. cp 혹은 rsync 명령을 이용하여, 특정 디렉토리를 주기적으로 백업한다.
  2. 증분백업: 최초 전체 백업 후, 이후 백업주기마다 변화량만 저장한다. 오픈소스 rdiff-backup 혹은 상용솔루션 이용할 수 있다. 주기적으로 복구가 잘 되는지 확인해야 할 필요가 있다.

백업은 잘 동작하고 있는지 주기적으로 확인하는 것이 중요하다. 또한, 백업 데이터로 어떻게 복구하는지도 충분한 테스트가 있어야 한다.

어디에 백업할 것인가도 중요한 문제이다.

  1. 동일한 컴퓨터, 동일한 파일시스템
  2. 별도의 파일시스템
  3. 별도의 백업 컴퓨터, 동일한 서버실 (SSH key 설정 필요)
  4. 원격 백업 컴퓨터

기본적으로 최소한 별도의 파일시스템에 해야 한다. 하드디스크 고장은 상대적으로 자주 일어나는 일이며, 때문에 별도의 하드디스크, 파일시스템에 데이터를 복사한다. 자원이 허용하면 가능한 원격 백업 컴퓨터를 이용하는 것이 좋다. ( 삼성SDS 화재사건시 데이터가 유실되었을 수도 있다는 보도가 나온 적 있다.) 국가적 재난 등을 고려하면 국외로 백업하는 것도 안전성을 위한 방법 가운데 하나이다.

백업 시스템을 구현하는 일반적인 절차는 다음과 같다.

  1. 백업해야할 데이터 선별, 백업 주기 결정, 백업 장소, 지난 데이터 관리
  2. 백업 스크립트
  3. 복구 스크립트
  4. 스케줄 설정 (crontab)

실제 어플리케이션 예제 (my-django-app) #

실제 어플리케이션에 구현한 백업 및 복구 스크립트를 예로 살펴보자. my-django-app 웹 어플리케이션은 Django 웹 어플리케이션이며, PostgreSQL, Mongodb 데이터베이스를 사용하며, 첨부파일이 저장되는 별도의 파일 경로가 있다. 이 어플리케이션의 백업 정책을 다음처럼 정했다.

  1. 하루 1회 별도의 파일시스템에 전체 데이터 백업하고, 압축한 날짜별 파일을 만든다. (휴대용 NAS를 시스템에 연결한다.)
  2. 지난데이터는 수동으로 삭제한다.

백업 대상 데이터는 다음과 같다.

  1. PostgreSQL에 저장된 관계형 데이터
  2. 파일첨부 데이터 (Django 웹 어플리케이션의 파일 첨부 디렉토리 media_dir)
  3. 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/

위 스크립트를 써서 백업 시스템 구현시 주의사항이 있다.

  1. crontab에 등록한 프로세스는 항상 바로 잘 동작하는지 확인해봐야 한다. 쉘에서 직접 구동하는 것과 cron을 통해 구동하는 것은 환경변수 설정이 다를 수 있다. 반드시 확인해봐야 한다.
  2. 파일시스템 디렉토리를 복사할 때 경로명 마지막에 "/" 중요하다. 해당 디렉토리로 덮어쓰느냐 하위 디렉토리에 쓰느냐 차이가 있다. 자칫 잘못하면 복구를 못할 수 도 있다.
  3. 테스트중 원래 데이터가 소실되지 않도록 주의해야 한다. 반드시 첫 백업 파일을 별도의 장소에 보관한 뒤, 테스트한다.

백업시스템은 주기적으로 백업 여부를 확인하고, 복구를 테스트해보는 것이 생명이다. 만일의 사고에 항상 잘 대비할 수 있도록 충분히 준비해야 한다.

Incoming Links #

Related People #

Suggested Pages #

0.0.1_20231010_1_v71