====== 서버 백업 ======
서버를 백업하는 방법은 매우 다양하다. 그중 하나가 나처럼 무식하게 통째로 복사하는 경우인데, 그렇다고 해서 스토리지를 그대로 복사하지는 않는다. 가끔 보면 dd if=/dev/sda of=/dev/sdb bs=2MB 식으로 HDD 를 통째로 복사해버리는 경우도 있는데, 초기 설치하고 설치본 백업 뜨는 용도 외에는 저런 방법을 쓰고 있지는 않다.
내 경우는, 주로 4중 백업이다.
서버 A, B, C 가 있고, 서버 A 내에서 백업하고 그게 다시 B 와 C 로 백업된다. 원본, A 내의 백업본, B, C 의 백업본.. 이렇게 모두 4개의 백업본이 있다.
윈도 서버는 앞에 1편에서 얘기한 것과 유사한 방식으로 하고 있고 (그저 무식하게 복사한다..), 유닉스나 리눅스쪽은 다음과 같은 스크립트를 돌린다. 사실 보면 알겠지만, 무식한 스크립트다.
일단, 간단히 설명하면,
1. 중요 파일 압축 후 특정 디렉터리로 복사 (보통 /home 밑에 디렉터리를 하나 만들어서 거기에 복사)
* DB (mysql, MariaDB) 등 디렉터리를 통째로 압축
* DB 를 dump 떠서 압축
* 설정파일들 (/etc, DNS 서버를 돌린다면 /var/named 등도 같이) 을 통째로 압축
* 웹페이지 (여기서는 /var/www) 를 통째로 압축
2. 위의 4가지 압축폰을 scp 로 B 서버로 복사
* 주로 scp 사용
* 사전이 미리 password 없이 로그인 가능하도록 설정 필요 - 이건 아래쪽에서 좀 더 자세히 쓰자.
3. 압축한 파일 중 30일 지난 파일 삭제
4. A 서버내의 백업 파티션에 있는 (/home2 또는 /backup 파티션, 보통 OS 가 설치되지 않은 독립된 스토리지 공간) 백업 파일 중 90 일 지난 파일 삭제
5. 웹페이지, DB, 설정파일, 사용자 디렉터리 (이 경우에는 /home) 을 통째로 백업 파티션 (위에서 말한 /home2 또는 /backup 파티션) 으로 복사
6. /home 디렉터리 통째로 복사
아래 스크립트를 어디 깊숙히 넣어두고 혹시 모르니 퍼미션은 700 으로 설정하자.
#!/bin/sh
/usr/bin/rdate -s time.bora.net
/sbin/hwclock -w
DATE=`date +%Y%m%d.%H%M`
sync && sync && sync
cd /
cd /var/lib/mysql
tar cvf /home/data/BACKUP/MYSQL/mysql_$DATE.tar --exclude /var/lib/mysql/mysql.sock *
bzip2 -9 /home/data/BACKUP/MYSQL/mysql_$DATE.tar
mysqldump -uDB관리자 계정명 -pDB관리자 비밀번호 --all-database > /home/data/BACKUP/MYSQL/mysql_dump_$DATE.sql
bzip2 -9 /home/data/BACKUP/MYSQL/mysql_dump_$DATE.sql
cd /
cd /etc
tar cvf /home/data/BACKUP/ETC/etc_$DATE.tar *
bzip2 -9 /home/data/BACKUP/ETC/etc_$DATE.tar
cd /
cd /var/www
tar cvf /home/data/BACKUP/WWW/www_$DATE.tar *
bzip2 -9 /home/data/BACKUP/WWW/www_$DATE.tar
scp /home/data/BACKUP/MYSQL/mysql_$DATE.tar.bz2 BACKUP계정@BACKUP-SERVER-B-IP:/home/data/BACKUP/MYSQL
scp /home/data/BACKUP/MYSQL/mysql_dump_$DATE.sql.bz2 BACKUP계정@BACKUP-SERVER-B-IP:/home/data/BACKUP/MYSQL
scp /home/data/BACKUP/ETC/etc_$DATE.tar.bz2 BACKUP계정@BACKUP-SERVER-B-IP:/home/data/BACKUP/ETC
scp /home/data/BACKUP/WWW/www_$DATE.tar.bz2 BACKUP계정@BACKUP-SERVER-B-IP:/home/data/BACKUP/WWW
find /home/data/BACKUP/MYSQL -mtime +30 -exec rm -f {} \;
find /home/data/BACKUP/ETC -mtime +30 -exec rm -f {} \;
find /home/data/BACKUP/WWW -mtime +30 -exec rm -f {} \;
find /home2/HOME/data/BACKUP/MYSQL -mtime +90 -exec rm -f {} \;
find /home2/HOME/data/BACKUP/ETC -mtime +90 -exec rm -f {} \;
find /home2/HOME/data/BACKUP/WWW -mtime +90 -exec rm -f {} \;
rsync -arv /var/www/* /home2/BACKUP/WWW/
rsync -arv /var/lib/mysql/* /home2/BACKUP/MYSQL
rsync -arv /etc/* /home2/BACKUP/ETC
cd /
cd /home
rsync -a /home/* /home2/HOME
sync && sync && sync
이렇게 해서 서버 A 에서 B 로 백업을 했고, B 는 위와 비슷한 스크립트로 C 로 넘긴다.
중간에 scp 로 데이터를 복사할 때 BACKUP계정@BACKUP-SERVER-B-IP 라고 썼는데, 도메인 네임보다는 IP 로 적어주는 게 낫다. 가끔 DNS 가 먹통이 되기도 하고, 누군가 DNS 에 장난을 쳐서 다른 곳으로 보내게 할 수도 있지만, IP 는 그럴 가능성을 약간은 낮춰준다.
그리고, 이 스크립트를 cron.d 에 backup 이라는 이름으로
10 12 * * * root /적당한-디렉터리/backup.sh > /dev/null
10 00 * * * root /적당한-디렉터리/backup.sh > /dev/null
정도로 넣어두면 하루에 2번 자동으로 돌아간다.
자 백업을 하자. 날려먹고 명정보 찾아가서 울지 말고 ...
-------------
그런데, 위와 같이 자동 백업을 하려면 ssh 로 자동로그인이 되도록 해두어야 한다. 예전에는 복잡한 방법을 썼는데, 요새는 쉽다.
서버 A 와 B 가 있고, 서버 A 에 있는 데이터를 서버 B 로 복사한다고 할 때,
- ssh-keygen -t rsa : 공개키 생성
- ssh-copy-id -i 계정@serverB : 공개키 복사
- ssh 계정@serverB : 공개키로 로그인 되는지 확인
로그인이 되면 잘 된 거다. 실제로는 이렇게 된다.
공개키 생성
[user@server-a ~]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
0e:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00 user@server-a.sapzil.net
The key's randomart image is:
+--[ RSA 2048]----+
| +.E |
| . o |
|. . . |
| = . |
|o = + o S |
| + = o = . |
| . o . . |
| . o+ |
| ..o+oo |
+-----------------+
[user@server-a ~]$
공개키 복사
[user@server-a ~]$ ssh-copy-id -i user@server-b.sapzil.net
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
user@server-b.sapzil.net's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'user@server-b.sapzil.net'"
and check to make sure that only the key(s) you wanted were added.
[user@server-a ~]$
로그인 되는지 확인
[user@server-a ~]$ssh user@server-b.sapzil.net
Last login: Tue Feb 3 16:39:30 2015 from 111.222.111.222
[user@server-b ~]$
이제 잘 된다.
-----------
2015/02/03 akpil