서버 백업 자동화 완전 정복 – rsync와 cron으로 데이터를 지키는 법

1. 백업 없이 서버를 운영한다는 것의 위험성

백업의 중요성을 깨닫는 순간은 항상 데이터를 잃은 후입니다. 실수로 중요한 폴더를 rm -rf로 삭제했거나, 서버 디스크가 고장 났거나, 랜섬웨어에 감염됐을 때입니다.

이때 백업이 없으면 모든 데이터가 영원히 사라집니다. 반면 백업이 있다면 어제 상태로, 또는 일주일 전 상태로 복구할 수 있습니다.

이 글에서는 rsynccron을 조합해 정기적으로 자동 백업이 실행되는 시스템을 구축합니다.

2. 무엇을 얼마나 자주 백업할 것인가?

백업 범위와 주기는 데이터의 중요도와 변경 빈도에 따라 결정합니다.

반드시 백업해야 할 것들 웹 서비스 업로드 파일(/var/www/html), 데이터베이스 데이터, 주요 설정 파일(/etc 일부), 사용자 스크립트와 코드가 해당됩니다.

백업 주기 가이드 매일 변경되는 데이터베이스는 매일 백업하고, 자주 바뀌지 않는 설정 파일은 주 1회 또는 변경 시마다 백업합니다.

3-2-1 백업 원칙 3개 이상의 복사본, 2가지 이상의 다른 저장 매체, 1개는 외부(다른 서버 또는 클라우드)에 보관하는 원칙입니다.

3. rsync 핵심 옵션과 사용법

rsync는 변경된 파일만 전송하는 효율적인 동기화 도구입니다. 처음에는 전체를 복사하지만 이후에는 변경된 부분만 전송해 빠릅니다.

자주 쓰는 옵션을 정리합니다.

-a (archive): 권한, 소유자, 타임스탬프 등 모든 파일 속성을 보존합니다.

-v (verbose): 진행 상황을 화면에 출력합니다.

-z (compress): 전송 중 데이터를 압축합니다. 원격 전송 시 속도가 빨라집니다.

--delete: 원본에서 삭제된 파일을 목적지에서도 삭제합니다. 동기화 목적일 때 사용합니다.

--exclude='패턴': 특정 파일이나 폴더를 제외합니다.

4. 같은 서버 내 로컬 백업 설정

같은 서버 내에서 /var/www/html을 /backup/www로 백업합니다.

rsync -av /var/www/html/ /backup/www/

원본과 목적지 경로 끝의 슬래시(/)에 주의합니다. 원본 끝에 슬래시가 있으면 폴더 내용을 복사하고, 없으면 폴더 자체를 복사합니다.

날짜별로 다른 폴더에 백업하고 싶다면 아래처럼 사용합니다.

rsync -av /var/www/html/ /backup/html_$(date +%Y%m%d)/

5. 원격 서버로 백업 전송하기

다른 서버로 백업을 전송할 때는 SSH를 통해 rsync를 사용합니다.

rsync -avz -e ssh /var/www/html/ 사용자명@백업서버IP:/backup/www/

SSH 키 파일을 사용하는 경우 -e 옵션에 키 파일을 지정합니다.

rsync -avz -e “ssh -i ~/.ssh/backup_key.pem -p 22” /var/www/html/ ubuntu@백업서버IP:/backup/www/

6. 백업 스크립트 작성 후 cron에 등록하기

백업 스크립트 파일을 만듭니다.

sudo nano /home/ubuntu/scripts/backup.sh

아래 내용을 작성합니다.

#!/bin/bash

DATE=$(date +%Y%m%d)
BACKUP_DIR=”/backup/html_$DATE”

mkdir -p $BACKUP_DIR
rsync -av /var/www/html/ $BACKUP_DIR/

echo “[$DATE] Backup completed” >> /var/log/backup.log

스크립트에 실행 권한을 줍니다.

chmod +x /home/ubuntu/scripts/backup.sh

crontab에 등록합니다.

crontab -e

매일 새벽 2시에 실행하도록 아래 줄을 추가합니다.

0 2 * * * /home/ubuntu/scripts/backup.sh

7. 데이터베이스 백업은 따로 해야 한다

MySQL 같은 데이터베이스는 실행 중에 파일을 직접 복사하면 데이터가 손상될 수 있습니다. 반드시 mysqldump 같은 전용 도구로 백업해야 합니다.

데이터베이스 백업 스크립트입니다.

sudo nano /home/ubuntu/scripts/db_backup.sh

아래 내용을 작성합니다.

#!/bin/bash

DATE=$(date +%Y%m%d_%H%M%S)
mysqldump -u root -p비밀번호 –all-databases | gzip >
/backup/db_$DATE.sql.gz

echo “[$DATE] DB Backup completed” >> /var/log/db_backup.log

보안상 더 좋은 방법은 ~/.my.cnf 파일에 자격증명을 저장하는 것입니다.

[client]
user=root
password=비밀번호

이후 mysqldump 명령에서 -p 옵션을 생략할 수 있습니다.

8. 오래된 백업 자동 삭제로 디스크 관리하기

매일 백업하면 시간이 지날수록 디스크가 가득 찹니다. 일정 기간이 지난 백업은 자동으로 삭제하는 정책이 필요합니다.

30일 이상 된 백업 폴더를 삭제하는 명령어입니다.

find /backup -maxdepth 1 -type d -name “html_*” -mtime +30 -exec rm -rf {} ;

이 명령어를 cron에 등록해 매일 정리가 실행되도록 합니다.

0 3 * * * find /backup -maxdepth 1 -type d -name “html_*” -mtime +30 -exec rm -rf {} ;

9. 정리 및 다음 단계

오늘 배운 핵심을 정리합니다.

  • rsync는 변경된 파일만 전송하는 효율적인 백업 도구입니다.
  • 백업 스크립트를 만들고 cron에 등록하면 정기 자동 백업이 완성됩니다.
  • 데이터베이스는 파일 복사가 아닌 mysqldump로 따로 백업해야 합니다.
  • 오래된 백업을 자동 삭제하는 정책으로 디스크 낭비를 방지합니다.
  • 3-2-1 원칙에 따라 복사본을 여러 곳에 보관합니다.

다음 글에서는 내부 IP(192.168.x.x)로는 왜 외부에서 접속이 안 되는지, 사설 IP와 공인 IP의 차이를 알아보겠습니다.

댓글 남기기

광고 차단 알림

광고 클릭 제한을 초과하여 광고가 차단되었습니다.

단시간에 반복적인 광고 클릭은 시스템에 의해 감지되며, IP가 수집되어 사이트 관리자가 확인 가능합니다.