우분투에서 Unison을 설치하고 실시간 파일 동기화를 설정하는 방법
Unison은 파일 및 디렉토리 동기화를 위한 도구로 두 개의 디렉토리를 동일하게 유지할 수 있습니다.
Unison을 사용하여 두 서버 간에 파일을 실시간으로 동기화하려면 inotify-tools를 활용하여 파일 시스템 이벤트를 감지하고 Unison을 통해 동기화 작업을 수행하는 방법을 사용할 수 있습니다.
테스트 환경
호스트 이름 | 아이피 주소 | 동기화 디렉토리 | 비고 |
node1 | 192.168.10.111 | /app/www | unison, inotify-tools 패키지 설치 |
node2 | 192.168.10.114 | /app/www | unison, inotify-tools 패키지 설치 |
Unison 설치
Unison을 설치합니다.
sudo apt-get update
sudo apt-get install -y unison
사용 예시
unison /local-directory/ ssh://user@remote-server//remote-directory/
SSH 키 기반 인증 설정
Unison은 SSH를 통해 원격 서버에 접속하여 동기화 작업을 수행합니다. SSH 키 기반 인증을 사용하면 비밀번호 입력 없이 자동으로 동기화할 수 있습니다.
node1 서버에서 SSH 키 생성합니다.
ssh-keygen -t rsa -b 4096
생성된 공개 키를 node2 서버에 복사합니다.
---
SSH root 접속 허용 설정(PermitRootLogin)
echo "PermitRootLogin yes" | sudo tee -a /etc/ssh/sshd_config
sudo systemctl restart sshd
id_rsa와 id_rsa.pub 복사
scp /root/.ssh/id_rsa root@192.168.10.114:/root/.ssh/
scp /root/.ssh/id_rsa.pub root@192.168.10.114:/root/.ssh/
authorized_keys 파일 생성
ssh-copy-id root@192.168.10.111
---
ssh-copy-id root@192.168.10.114
Unison 설정 파일 생성
Unison의 설정 파일을 생성하여 동기화할 디렉토리와 옵션을 지정합니다.
node1 서버에서 설정 파일 작성
sudo mkdir ~/.unison
로그 및 아카이브 디렉토리 생성
sudo mkdir -p /var/log/unison/backupdir
데이터 디렉토리 생성
sudo mkdir -p /app/www
cd ~/.unison
vim default.prf
# Unison profile
# 동기화할 디렉토리
root = /app/www
# 원격 디렉토리
root = ssh://root@192.168.10.114//app/www
# 동기화 옵션
auto = true
batch = true
confirmbigdel = false
# 동기화 시 출력되는 로그
log = true
logfile = /var/log/unison/unison.log
- root = /app/www : A 서버의 로컬 디렉토리.
- root = ssh://root@192.168.0.114//app/www : node2 서버의 원격 디렉토리. root는 node2 서버의 사용자 이름입니다.
- auto = true : 자동으로 동기화를 수행합니다.
- batch = true : 사용자 확인 없이 동기화합니다.
- confirmbigdel = false : 많은 파일이 삭제될 때 확인을 생략합니다.
- log = true : 동기화 작업의 로그를 기록합니다.
node2 서버에서 설정 파일 작성
sudo mkdir ~/.unison
sudo mkdir -p /var/log/unison/backupdir
sudo mkdir -p /app/www
cd ~/.unison
sudo vim default.prf
# Unison profile
# 동기화할 디렉토리
root = /app/www
# 원격 디렉토리
root = ssh://root@192.168.10.111//app/www
# 동기화 옵션
auto = true
batch = true
confirmbigdel = false
# 동기화 시 출력되는 로그
log = true
logfile = /var/log/unison/unison.log
- root = ssh://root@192.168.10.111//app/www : node1 서버의 원격 디렉토리. root는 node1 서버의 사용자 이름입니다.
Unison 동기화 실행
Unison을 실행하여 동기화를 시작합니다.
unison default
동기화 테스트 실행
sync1.txt 파일을 생성 후 동기화를 실행합니다.
root@node1:~$ cd /app/www
root@node1:~$ touch sync1.txt
root@node1:~$ unison default
Unison 2.51.5 (ocaml 4.13.1): Contacting server...
Connected [//node1//app/www -> //node2//app/www]
Looking for changes
Waiting for changes from server
Reconciling changes
new file ----> sync1.txt
Propagating updates
Unison 2.51.5 (ocaml 4.13.1) started propagating changes at 15:46:47.46 on 28 Aug 2024
[BGN] Copying sync1.txt from /app/www to //node2//app/www
[END] Copying sync1.txt
Unison 2.51.5 (ocaml 4.13.1) finished propagating changes at 15:46:47.48 on 28 Aug 2024, 0.013 s
Saving synchronizer state
Synchronization complete at 15:46:47 (1 item transferred, 0 skipped, 0 failed)
root@node2:~$ ls /app/www
sync1.txt
자동 동기화 설정(선택 사항)
Unison을 자동으로 실행하도록 설정할 수 있습니다.
cron을 사용하여 정기적으로 동기화를 실행하도록 설정할 수 있습니다.
- 매시간 unison default 명령어를 실행하여 동기화를 수행합니다.
crontab -e
0 * * * * /usr/bin/unison default
inotify-tools 설치
inotify-tools는 파일 시스템 이벤트를 감지하는 도구입니다.
inotify-tools를 설치합니다.
sudo apt-get install -y inotify-tools
실시간 동기화를 위한 스크립트 작성
inotifywait를 사용하여 파일 시스템 이벤트를 감지하고 이벤트 발생 시 Unison을 실행하도록 설정합니다.
node1 서버에서 스크립트 작성
sudo vim /usr/local/bin/unison-sync.sh
#!/bin/bash
# 기본 설정
DEFAULT_PROFILE="default.prf"
DEFAULT_LOGFILE="/var/log/unison/unison.log"
SYNC_DIR="/app/www"
# 로그 파일 디렉토리 생성 (없을 경우)
mkdir -p "$(dirname "$DEFAULT_LOGFILE")"
# 동기화 상태 추적 파일
SYNC_STATUS_FILE="/tmp/unison_sync_status.lock"
# inotifywait를 사용하여 파일 시스템 이벤트 감지
inotifywait -m -r -e modify,create,delete "$SYNC_DIR" | while read -r directory events filename
do
echo "$(date '+%Y-%m-%d %H:%M:%S') - Change detected: $events $filename" >> "$DEFAULT_LOGFILE"
# 동기화 상태 파일 확인
if [ -e "$SYNC_STATUS_FILE" ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') - Unison already running, skipping sync." >> "$DEFAULT_LOGFILE"
continue
fi
# 동기화 상태 파일 생성
touch "$SYNC_STATUS_FILE"
# Unison 동기화 실행
if ! unison "$DEFAULT_PROFILE" >> "$DEFAULT_LOGFILE" 2>&1; then
echo "$(date '+%Y-%m-%d %H:%M:%S') - Unison failed." >> "$DEFAULT_LOGFILE"
fi
# 동기화 상태 파일 삭제
rm -f "$SYNC_STATUS_FILE"
done
sudo chmod +x /usr/local/bin/unison-sync.sh
/usr/local/bin/unison-sync.sh &
node2 서버에서 스크립트 작성
sudo vim /usr/local/bin/unison-sync.sh
#!/bin/bash
# 기본 설정
DEFAULT_PROFILE="default.prf"
DEFAULT_LOGFILE="/var/log/unison/unison.log"
SYNC_DIR="/app/www"
# 로그 파일 디렉토리 생성 (없을 경우)
mkdir -p "$(dirname "$DEFAULT_LOGFILE")"
# 동기화 상태 추적 파일
SYNC_STATUS_FILE="/tmp/unison_sync_status.lock"
# inotifywait를 사용하여 파일 시스템 이벤트 감지
inotifywait -m -r -e modify,create,delete "$SYNC_DIR" | while read -r directory events filename
do
echo "$(date '+%Y-%m-%d %H:%M:%S') - Change detected: $events $filename" >> "$DEFAULT_LOGFILE"
# 동기화 상태 파일 확인
if [ -e "$SYNC_STATUS_FILE" ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') - Unison already running, skipping sync." >> "$DEFAULT_LOGFILE"
continue
fi
# 동기화 상태 파일 생성
touch "$SYNC_STATUS_FILE"
# Unison 동기화 실행
if ! unison "$DEFAULT_PROFILE" >> "$DEFAULT_LOGFILE" 2>&1; then
echo "$(date '+%Y-%m-%d %H:%M:%S') - Unison failed." >> "$DEFAULT_LOGFILE"
fi
# 동기화 상태 파일 삭제
rm -f "$SYNC_STATUS_FILE"
done
sudo chmod +x /usr/local/bin/unison-sync.sh
/usr/local/bin/unison-sync.sh &
자동 실행 설정(선택 사항)
서버 재부팅 시 자동으로 스크립트를 실행하도록 하려면 systemd 서비스를 설정할 수 있습니다.
서비스 파일 생성
sudo vim /etc/systemd/system/unison-sync.service
[Unit]
Description=Unison Real-time Sync Service
After=network.target
[Service]
ExecStart=/usr/local/bin/unison-sync.sh
Restart=always
User=root
Group=root
[Install]
WantedBy=multi-user.target
서비스 등록 및 시작
sudo systemctl daemon-reload
sudo systemctl enable unison-sync
sudo systemctl start unison-sync
sudo systemctl restart unison-sync
sudo systemctl status unison-sync
참고URL
- GitHub repository : Unison File Synchronizer
- GitHub repository : Unison Release
'리눅스' 카테고리의 다른 글
우분투에서 시스템을 업데이트하는 방법 (0) | 2024.08.30 |
---|---|
Kubernetes Dashboard 설치 (0) | 2024.08.29 |
우분투에서 IPv6를 영구적으로 비활성화하는 방법 (0) | 2024.08.28 |
journal 로그를 확인하고 삭제하는 방법 (0) | 2024.08.26 |
쿠버네티스 kube-proxy와 CNI 플러그인의 차이 (0) | 2024.08.21 |