9. 데이터 백업

 

  서버를 운영하다 보면 가장 중요하게 생각해야 하고 또한 중요한 것이 바로 백업이다.

  백업의 중요성은 아무리 말해도 지나치지 않는다.

  해킹을 당해서 자료가 지워지는 경우나, 혹은 관리자의 실수로 인해서 데이터가 삭제되는 경우가 생긴

  다. 이럴때 백업을 해놓지 않았다면, 몇 달 혹은 몇 년의 자료가 한순간에 날아가 버리게 된다.

  이런 이야기가 남의 일 같이 들리겠지만, 실제로, 서버호스팅 고객들 사이에서 종종 일어나는 일임을

  상기하고 백업을 하루, 일주일 정도의 단위로 받아두도록 한다.


  이번 chapter에서는 서버에서 기본적으로 백업을 받아야 하는 파일들과 자료들에 대해서 알아보도록 하겠다.


9.1 무엇을 백업을 받을 것인가?

  이제 백업을 하기로 생각했다면 과연 무엇을 백업 받을것인지 알아야 한다.

  여기서는 어떤 파일들을 백업받아야 할지에 대해서 알아보도록 한다.


9.1.1 시스템 파일 (프로그램별 설정파일)

  시스템 파일과 프로그램의 설정파일은 서버가 처음 구축된 후에 서버의 제 기능을 위해서 설정되는 파일이다.

  이런 시스템 파일은 서버가 처음설정이 되었을 때를 제외하고는 거의 변하지 않는다.

  시스템 파일은 서버를 다른 곳으로 이전을 하거나 부득이 하게 재설치를 해야 할 경우에 서버의 다운타임을 줄여주는 큰 역할을 하게 된다.


  아래에서 나열되는 파일들은 호스트웨이에서 설치되고 있는 시스템의  프로그램 경로와 시스템파일을 따르고 있다. 만약 이외에 사용자가 직접 설치할 프로그램이나 직접 설정한 파일이 있다면 그것도 같이 백업을 받아두면 좋다.

 

시스템 설정 파일

