1. Rsync 핵심 개념
Rsync(Remote Sync)는 리눅스 환경에서 데이터를 원격으로 복제·백업하는 핵심 도구이다. 전체 백업과 증분 백업을 모두 지원하며, 심볼릭 링크·하드 링크·권한·타임스탬프 등 메타데이터를 그대로 유지한다. 전송 전 압축 처리를 통해 대역폭을 절약하므로, 중앙 집중식 백업 아키텍처나 재난 복구(DR) 구축에 적합하다.
# 버전 확인
[root@backup-svr ~]# rsync --version
rsync version 3.1.3 protocol version 31
Copyright (C) 1996-2018 by Andrew Tridgell, Wayne Davison, and others.
Web site: https://rsync.samba.org/
Capabilities:
64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints,
socketpairs, hardlinks, symlinks, IPv6, batchfiles, inplace,
append, ACLs, xattrs, iconv, symtimes, prealloc백업 유형 비교
| 유형 | 설명 |
|---|---|
| 전체 백업 | 대상 전체를 매번 복사 |
| 차등 백업 | 마지막 전체 백업 이후 변경분만 저장 |
| 증분 백업 | 직전 백업 시점 이후 변경분만 저장 |
2. 동작 메커니즘
Rsync는 C/S(Point-to-Point) 구조로 동작하며, 기본적으로 TCP 873번 포트를 사용한다. xinetd 슈퍼데몬을 통해 서비스를 관리할 수도 있고, 독립 데몬으로 운영할 수도 있다.
동기 방식
- Push(전송): 원본 서버가 능동적으로 대상 서버로 데이터 전송. 서버 부하가 집중되므로 소규모 환경에 적합.
- Pull(수신): 대상 서버가 원본 서버로부터 데이터를 가져옴. 다수 클라이언트가 동시에 접근하면 원본 서버 병목 발생.
3. 기본 설치 및 실행
# 양쪽 노드에 설치
[root@backup-svr ~]# yum install -y xinetd rsync
[root@target-svr ~]# yum install -y xinetd rsync
# 데몬 기동
[root@backup-svr ~]# rsync --daemon
# 포트 리스닝 확인
[root@backup-svr ~]# ss -antp | grep 873
tcp LISTEN 0 5 0.0.0.0:873 0.0.0.0:* users:(("rsync",pid=2841,fd=3))
tcp LISTEN 0 5 [::]:873 [::]:* users:(("rsync",pid=2841,fd=5))주요 옵션
| 옵션 | 의미 |
|---|---|
-a | 아카이브 모드(재귀 + 속성 보존) |
-v | 상세 출력 |
-z | 전송 중 압축 |
--delete | 원본에 없는 대상 파일 삭제(완전 동기화) |
--port | 커스텀 포트 지정(기본 873) |
--password-file | 비밀번호 파일 경로 지정 |
-avz | 일반적으로 가장 많이 사용하는 조합 |
4. SSH 기반 동기화 실습
# 양쪽 노드에 동일 계정 생성
[root@backup-svr ~]# useradd syncacc && echo 'Sync@2024' | passwd --stdin syncacc
[root@target-svr ~]# useradd syncacc && echo 'Sync@2024' | passwd --stdin syncacc
# 원본 서버: 테스트 데이터 준비
[root@backup-svr ~]# mkdir /syncdata
[root@backup-svr ~]# chown -R syncacc:syncacc /syncdata
[root@backup-svr ~]# chmod g+s /syncdata
[root@backup-svr ~]# setfacl -m u:syncacc:rwx /syncdata
[root@backup-svr ~]# cp -r /boot/* /syncdata/
# 대상 서버: 저장소 생성
[root@target-svr ~]# mkdir -p /archive/primary
[root@target-svr ~]# chown syncacc:syncacc /archive/primary
# 원본 → 대상으로 Push
[root@backup-svr ~]# rsync -avz /syncdata/ syncacc@192.168.115.112:/archive/primary
syncacc@192.168.115.112's password:
sending incremental file list
...
sent 142,315,678 bytes received 6,412 bytes 4,891,223.45 bytes/sec
total size is 158,203,441 speedup is 1.11
# SSH 비표준 포트(예: 2222) 사용 시
[root@backup-svr ~]# rsync -avz -e "ssh -p 2222" /syncdata/ syncacc@192.168.115.112:/archive/primary5. 전용 계정 기반 동기화
5.1 설정 파일 구조
Rsync 데몬 모드의 설정 파일은 /etc/rsyncd.conf를 사용하며, 글로벌 파라미터와 모듈 파라미터로 구성된다.
# /etc/rsyncd.conf 주요 지시자
port=873 # 서비스 포트
address=192.168.115.112 # 바인딩 주소
uid=root # 프로세스 실행 사용자
gid=root # 프로세스 실행 그룹
max connections=10 # 최대 동시 연결 수
pid file=/var/run/rsyncd.pid
lock file=/var/run/rsync.lock
log file=/var/log/rsyncd.log
hosts allow=192.168.115.0/24
[datastore] # 모듈명
path=/archive/primary # 실제 동기화 경로
comment=Primary Backup Store
read only=false
auth users=backupagent # 인증 계정(시스템 계정과 무관)
secrets file=/etc/rsync.secrets5.2 대상 서버 설정
[root@target-svr ~]# vim /etc/rsyncd.conf
port=873
address=192.168.115.112
uid=root
gid=root
use chroot=yes
max connections=4
pid file=/var/run/rsyncd.pid
lock file=/var/run/rsync.lock
log file=/var/log/rsyncd.log
motd file=/etc/rsyncd.welcome
hosts allow=192.168.115.0/24
[datastore]
path=/archive/primary
comment=Primary Backup Store
read only=false
list=yes
auth users=backupagent
secrets file=/etc/rsync.secrets
# 인증 파일 생성
[root@target-svr ~]# echo "backupagent:Backup#Secure9" > /etc/rsync.secrets
[root@target-svr ~]# chmod 600 /etc/rsync.secrets
# 환영 메시지
[root@target-svr ~]# echo "Authorized Backup Node Only" > /etc/rsyncd.welcome
# 저장소 생성
[root@target-svr ~]# mkdir -p /archive/primary
# 서비스 기동
[root@target-svr ~]# systemctl stop rsyncd 2>/dev/null; rsync --daemon --config=/etc/rsyncd.conf
# 방화벽 개방
[root@target-svr ~]# firewall-cmd --permanent --add-port=873/tcp
[root@target-svr ~]# firewall-cmd --reload5.3 원본 서버에서 Push 테스트
[root@backup-svr ~]# echo 'Backup#Secure9' > /etc/rsync.secrets
[root@backup-svr ~]# chmod 600 /etc/rsync.secrets
# 모듈명(datastore)으로 동기화
[root@backup-svr ~]# rsync -avz --delete /syncdata/ backupagent@192.168.115.112::datastore --password-file=/etc/rsync.secrets
Authorized Backup Node Only
sending incremental file list
...
sent 142,315,699 bytes received 6,423 bytes 6,203,139.65 bytes/sec
total size is 158,203,441 speedup is 1.115.4 Pull 방식 동기화
# 원본 서버를 rsync 서버로 설정 후, 대상 서버에서 Pull
[root@target-svr ~]# rsync -avz backupagent@192.168.115.111::datastore /archive/primary/ --password-file=/etc/rsync.secrets6. sersync 연동 실시간 동기화
6.1 아키텍처 이해
sersync는 inotify 기반의 파일 시스템 이벤트 감시 도구로, 디렉터리 내 변경 사항을 실시간으로 포착한다. rsync와 결합하면 변경된 파일만 선택적으로 동기화하는 효율적인 실시간 복제 환경을 구축할 수 있다.
| 구성 요소 | 역할 |
|---|---|
| inotify/sersync | 파일 시스템 변경 이벤트 감지 |
| rsync | 변경된 데이터 전송 |
| rsync 데몬 | 대상 서버에서 수신 대기 |
6.2 sersync 설치 및 설정
# 원본 서버(192.168.115.111)에 sersync 배포
[root@backup-svr ~]# cd /opt
[root@backup-svr opt]# wget https://github.com/wsgzxl/sersync/archive/refs/tags/2.5.4.tar.gz -O sersync.tar.gz
[root@backup-svr opt]# tar xzf sersync.tar.gz
[root@backup-svr opt]# mv sersync-2.5.4 sersync
[root@backup-svr opt]# cd sersync
[root@backup-svr sersync]# ls -la
-rwxr-xr-x 1 root root 2210 confxml.xml
-rwxr-xr-x 1 root root 1810128 sersync26.3 confxml.xml 설정
[root@backup-svr sersync]# vim confxml.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5.4">
<!-- 호스트 정의 -->
<host hostip="localhost" port="8008"></host>
<!-- 디버그 및 로그 -->
<debug start="false"/>
<fileSystem xfs="false"/>
<!-- 监控路径及远程目标 -->
<sersync>
<localpath watch="/syncdata">
<remote ip="192.168.115.112" name="datastore"/>
</localpath>
<!-- rsync 매개변수 -->
<rsync>
<commonParams params="-artuz"/>
<auth start="true" users="backupagent" passwordfile="/etc/rsync.secrets"/>
<userDefinedPort start="false" port="874"/><!-- port if non-standard -->
<timeout start="true" time="100"/>
<ssh start="false"/>
</rsync>
<!-- 실패 시 재시도 -->
<failLog path="/var/log/sersync_fail.log" timeToExecute="60"/>
<!-- 필터링 규칙 -->
<filter start="false">
<exclude expression="(.*)\.svn"/>
<exclude expression="(.*)\.git"/>
</filter>
</sersync>
</head>6.4 서비스 기동 및 검증
# sersync 데몬 모드 실행
[root@backup-svr sersync]# ./sersync2 -d -r -o /opt/sersync/confxml.xml
Set the system param
execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches
execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events
parse the command param
...
daemon started, sersync run behind the console
# 프로세스 확인
[root@backup-svr ~]# ps aux | grep [s]ersync2
root 3847 0.0 0.1 21560 1234 ? Ssl 09:15 0:00 ./sersync2 -d -r -o /opt/sersync/confxml.xml
# inotify watch limit 확인
[root@backup-svr ~]# cat /proc/sys/fs/inotify/max_user_watches
500000006.5 자동 복구 스크립트
[root@backup-svr ~]# vim /opt/sersync_guard.sh
#!/bin/bash
# sersync 프로세스 모니터링 및 자동 재기동
SYNC_BIN="/opt/sersync/sersync2"
SYNC_CONF="/opt/sersync/confxml.xml"
LOG_FILE="/var/log/sersync_guard.log"
while true; do
running=$(pgrep -c -f "sersync2")
if [[ $running -eq 0 ]]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') - sersync 비정상 종료 감지, 재기동 시도" >> $LOG_FILE
$SYNC_BIN -d -r -o $SYNC_CONF
if [[ $? -eq 0 ]]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') - sersync 재기동 완료" >> $LOG_FILE
fi
fi
sleep 5
done
[root@backup-svr ~]# chmod +x /opt/sersync_guard.sh
[root@backup-svr ~]# nohup /opt/sersync_guard.sh >/dev/null 2>&1 &6.6 실시간 동기화 검증
# 원본 서버에서 파일 생성
[root@backup-svr ~]# echo "real-time sync test" > /syncdata/verify_$(date +%s).txt
# 대상 서버에서 즉시 확인
[root@target-svr ~]# ls -lt /archive/primary/ | head -5
-rw-r--r-- 1 root root 20 Nov 14 09:23 verify_1731554582.txt
# 대량 파일 생성 테스트
[root@backup-svr ~]# for i in {1..100}; do dd if=/dev/urandom of=/syncdata/sample_$i.bin bs=1K count=10; done
# 대상 서버에서 동기화 확인
[root@target-svr ~]# ls /archive/primary/sample_*.bin | wc -l
1007. 운영 고려사항
| 항목 | 권장 설정 |
|---|---|
| inotify watch 제한 | fs.inotify.max_user_watches 증가(대규모 디렉터리) |
| 네트워크 대역폭 | --bwlimit으로 제한하여 생산 영향 최소화 |
| 보안 | VPN 또는 전용선 구성, hosts allow 엄격 제한 |
| 모니터링 | rsync 로그 + sersync 실패 로그 통합 수집 |
| 장애 대응 | 프로세스 감시 스크립트 + systemd 서비스화 권장 |