Rsync와 sersync를 활용한 실시간 데이터 동기화 구축

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/primary

5. 전용 계정 기반 동기화

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.secrets

5.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 --reload

5.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.11

5.4 Pull 방식 동기화

# 원본 서버를 rsync 서버로 설정 후, 대상 서버에서 Pull
[root@target-svr ~]# rsync -avz backupagent@192.168.115.111::datastore /archive/primary/ --password-file=/etc/rsync.secrets

6. 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  sersync2

6.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
50000000

6.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
100

7. 운영 고려사항

항목권장 설정
inotify watch 제한fs.inotify.max_user_watches 증가(대규모 디렉터리)
네트워크 대역폭--bwlimit으로 제한하여 생산 영향 최소화
보안VPN 또는 전용선 구성, hosts allow 엄격 제한
모니터링rsync 로그 + sersync 실패 로그 통합 수집
장애 대응프로세스 감시 스크립트 + systemd 서비스화 권장

태그: rsync sersync inotify 리눅스 백업 실시간 동기화

6월 20일 05:14에 게시됨