rsync로 백업하기
SSH를 통해 다른 서버로 파일을 복사하고, 하드 링크로 버전 이력을 만들며, 위험한 --delete 옵션으로 너무 많이 삭제하지 않는 방법을 알아봐요.
업데이트 2026년 8월 23일
rsync는 복사본을 만드는 가장 간단한 방법이에요. 어디서나 사용할 수 있고, 변경된 파일 부분만 전송하며, SSH로도 동작해요. 작은 데이터셋이라면 이걸로 충분해요.
기본 명령어
rsync -avz --delete \
-e "ssh -i /root/.ssh/backup_key -p 22" \
/var/www/ backup@backup.example.com:/srv/backup/vds/www/
플래그 설명:
-a— 권한, 소유자, 시간, 링크를 보존해요.-v— 진행 상황을 보여줘요.-z— 전송 중 압축해요. 데이터가 많고 대역폭이 최대 500 Mbps라면 유용해요.--delete— 수신 측에서 원본에 더 이상 없는 항목을 삭제해요.
원본 경로 끝의 슬래시는 "디렉터리의 내용물"을 의미해요. 슬래시가 없으면 디렉터리 자체가 복사돼요.
/var/www/와/var/www는 다른 결과를 만들고,--delete와 함께 쓰면 그 차이가 엉뚱한 것을 지워버려요. 항상--dry-run으로 먼저 실행하세요.
rsync -avzn --delete /var/www/ backup@backup.example.com:/srv/backup/vds/www/
-n 플래그가 드라이 런이에요.
비밀번호 없는 접근 키
예약된 복사에는 비밀번호 입력 없이 로그인해야 해요:
ssh-keygen -t ed25519 -f /root/.ssh/backup_key -N ""
ssh-copy-id -i /root/.ssh/backup_key.pub backup@backup.example.com
수신 측에서 이 키를 단일 명령어로 제한하세요. 그러면 키가 유출되어도 셸을 얻을 수 없어요. 수신 측의 ~/.ssh/authorized_keys에서:
command="rrsync -wo /srv/backup",restrict ssh-ed25519 AAAA... backup
하드 링크를 이용한 버전 기록
일반 rsync는 현재 상태만 유지해요. 어제 삭제한 파일을 오늘 발견해도 복원할 곳이 없어요. --link-dest는 기록을 제공해요. 변경되지 않은 파일은 다시 복사하지 않고 링크하므로, 서른 개의 복사본이 하나보다 조금 더 많은 공간만 차지해요.
#!/bin/bash
set -euo pipefail
DEST=/srv/backup/vds
TODAY=$(date +%F)
rsync -a --delete \
--link-dest="$DEST/latest" \
/var/www/ "$DEST/$TODAY/"
ln -sfn "$DEST/$TODAY" "$DEST/latest"
find "$DEST" -maxdepth 1 -type d -mtime +30 -name "20*" -exec rm -rf {} +
스크립트를 일정에 맞춰 밤에 실행하고, 항상 로그를 남기세요.
제외 항목
rsync -avz --exclude-from=/root/backup-exclude.txt / backup@host:/srv/backup/vds/root/
/proc/
/sys/
/dev/
/run/
/tmp/
/var/lib/docker/
/var/cache/
*.log
루트 전체를 복사하는 일은 거의 필요 없어요. 무엇을 백업할지 문서에서 정확한 목록을 만드는 편이 더 유용해요.
rsync가 적합하지 않을 때
- 스토리지 암호화와 중복 제거가 필요하다면 Restic을 사용하세요.
- 데이터가 끊임없이 변경되고 무결성이 중요하다면, 먼저 데이터베이스를 덤프한 다음 결과 파일을 rsync하세요.
- 수신 측이 신뢰할 수 없는 다른 사람의 스토리지라면: rsync는 클라이언트 측 암호화 없이 파일을 그대로 기록해요.
흔한 실수
- 잘못된 원본 경로와
--delete. 빈 원본 디렉터리는 수신 측을 지워버려요. 드라이 런은 필수예요. - 같은 디스크에 복사본. 그건 백업이 아니라 같은 장애에 대한 두 번째 대상이에요. 오프사이트 복사본을 참고하세요.
- 이미 압축된 데이터에 압축 적용.
-z는 아카이브와 이미지 속도만 느려지게 해요. - 야간 실행이 디스크 병목에 부딪힘. 쓰기 처리량 한도는 티어에 따라 달라요. 디스크 속도를 참고하세요.
--bwlimit=20000과 한산한 시간대 실행이 도움이 돼요. - 아무도 결과를 확인하지 않음. 반환 코드를 로그로 남기고 모니터링하세요:
rsync ... || echo "backup failed" | mail -s alert you@example.com.