대상 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`과 함께 사용하여 매일 지정된 시간에 실행되도록 설정할 수 있습니다.