대상 OS: Debian 12 (bookworm)

rsync를 활용한 효율적인 파일 동기화 및 백업 운영

`rsync`는 파일을 효율적으로 복사하고 동기화하는 강력한 도구입니다. 이 글에서는 `rsync`의 중급 활용법과 실제 운영 환경에서의 적용 사례를 Debian 12 (bookworm)을 기준으로 설명합니다.

# 1. rsync 기본 개념 및 핵심 옵션

`rsync`는 파일의 변경된 부분만을 전송하는 차등(differential) 전송 방식을 사용하여 네트워크 대역폭과 시간을 절약합니다.

* **-a, --archive**: 아카이브 모드. 재귀적으로 디렉토리를 복사하며, 심볼릭 링크, 권한, 타임스탬프, 소유권, 그룹 정보 등을 보존합니다. 현대적인 `rsync` 사용 시 사실상의 표준 옵션입니다.

    rsync -a source/ destination/
    

* **-v, --verbose**: 복사 과정을 자세히 보여줍니다.

* **-z, --compress**: 전송되는 파일을 압축하여 네트워크 대역폭을 절약합니다.

* **--progress**: 전송 진행 상태를 보여줍니다.

* **--delete**: 소스에 없는 파일은 대상에서 삭제하여 동기화 상태를 유지합니다. 주의해서 사용해야 합니다.

# 2. SSH 연동을 통한 원격 동기화 및 백업

`rsync`는 SSH를 통해 안전하게 원격 시스템과 파일을 동기화할 수 있습니다.

* **원격지에서 로컬로 복사**:

    rsync -avz -e ssh user@remote-host:/path/to/remote/source/ /path/to/local/destination/
    

* **로컬에서 원격지로 복사**:

    rsync -avz -e ssh /path/to/local/source/ user@remote-host:/path/to/remote/destination/
    

* **SSH 포트 지정**:

    rsync -avz -e 'ssh -p 2222' /local/path/ user@remote-host:/remote/path/
    

# 3. 고급 활용법 및 트러블슈팅

* **증분 백업**: `rsync`의 `--link-dest` 옵션을 사용하면 이전 백업 디렉토리를 참조하여 변경된 파일만 새 디렉토리에 링크하는 방식으로 디스크 공간을 절약하는 증분 백업을 구축할 수 있습니다.

    # 첫 번째 백업
    rsync -a --link-dest=/path/to/prev_backup/ /source/data/ /backup/current_backup/

    # 두 번째 백업 (이전 백업의 파일은 하드 링크로 연결)
    rsync -a --link-dest=/backup/prev_backup/ /source/data/ /backup/current_backup2/
    

* **권한 및 타임스탬프 보존**: `-a` 옵션에 포함되어 있지만, 특정 상황에서는 `--no-g` (그룹 정보 보존 안 함), `--no-o` (소유권 보존 안 함), `--no-t` (타임스탬프 보존 안 함) 등으로 세밀하게 제어할 수 있습니다.

* **속도 제한**: 네트워크 부하를 줄이기 위해 전송 속도를 제한할 수 있습니다.

    rsync -avz --bwlimit=1000 /local/source/ user@remote-host:/remote/destination/
    # 1000KB/s (약 1MB/s) 로 제한
    

* **작업 실패 시 롤백**: `--delete` 옵션을 사용하는 경우, 작업 전 대상 디렉토리의 복사본을 생성하거나 스냅샷을 활용하여 실패 시 롤백할 수 있는 계획을 세우는 것이 중요합니다.

# 4. 실전 예시: 로그 파일의 일일 백업

매일 밤 `/var/log` 디렉토리를 원격 서버로 백업하는 간단한 스크립트입니다.

#!/bin/bash

LOCAL_DIR="/var/log/"
REMOTE_USER="backupuser"
REMOTE_HOST="your-backup-server.com"
REMOTE_DIR="/backup/logs/$(date +%Y%m%d)/" # 일별 디렉토리 생성

# SSH 키 기반 인증 설정 필요

rsync -avz \
  --delete \
  --bwlimit=5000 \
  --progress \
  -e "ssh -p 22" \
  "${LOCAL_DIR}" \
  "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}"

if [ $? -eq 0 ]; then
  echo "Log backup completed successfully for $(date +%Y-%m-%d)."
else
  echo "Log backup failed for $(date +%Y-%m-%d)." >&2
  # 알림 메커니즘 추가 (예: 메일 또는 메신저)
fi

위 스크립트는 `cron`과 함께 사용하여 매일 지정된 시간에 실행되도록 설정할 수 있습니다.