rsync는 변경된 파일만 전송하는 효율적인 동기화 도구입니다. SSH와 함께 사용하면 원격 서버 간 안전한 파일 동기화와 백업이 가능합니다.
rsync 기본 문법
rsync [옵션] 출발지 목적지
# 로컬 디렉터리 동기화
rsync -av /source/dir/ /destination/dir/
# 원격 서버로 전송 (로컬 → 원격)
rsync -av /local/dir/ user@remote-server:/remote/dir/
# 원격 서버에서 가져오기 (원격 → 로컬)
rsync -av user@remote-server:/remote/dir/ /local/dir/
자주 사용하는 옵션
-a # archive mode: -rlptgoD 옵션 묶음 (권한, 소유자, 타임스탬프 보존)
-v # verbose (상세 출력)
-z # 압축 전송 (느린 네트워크에 유용)
-h # 사람이 읽기 쉬운 크기 표시
-P # 진행률 표시 + 부분 전송 재개 (--progress --partial)
-n # dry-run (실제 전송 없이 시뮬레이션)
--delete # 출발지에 없는 파일을 목적지에서 삭제 (완전 동기화)
--exclude # 특정 파일/디렉터리 제외
--bwlimit=1000 # 대역폭 제한 (KB/s)
실전 사용 예제
# 웹 루트 동기화 (삭제 포함)
rsync -avz --delete /var/www/html/ user@backup-server:/backup/www/
# 특정 파일 제외하며 동기화
rsync -avz \
--exclude='*.log' \
--exclude='*.tmp' \
--exclude='node_modules/' \
--exclude='.git/' \
/var/www/html/ user@backup-server:/backup/www/
# 먼저 시뮬레이션으로 확인
rsync -avzn --delete /var/www/html/ user@backup-server:/backup/www/
# 대역폭 제한 (네트워크 부하 방지)
rsync -avz --bwlimit=10240 /large-file/ user@backup-server:/backup/
SSH 포트 및 키 지정
# 비표준 SSH 포트 사용
rsync -avz -e "ssh -p 2222" /local/ user@remote:/remote/
# 특정 SSH 키 사용
rsync -avz -e "ssh -i /home/user/.ssh/backup-key" /local/ user@remote:/remote/
# 포트와 키 동시 지정
rsync -avz -e "ssh -p 2222 -i ~/.ssh/backup-key -o StrictHostKeyChecking=no" \
/local/ user@remote:/remote/
스냅샷 방식 백업 (하드링크 활용)
변경된 파일만 새로 저장하고 변경되지 않은 파일은 하드링크로 연결해 공간을 절약하는 방식입니다:
#!/bin/bash
# /opt/snapshot-backup.sh
REMOTE_USER="backup"
REMOTE_HOST="backup-server"
REMOTE_DIR="/backup/snapshots"
SOURCE="/var/www/html"
DATE=$(date +%Y%m%d_%H%M%S)
LATEST="$REMOTE_DIR/latest"
DEST="$REMOTE_DIR/$DATE"
rsync -avz --delete \
--link-dest="$LATEST" \
-e "ssh -i /root/.ssh/backup-key" \
"$SOURCE/" \
"$REMOTE_USER@$REMOTE_HOST:$DEST/"
# latest 심볼릭 링크 업데이트
ssh -i /root/.ssh/backup-key "$REMOTE_USER@$REMOTE_HOST" \
"rm -f $LATEST && ln -s $DEST $LATEST"
echo "$(date): Snapshot backup completed: $DEST"
데이터베이스 백업 + rsync
#!/bin/bash
# /opt/full-backup.sh
BACKUP_DIR="/opt/backup"
DATE=$(date +%Y%m%d)
REMOTE="backup-server"
mkdir -p "$BACKUP_DIR"
# MySQL 덤프
echo "MySQL 백업 중..."
mysqldump -u root -p비밀번호 --all-databases | \
gzip > "$BACKUP_DIR/mysql_$DATE.sql.gz"
# 웹 파일 백업 (디렉터리는 trailing slash 주의)
echo "파일 백업 중..."
rsync -avz --delete \
--exclude='*.tmp' \
--exclude='cache/' \
/var/www/html/ \
root@$REMOTE:/backup/www/
# DB 파일 전송
rsync -avz "$BACKUP_DIR/mysql_$DATE.sql.gz" \
root@$REMOTE:/backup/db/
# 7일 이상된 로컬 백업 삭제
find "$BACKUP_DIR" -name "*.sql.gz" -mtime +7 -delete
echo "백업 완료: $(date)"
SSH 키 없이 rsync (rsync 데몬)
# 백업 서버에 rsync 데몬 설정
# /etc/rsyncd.conf
[www-backup]
path = /backup/www
comment = Web files backup
read only = no
auth users = rsyncuser
secrets file = /etc/rsyncd.secrets
# /etc/rsyncd.secrets
rsyncuser:비밀번호
# 클라이언트에서 접속
rsync -avz /var/www/html/ rsyncuser@backup-server::www-backup
자동화 cron 설정
# /etc/cron.d/rsync-backup
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# 매일 새벽 2시 전체 백업
0 2 * * * root /opt/full-backup.sh >> /var/log/backup.log 2>&1
# 매시간 스냅샷 (증분)
0 * * * * root /opt/snapshot-backup.sh >> /var/log/snapshot.log 2>&1
전송 속도 및 진행 상황 모니터링
# 진행률과 함께 전송
rsync -avzP /large-dir/ user@remote:/dest/
# 전송 완료 후 통계
rsync -avz --stats /source/ user@remote:/dest/
rsync는 안정적이고 효율적인 백업 도구입니다. TCP-80.NET의 서버는 내부 네트워크를 이용한 정기 백업을 무료로 제공하지만, 추가적인 외부 백업을 직접 구성하면 데이터를 더욱 안전하게 보호할 수 있습니다.