본문 바로가기
Infra2025년 10월 13일6분 읽기

rsync 고급 활용 — 서버 간 데이터 동기화 전략

YS
김영삼
조회 372

rsync 고급 활용법

rsync는 파일 동기화의 표준 도구로, 델타 전송 알고리즘을 통해 변경된 부분만 효율적으로 전송합니다. 기본 사용법을 넘어 실전에서 유용한 고급 패턴을 알아봅니다.

핵심 옵션 정리

옵션의미용도
-a아카이브 모드 (-rlptgoD)권한/소유자 보존
-v상세 출력디버깅
-z전송 중 압축원격 전송 시
--delete소스에 없는 파일 삭제미러링
--partial중단된 전송 이어받기대용량 파일
--progress전송 진행 표시모니터링
--bwlimit대역폭 제한 (KB/s)트래픽 관리
--exclude파일/폴더 제외불필요 파일 제거

서버 간 동기화 패턴

# 기본 원격 동기화
rsync -avz --progress \
  /var/www/html/ \
  user@remote:/var/www/html/

# 미러링 (소스와 완전 동일하게)
rsync -avz --delete --delete-excluded \
  --exclude='.env' \
  --exclude='node_modules/' \
  --exclude='*.log' \
  /var/www/app/ \
  user@backup:/backup/app/

# SSH 포트 지정 + 키 인증
rsync -avz -e "ssh -p 2222 -i ~/.ssh/backup_key" \
  /data/ user@remote:/backup/data/

# 대역폭 제한 (10MB/s)
rsync -avz --bwlimit=10240 \
  /large-data/ user@remote:/backup/

증분 백업 (하드링크 기반)

#!/bin/bash
# incremental-backup.sh
BACKUP_SRC="/var/www"
BACKUP_DST="/backup/www"
DATE=$(date +%Y-%m-%d_%H%M%S)
LATEST="$BACKUP_DST/latest"
CURRENT="$BACKUP_DST/$DATE"

if [ -d "$LATEST" ]; then
  rsync -avz --delete \
    --link-dest="$LATEST" \
    "$BACKUP_SRC/" "$CURRENT/"
else
  rsync -avz "$BACKUP_SRC/" "$CURRENT/"
fi

rm -f "$LATEST"
ln -s "$CURRENT" "$LATEST"

find "$BACKUP_DST" -maxdepth 1 -type d -mtime +30 \
  -not -name "latest" -exec rm -rf {} ;

echo "Backup completed: $CURRENT"

필터 파일 활용

# /etc/rsync-filter.txt
- .git/
- node_modules/
- __pycache__/
- *.pyc
- .env
- .env.*
- *.log
- tmp/
- cache/

# 필터 파일 적용
rsync -avz --filter="merge /etc/rsync-filter.txt" \
  / user@backup:/full-backup/

rsync 데몬 모드

# /etc/rsyncd.conf
uid = nobody
gid = nogroup
use chroot = yes
max connections = 4
log file = /var/log/rsyncd.log

[backup]
  path = /backup
  comment = Backup Storage
  read only = no
  auth users = backupuser
  secrets file = /etc/rsyncd.secrets
  hosts allow = 10.0.0.0/24

# 데몬 시작
rsync --daemon

# 클라이언트에서 데몬 접속
rsync -avz /data/ backupuser@server::backup/data/

실전 자동화 스크립트

#!/bin/bash
MAX_RETRIES=3
RETRY_DELAY=30
SRC="/var/www/"
DST="user@remote:/backup/www/"

for i in $(seq 1 $MAX_RETRIES); do
  rsync -avz --partial --timeout=60 "$SRC" "$DST"
  if [ $? -eq 0 ]; then
    echo "Sync completed successfully"
    exit 0
  fi
  echo "Attempt $i failed, retrying in ${RETRY_DELAY}s..."
  sleep $RETRY_DELAY
done

echo "ERROR: Sync failed after $MAX_RETRIES attempts"
exit 1
  • --dry-run으로 실행 전 반드시 시뮬레이션하여 예상 결과를 확인합니다
  • --link-dest를 활용한 증분 백업은 디스크를 크게 절약합니다
  • cron과 조합하여 자동 백업 체계를 구축합니다
  • --partial --progress로 대용량 전송의 중단/재개를 지원합니다

rsync는 단순해 보이지만 옵션 조합에 따라 강력한 백업/동기화 시스템을 구축할 수 있습니다. 하드링크 기반 증분 백업은 별도 백업 소프트웨어 없이도 효율적인 시점 복구를 가능하게 합니다.

댓글 0

아직 댓글이 없습니다.
Ctrl+Enter로 등록