웹마스터 팁

오늘은 데이터 백업에 관한 아주 중요한 3가지 주제에 대해서 쓰려고 한다.
그 내용이 좀 많기는 하지만 비교적 자세하게, 경험을 얘기 하려고 한다.

물론 대부분의 서버관리자들이 이렇게 하지 않겠나 하는 생각을 하지만 난 이제 적용했다 -_-

이 시점에서 학교 서버의 운영환경 을 잠시 설명해야 겠다.
정식 웹서버가 한대 운영되고 있고 그 서버와 환경이 완전히 똑같은 서버 하나를 만들어서 백업 서버를 운영하고 있다.
웹서버에서 자료의 변경이 일어나면 실시간으로 백업서버에 반영 된다.
단 제로보드 첨부파일은 실시간으로 update가 안되므로 매일 새벽에 cron 작업으로 update시키는 방법을 선택하였다.
(지금부터 웹서버, 백업서버를 혼돈하지 않기를 바란다.)

웹서버의 cron은 웹서버 자료의 백업 파일 생성이 목적이고
백업서버의 cron은 웹서버에서 생성한 자료를 가지고 와서 백업서버에 복사하는것이 목적이다.

1. cron 을 이용한 자동 백업 자료 생성

--------------- 웹서버의 자동 실행할 스크립트 작성 -------------
/root아래에 backup.sh 이라는 파일을 만들어 놓고 백업 명령어를 다음과 같이 주었다.

#!/bin/bash
/usr/local/mysql/bin/mysqldump -uroot -p***** mysql > mysql_db_bak_$(date +%Y%m%d).sql
/usr/local/mysql/bin/mysqldump -uyanemone -p***** yanemone > yanemone_db_bak_$(date +%Y%m%d).sql
mv *.sql /backup
tar cvfpz /backup/html_bak.tar.gz /var/www/html
tar cvfpz /backup/yanemone_html_bak.tar.gz /home/yanemone/public_html
tar cvfpz /backup/dichang_html_bak.tar.gz /home/dichang/public_html

find /backup -ctime +3 -exec rm -f {} ;

백업할 내용이라던지 파일 이름은 자신의 상황에 맞게 주면 되겠다.
그리고 finde...이 내용은 파일을 생성한지 3일이 지난 것을 찾아서 지우라는 것이다. 자꾸 만들면 용량을 차지하니까.. -_-

이렇게 하고 나면 backup.sh파일을 chmod 100 backup.sh로 단단히 무장하라.

그리고 crontab -e 명령으로 cron 작업을 명시하자
그럼 vi가 열리면서 편집이 가능하다

00 06 * * * /root/backup.sh

를 추가하고 :x 로 저장하고 나오자.
위의 작업은 매일 새벽 6시에 /root/backup.sh을 실행하라 라는 말이다.

그리고 /var/spool/cron/root가 있는지 확인해보자. 있다면 정상적으로 수행할 것이다.

---------------- 백업 서버의 자동실행 스크립트 작성 -------------------

백업 서버에서는 웹서버가 생성한 자료를 가져 오기만 하면 된다.

#! /bin/bash

rsync -avz 211.57.173.129::SU1/ /backup

/usr/local/mysql/bin/mysqldump -uroot -pxxxxx mysql> king_mysql_db_backup_$(date +%Y%m%d).sql
/usr/local/mysql/bin/mysqldump -uyanemone -pxxxxx yanemone> king_yanemone_db_backup_$(date +%Y%m%d).sql

find /backup -ctime +3 -exec rm -f {} ;

tar xvfpz /backup/htm*.gz /backup
tar xvfpz /backup/yanemone_html*.gz /backup