용              도

  /usr/local/apache/conf/httpd.conf

  웹구동 프로그램인 아파치의 설정 파일

  /etc/php.ini

  웹프로그램밍 언어인 php의 설정 파일

  /etc/named.conf

  네임서버를 위한 named 설정파일 (네임서버 운영시에만 필요)

  /var/named/*

  네임서버 운영에 필요한 도메인들의 zone file이 있음 (“)

  /etc/sendmail.cf

  sendmail의 설정파일. (메일서버를 운영하고 있을 때만 필요)

  /etc/mail/*

  sendmail의 기타 설정파일이 들어있는 디렉토리

<표 9-1 시스템 파일과 그 용도 >

 

기타 설정 파일(사용할 때 만)

용             도

  /etc/sysctl.conf

  커널 소프트 패치에 대한 설정파일

  /etc/proftpd/conf/proftpd.conf

  proftp 설정 파일

  /etc/lilo.conf

  커널 부팅과 관련된 설정 파일

  /etc/resolv.conf

  도메인 검색을 위해서 질의할 nameserver 지정 파일

  /etc/export

  NFS 사용 시에 원격접속을 허용할 서버들을 설정

<표 9-2 기타 설정 파일과 그 용도 >


 

9.1.2 데이터 파일

  9.1.1절에서는 시스템 파일 중에서 백업받을 것을 알아보았다. 사실 앞절에서 설명한 시스템 파일은 솔직히 없어도 서버를 다시 설정하는 시간만을 들이면 되기 때문에 꼭, 반드시 있어야 하는 것들은 아니다. 하지만 설정파일을 백업 받아 둠으로 인해서 새로운 서버로의 세팅이 그만큼 쉬워지고 빨라진다는 것은 시스템 파일과 설정 파일을 백업 받아두는데 충분한 이유가 될 것이다.

  하지만, 이번 절에서 나열하게 되는 데이터 파일은 절대 백업을 하지 않고서는 다시 복구할 수 없는것들이다. 그만큼 중요한 것이므로 반드시 백업을 해두어야 하겠다.

 

데이터 파일

용             도

  /home/*

  각 계정사용자들의 자료들이 보관되는 곳

  /usr/local/mysql/data (var)

  mysql을 사용하여 만든 DB데이터 들이 보관되는 곳

  /var/spool/mail

  각 사용자들의 메일이 보관되는 곳

  < 표 9-3 호스트웨이에서 제공 설치되는 data 파일들의 경로와 용도 >

 

  앞서서도 이야기를 했지만 여기서 나열되는 파일들의 경로와 파일들은 평균적이고 일반적인 경로와 파일들이며, 만약 설정을 다르게 했을 경우에는 그에 맞는 경로와 파일들을 백업해야 한다.

  /usr/local/mysql/data옆에 (var) 라고 쓰여진 부분은 mysql의 데이터가 저장되는 공간으로 주로

  data 디렉토리를 사용하지만 간혹 /usr/local/mysql/var 디렉토리에 data가 쌓일 수 있도록 설정된 서버를 예로 들어서 옆에다 기입해 둔것이다.

  /var/spool/mail은 server내에서 sendmail을 이용하여 메일서버를 구동하고 있는 관리자들에게만 해당되는 내용이다. /var/spool/mail 디렉토리 밑에 각 계정 사용자들의 이름으로 된 파일안에 메일이 쌓이게 된다. 중요한 메일이 수신되었는데 미처 확인하지 못했는데 지워졌을 때를 대비하여 백업해 두는것도 좋은 백업 방법이다. 메일의 백업 여부는 시스템을 운영하는 관리자의 결정에 맡긴다.

 

 

9.2 어떻게 백업을 할것인가?

  9.1절에서는 백업을 할 시스템 파일들과 데이터 파일들에 대해서 알아보았다.

  그렇다면 어떻게 백업을 할것인가?

  여기에서는 크게 두 가지로 나눌 수가 있다.

  첫째로는 서버내에 보조 하드 디스크를 하나 더 설치하여 (또는 현재의 사용하고 있는 하드디스크 공간이 충분히 여유가 있다면 같은 하드디스크 내에)  디렉토리를 생성하고(가령 backup) 데이터를 백업하는 방법이고, 둘째 방법으로는 하드 디스크가 완전히 망가질 것을 대비하여 다른 서버나 현재 서버관리자가 사용하고 있는 개인 컴퓨터로의 즉, 외부로의 백업이다.

  외부로의 백업은 서버내부로 하는 백업과 동일하지만 ftp나 nfs등을 이용하여 데이터를 전송하는 것을 제외하고는 모두 동일하므로 여기서는 서버내부에서 하는 백업(로컬 백업)에 대해서 설명을 하고자 한다.

 

9.2.1 로컬 백업

  로컬에서의 백업은 속도가 빠르며, cron을 통해서 자동적으로 원하는 시간대에(주로 시스템 부하가 없는 새벽) 백업을 받을수 있는 장점이 있는 반면에, 서버의 하드디스크가 문제가 발생했을 경우 자료의 백업본과 함께 원본 데이터 까지 같이 유실될수 있는 위험부담이 있다. 하지만 원래의 하드디스크에 하나의 독립 파티션으로 백업공간이 나누어져 있는 경우, 또는 추가로 백업용 하드디스크를 부착하여 백업을 하는 경우에는 90-95% 이상은 데이터 복구가 가능하다.


  백업을 하기 위해서는 cp(copy) 명령어를 사용해서 복사를 하는 방법도 있고, pax, tar 등으로 묶어서 이동시키는 방법이 있다.

  여기에서는 tar로 묶은후에 하드디스크의 공간 절약을 위해서 gzip으로 압축하여 백업을 하는 벙법을 설명하고자 한다.


  실제로 백업을 하기 전에 미리 알아두어야 하는 명령이 있다.

  바로 tar 명령과 gzip 이다. tar는 파일을 묶어주는 명령이고 (단순히 한 파일로 묶기만 한다. 압축은 하지 않는다), gzip은 파일을 압축하는 명령이다.

  이 두 명령을 조합함으로써 여러 개로 흩어져 있는 파일들을 한데 묶어서 압축하여 이동시킬수 있는 것이다.


  그럼 tar명령과 gzip을 간단히 알아보자

   1) tar

    가장 많이 쓰는 옵션만을 설명한다. (나머지 자세한 파일 설명은 man page를 이용한다.)

    - 사용방법

      tar [xcvf] 파일명

        -x 묶음을 해제할 때 사용한다.

        -c 파일을 묶을때 사용한다.

        -v 묶거나 파일을 풀때 과정을 보여준다.

        -f 파일 이름을 지정한다.

        -C 파일을 풀어놓을 경로를 지정한다.

    

     예) tar -cvf home.tar /home/* : /home 디렉토리 밑의 모든 파일을 home.tar로 묶는다.

.         tar -xvf home.tar : 현재 디렉토리에 home.tar 파일을 풀어놓는다.

   .      tar -xvf home.tar -C /home : 홈디렉토리밑에 home.tar 파일을 풀어놓는다.

 

  2) gzip

    리눅스에서 파일을 압축하고자 할때 가장 많이 사용하는 명령어이다.

    아마 확장자가 gz으로 끝나는 파일을 많이 보았을것이다. 그것은 gzip으로 압축이 되어있다는 것을    의미하는 것이다.

 

    - 사용방법 

      gzip -[d] 파일명

      -d : 압축을 해제할 때 사용한다.


    예) gzip home.tar : home.tar를 압축하여 home.tar.gz을 생성한다.

      .   gzip -d home.tar.gz : home.tar.gz의 압축을 해제하여 home.tar를 생성한다.


  리눅스에서는 tar와 gzip의 명령을 조합하여 한번의 명령으로 사용하는 것을 허용한다.


  예) tar -zcvf home.tar.gz /home/* : home디렉토리 아래의 모든 파일을 home.tar.gz으로

       묶고 압축한다. (-z 옵션은 gzip을 의미)

.   tar -zxvf home.tar.gz : home.tar.gz를 현재디렉토리에 압축을 해제하고 묶인 것을 풀어놓는다.

                             (-z 옵션 : gzip을 의미)


  gzip과 tar명령은 자주 쓰이는 명령이므로 반드시 숙지하여야 한다.


  다음은 특정 상황을 예로 들어서 로컬 백업을 시행하는 절차 및 방법을 알아보고자 한다.


 

목표 : /home/밑의 모든 파일을 /backup 이란 디렉토리로 백업을 한다.

   

  ※ 이 로컬 백업을 진행하기 전에 반드시, tar의 사용법과 쉘 프로그램을 짤 수 있도록 쉘 프로그램

     chapter를 숙지한 다음 보기 바란다.


  < 백업 절차 >

   1. /backup 이란 디렉토리를 생성

   2. /home/*  홈 밑의 모든 파일을 백업한다.

   3. 백업이 정상적으로 되어있는지 확인한다.


  가장 단순한 방법

  1) cd /home/

  2) tar -zcvf /backup/home.tar.gz *

  3) cd /backup

  4) ls

  5) home.tar.gz


  위의 방법은 tar명령을 사용해서 home 디렉토리를 통째로 묶은 후에 /backup/ 디렉토리에 보관하는 방법이다. 물론 이것도 좋은 방법이기는 하지만 만약 웹호스팅을 운영한다고 가정했을때 /home 디렉토리 안에는 무수히 많은 디렉토리들이 존재할것이다. 많은 도메인을 가상호스팅 해줘야 하기 때문이다. 전체로 묶었다가 만약 한 도메인 사용자가 자기 파일의 백업본을 복구 시켜 달라고 하면 압축한 파일 전체를 다시 풀어야 하는 불상사가 생긴다. 물론 공간과 시간이 많다면, 지장이 없겠지만. 그리 효율적인 방법은 아니다. 또한 가장 중요한 문제로, 압축해놓은 파일에 문제가 생겼다면, 그것은 복구하기가 어려울 뿐만 아니라 전체 압축파일을 못쓰게 된다.


  그래서 개선된 방법을 알아보도록 하겠다.

  이것은 쉘 프로그램을 이용한 방법이다. 쉘 프로그래밍을 숙지하였다고 생각하고 기타 부가 설명은 하지 않는다.

 

  ====================================

  #!/bin/sh

  for backup in $(ls /home)

  do

     tar -zcvf /backup/$backup.tar.gz /home/$backup

  done

  =====================================

< /home/ 디렉토리의 디렉토리 혹은 파일들을 따로 압축하기 >

 

  위의 방법은 /home 안의 디렉토리 혹은 파일들을 각각의 이름으로 따로 압축하여 backup에 저장한다는 의미의 쉘 프로그램이다.


  각기 따로 압축이 되어 저장이 되므로, 훨씬 관리가 편하며, 압축 파일이 깨진다고 해도 그것은 일부분의 문제이며 전체 백업에 대해서는 문제를 일으키지 않는다. 즉 각 압축 파일마다 독립성이 보장된다.


  위의 백업 방법도 아주 유용한 방법이기는 하나 여기다가 더 첨가를 해보도록 하자.

  day by day (1일마다) 백업을 하며, 그 백업을 5일동안 유지하고 백업이 되면 그 백업 내용을 메일로 보내주며, 백업후 5일이 지난 파일에 대해서는 디렉토리를 삭제하여 용량을 유지하는 방법을 알아 보도록 하겠다.


   파일명 : backup.sh

  ===================================

  #!/bin/sh

  today=$(date +%m-%d)

  rmday=$(date +%m-%d --date '5 days ago')


  rm -rf /backup/$rmday

  mkdir -p /backup/$today

  cd /backup/$today

 

  for home in $(ls /home)

    do

       tar -zcvf $home.tar.gz /home/$home

    done

  echo " <<<<  backup info >>>>" > mail.txt

  echo "" >> mail.txt

  date >> mail.txt

  echo "" >> mail.txt

  echo " <<<< backup size >>>> " >> mail.txt

  du -sh >> mail.txt

  echo "

        " >> mail.txt

  echo " <<<< backup list >>>> " >> mail.txt

  ls -alh >> mail.txt

  echo "

        " >> mail.txt

  echo " <<<< used hard space >>>> "" >> mail.txt

  df -h >> mail.txt

  echo "

        " >> mail.txt

  mail -s " manpage.co.kr backup mail " hkim@hostway.co.kr < ./mail.txt

  ======================================

 

  위의 프로그램은 쉘 프로그램이 실행이 되면 쉘 프로그램이 실행된 시스템 날짜로 /backup/디렉토리밑에 디렉토리가 생성되며 백업이 다 되면, 백업된 내용 및 시스템의 하드 여유공간을 mail.txt에 저장했다가  hkim@hostway.co.kr의 메일로 전송을 하는 쉘 프로그램이다.


  위에서 day by day백업이라고 했는데, 날마다 직접 관리자가 실행 시켜주는 것이 아니고, cron에 등록을 해서 시스템에서 일일 정해진 시간마다 스크립트를 실행시켜 자동 백업을 하도록 설정한다.

  cron에 등록시킨다는 것은 /etc/crontab 에 백업 프로그램을 실행할 날짜와 시간을 지정해 주는 것이지만, cron은 이런 작업을 더욱 쉽게 할수 있도록 cron.hourly(시간마다), cron.daily(날마다), cron.weekly(주마다), cron.monthly(월마다) 라는 디렉토리를 제공하며, 프로그램이 동작하기 원하는 주기의 디렉토리에 실행할 프로그램을 넣어두면 자동으로 실행이 된다.

  여기에서는 day by day백업이므로  /etc/cron.daily 라는 디렉토리안에 작성한 backup.sh라는 파일을 넣어주면 된다.

  이때 chmod 명령을 사용해서 루트만 읽고 쓰고, 실행할수 있도록 700 정도의 퍼미션을 주도록 한다.

chmod 700 /etc/cron.daily/backup.sh

 

  여기서 cron이라는 것은 사용자가 규칙적으로 (주기적으로) 사용하는 명령이나 프로그램

  을 예약하여 지정된 시간에 프로그램을 구동시켜주는 프로그램이다.

  cron의 설정파일은 /etc/crontab이며, 일반적으로 이 파일은 수정할 필요가 없으며,

  아래에 나열된 디렉토리에 실행할 프로그램을 넣어주기만 하면 동작을 한다.

  /etc/cron.hourly (시간미다 실행, 동작하게 할 프로그램을 등록한다.)

  /etc/cron.daily  (날마다 실행, 동작하게 할 프로그램을 등록한다.)

  /etc/cron.weekly (주간마다 실행, 동작하게 할 프로그램을 등록한다.)

  /etc/cron.monthly (월마다 실행, 동작하게 할 프로그램을 등록한다.)

< cron 명령의 설명 >


  이렇게 cron.daily에 등록을 해놓으면 관리자가 날마다 해당 프로그램을 실행시키지 않아도 cron에서 자동으로 실행을 시켜준다. (cron.daily는 crontab의 세팅을 변경하지 않았다면  새벽 4시 02분에

  수행된다.)


  이렇게 함으로써 cron에 등록한 자동 백업까지 알아보았다. 물론 여기다가 몇 몇 기능을 더 추가하여

  더욱 강력하고, 편리한 백업 쉘 프로그래밍을 제작할 수 있을 것이다.


  그것은 이글을 읽는 관리지의 몫이고, 여기서는 활용할 수 있는 간단한 예만을 제시해 준 것이다.

 

  외부 백업은 글 선두에서도 언급했듯이 백업을 해놓은 것 더욱 안전성을 기하기 위해서나 서버에 공간이 부족하여 외부의 다른 저장 공간으로 자료를 이동시키거나 다운로드 하는 것을 말한다.

  외부 백업은 해당 서버 관리자의 관리 스타일에 맡기기로 한다.


  여기까지 백업 chapter를 마치고, 다음 chapter에서는 보안에 대해서 알아보도록 한다.