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의 서버는 내부 네트워크를 이용한 정기 백업을 무료로 제공하지만, 추가적인 외부 백업을 직접 구성하면 데이터를 더욱 안전하게 보호할 수 있습니다.