cp -r /backup/var/www/html/* /var/www/html
cp -r /backup/home/yanemone/public_html/* /home/yanemone/public_html

단순히 가져오기만 하는 것은 rsync를 이용한 명령어로 충분하고 나머지는 내가 필요한 대로 추가한 것이다.
rsync에 대해서는 따로 설명을 밑에서 하겠다.

앞에서 얘기 했듯이 웹서버의 MySQL DB의 내용을 실시간으로 백업서버의 MySQL DB에 갱신을 시키는데 이것은 MySQL의 replication이라는 기능을 이용한다.

그러니 백업서버에도 똑같이 데이터베이스의 내용이 있으므로 백업서버의 DB도 백업을 받아놓으려고 몇줄을 추가 했다.
그리고 3일이 지난것들은 자동으로 삭제를 하도록 하였다.

replication은 mysql db는 실시간으로 자료를 수정해 주기는 하지만 제로보드를 이용할때 첨부파일에 대한 문제는 해결이 되지 않는다.
첨부파일은 DB안에 저장되는것이 아니라 제로보드의 data라는 디렉토리 안에 보관이 되기 때문이다.
그래서 압축을 덮어 씌우는 작업을 추가를 한것이다.

그리고 crontab -e 명령으로 cron 작업을 명시하자
그럼 vi가 열리면서 편집이 가능하다

10 06 * * * /root/backup.sh

를 추가하고 :x 로 저장하고 나오자.
위의 작업은 매일 새벽 6시 10분에 /root/backup.sh을 실행하라 라는 말이다.

웹서버가 6시에 백업 파일을 만드니까 10분 정도 지나면 충분히 다 만들었다고 보고(자료가 많으면 시간차가 더 나야 할것이다) 6시 10분으로 지정하였다.

2. rsync 설정하기
원래 rsync는 데이터동기화에 사용되는 것이지만 활용여하에 따라 네트웍 백업을 위한 훌륭한 도구가 될 수 있다. 고 박성수님께서 말씀하신것 같다 ^^

우선 rsync는 http://rsync.samba.org/ftp/rsync 에서 최신 소스 버전을 받을 수 있다. 내가 설치할 이시점에서의 최신 버전은 2.5.5이다.
압축을 풀고(보통 /usr/local/src에서 많이 작업 한다)
./configure
make
make install
순으로 설치를 하자. 특별한 옵션 없이 해도 잘 동작한다.
(궁금한 사람들을 위해 ./configure --help가 준비 되어 있다(x18) )

설명은 나의 경우를 가지고 할테니 자신의 환경에 맞게 해석하고 적용하는것!! 잊지말기를..

백업 대상 서버(백업할 데이터가 있는 서버들)
SU1 : 211.57.173.XXX (X는 백업 대상 서버)
(나는 하나 밖에 없으므로 여기서 끝이다. 더 있는 사람은 비슷하게 추가하면 될것이다)

백업서버(데이터를 가져와 보관할 서버)
211.57.173.YYY(Y는 백업 서버)

이 rsync는 백업 대상이나 백업 서버 모두 설치가 되어야 한다.
(위에서 설치할 때 한번만 설명해서 하나에만 설치하면 안된다 (x23) )

-------------- 백업 대상 서버에서 확인할 것들 --------------------
cat /etc/services | grep 873
으로 rsync에 관한 내용이 있는지, 막혀 있지나 않은지 학인해보라.
막혀 있으며 당연히 풀어야 한다. 없으면 추가하라
rsync                  873/tcp                      # rsync
rsync                  873/udp                      # rsync

다음으로 /etc/hosts.allow 파일에 백업 서버가 접근할 수 있도록 만들어라
rsync : 211.57.173.YYY, local

그리고 /etc/xinetd.d/ 아래에 다음과 같은 내용의 rsync파일이 있는지 보고 없으면 만들어라.
[root@www /etc/xinetd.d]# cat rsync
# default: off
# description: The rsync server is a good addition to am ftp server, as it
#       allows crc checksumming etc.
service rsync
{
        disable = no
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/bin/rsync
        server_args     = --daemon
        log_on_failure  += USERID
}

만들었으면 xinetd를 재시작해야 한다.
/etc/rc.d/init.d/xinetd restart 라고 하면 된다.

이제는 /etc/rsync.conf 파일을 손봐주자(x10)
[root@www /etc]# cat rsyncd.conf
[SU1]
path = /backup
comment = web server
uid = nobody
gid = nobody
use chroot = yes
read only = yes
hosts allow = 211.57.173.YYY
max connections = 3
timeout 600

대충 보면 무슨 말인지 알 것이다. 몰라도...상관없다... 이대로 하면 된다^^
염려스러워서..  path 와 hosts allow는 자신의 상황에 맞게 바꿔라

---------------- 백업 서버에서 점검할 내용 --------------------------
마찬가지 rsync를 설치하면 된다.
그리고 rsync 명령어로 가지고 오면 되는데 그것은 위에서 cron작업 할 때 설명이 되었다.
rsync -avz 211.57.173.XXX::SU1/ /backup

rsync로 211.57.173.XXX에 접속해서 [SU1]으로 지정된 곳에 가서 자료를 가지고와서 /backup으로 넣어라 대충 이런 의미이다. -avz는 찾아보도록!!

이러면 끝난다.

3. MySQL replication 을 이용한 실시간 백업
위에서 cron과 rsync만으로도 백업은 충분히 될것이나 replication으로 실시간으로 자료를 갱신해보자.
아까도 얘기했지만 제로보드의 첨부파일은 실시간으로 갱신이 안되니까 손으로 해주어야 한다. 물론 cron돌리면 되니까 별걱정 없다. ^^

작동원리는 간단하다.
웹서버의 MySQL DB에서 변경작업(insert, update, delete, create, drop등) 이 일어나면 그것을 자동으로 백업서버에 던져주어 백업서버에서도 똑같은작업이 일어나게 만드는 것이다.
그럴려면 당연히 둘다 MySQL이 설치되어 있어야 한다.
replication을 이용하기 위해서는 가능한한 최신버전의 MySQL을 사용할것을 추천한다. 아무리 안되도 3.23.29 이상은 사용하라.

그리고 아주 아주 중요한것!! 나도 이것때문에 몇번 실패를 했다.
뭐냐면...
최초로 replication을 시작할 시점에는 두 서버의 MySQL DB내용이 완전히 똑같아야 한다. 만약 조금이라도 다르면 ...안될것이다.
웹서버에서 어떤 테이블에 추가를 했는데 백업 서버에 와서 똑같이 추가하려고 보니 테이블이 없다... 그럼 거기서 replication은 끝나버린다 (x13)

그러니 replication을 적용하기 전 잠시동안 DB를 shutdown하던지 lock을 걸어야 한다.

다음 순서를 잘 따라하면 한번만에 성공할 것이다.
(이제부터는 마스터, 슬래이브로 설명하겠다 왜? 내맘이다 헤헤 (x7)
마스터는 웹서버 슬래이브는 백업서버라고 보면 되겠다)

1. 마스터와 슬래이브에 최신 MySQL을 설지한다. 동일 버전으로 설치하라.
   (아마 거의 되어 있을것이다)

2. 마스터에서 replication을 위한 사용자를 추가한다
   mysql> grant file on *.* to repli@"%" identified by "패스워드" ;
   repli대신 자신이 원하는 아이디 사용해도 된다.

3. 마스터의 mysql을 shutdown한다.
[root@www ] mysqladmin -uroot -p shutdown

4. 마스터의 MySQL DB내용을 그대로 슬래이브로 복사한다.
mysql을 설치할 때 어디 설치하느냐에 따라 다른데 나는 /var/lib/mysql밑에 데이터들이 쌓인다.
tar cvfp mysql_db.tar /var/lib/mysql/* 하면 그대로 압축될것이다.

5. 슬래이브에서 마스터로 ftp를 해서 아까 만든 mysql_db.tar를 가지고 온다
가져 와서는 /var/lib/mysql  아래에 풀어주면 된다.

6. 마스터의 /etc/my.cnf파일을 손본다
[mysqld]
log-bin
server-id=1

7. 슬래이브의 /etc/my.cnf파일을 손본다
[mysqld]
master-host=211.57.173.XXX
master-user=repli
master-password=XXXXXXX
master-port=3306
server-id=2

보면 알겠지만 replic는 아까 grant를 줄때 만든 아이디이다.
그리고 master-port는 mysql이 사용하는 포트 3306을 그대로 쓴다.
(nmap localhost 해보면 mysql포트가 나온다)

8. 마스터와 슬래이브의 MySQL을 재가동한다.

물론 이후에 잘 되는지 점검하는것이 있는데

마스터에서는 mysql>show master status 라고 해보면
mysql> show master status;
*************************** 1. row ***************************
            File: www-bin.001
        Position: 12476
    Binlog_do_db:
Binlog_ignore_db:
1 row in set (0.00 sec)

슬래이브에서는 mysql> show slave status
mysql> show slave status;
*************************** 1. row ***************************
          Master_Host: 211.57.173.XXX
          Master_User: repli
          Master_Port: 3306
        Connect_retry: 60
      Master_Log_File: www-bin.001
  Read_Master_Log_Pos: 12476
       Relay_Log_File: king-relay-bin.001
        Relay_Log_Pos: 12514
Relay_Master_Log_File: www-bin.001
     Slave_IO_Running: Yes
    Slave_SQL_Running: Yes
      Replicate_do_db:
  Replicate_ignore_db:
           Last_errno: 0
           Last_error:
         Skip_counter: 0
  Exec_master_log_pos: 12476
      Relay_log_space: 12518
1 row in set (0.00 sec)

등으로 나온다. 그러면 정상적으로 동작하는것이다.
위에서 12476 이라는 포지션 숫자가 보이는가? 이게 똑같이 나와야 한다.

굉장히 복잡하고 많은 내용을 적었다.
혹시 안되거나 질문할 내용이 있으면 yanemone.net으로 해주기 바란다.

긴글 읽어주셔서 감사합니다
제목 글쓴이 날짜
리눅스 보안 : 기초적인 방화벽 : portsentry 설치하기 [2] 정인배 2002.11.29
cron을 이용한 자동 백업 받기 최종우 2002.12.02
cron과 rsync 그리고 replication 을 이용한 데이터 백업 [3] 최종우 2002.12.03
FTP 를 이용한 원격 백업 받기 [5] 최종우 2002.12.04
[계정삭제 스크립터] 편리님이 만드신 계정추가랑 연동됩니다. [4] file 김동현 2002.12.04
[FreeBSD] 자동으로 시간 맞추기.. [1] DeX™ 2002.12.04
계정 등록 스크립트 [8] 편리 2002.12.05
오래간만에 찾아뵙는군요^^ [2] Dopesoul 2002.12.08
Zend Optimizer Full Pass Setup [3] DukeEYS 2002.12.08
mod_gzip 적용시 php 인클루드를 실패해서 포기하신분 보세요 [2] DukeEYS 2002.12.08
apache2 + mod_jk 100번의 닭질 끝에 찾아가는 사이트 DukeEYS 2002.12.09
[FreeBSD] Proftp + MySQL 연동 설치하기 [2] file DeX™ 2002.12.09
레드햇(redhat)리눅스에서 rpm 관리 명령어 정인배 2002.12.09
srpms, alpha, i386 , i686 이 의미하는 것은? [1] Dopesoul 2002.12.12
누군가 우리서버를 공격하고 있을때 응급처치! [13] Dopesoul 2002.12.13
[re] 저의 최종의견 입니다. [5] Dopesoul 2002.12.17
SetEnvIf 와 SetEnvIfNocase 의 차이 [7] Dopesoul 2002.12.13
DeX 님의 시간 동기화 스크립트를 편하고 안정적으로 변경한 리눅스용! [4] Dopesoul 2002.12.13
리눅스 rpm 명령어 활용(1): MRTG 설치 정인배 2002.12.14
PHP 4.2.3 파워 설치 테크닉 (에러 0%에 도전) [2] 밍밍이 2002.12.17