Lsyncd 설치 및 설정에 대해서 알려드리겠습니다,
알려드리기 전! Lsyncd가 무엇인지 알고 계신가요?
🔎 Lsyncd란?
Lsyncd는 time synchronization progrem for Linux의 약자로,
Lsyncd를 이용하여 각자의 서버에 data를 저장하고 동기화 할 수 있습니다.

Lsync는 파일 동기화를 자동화하기 위한 오픈소스 도구이며, 변경된 파일을 실시간으로
감지 후 대상 디렉터리와 동기화 하는 기능을 제공하여 관리자가 수동으로 파일을 복사
또는 동기화 하는 일을 줄여줍니다.
간단한 설정으로 특정 디렉터리 또는 확장자 단위로 파일을 동기화 할 수 있으며, 변경된 파일 또는 디렉토리만을 대상으로 동기화하여 자원을 효율적으로 관리 할 수 있습니다. 백업, 웹 소스 동기화 등 다양한 용도로 활용할 수 있어 데이터 관리와 운영에 많은 도움을 주는 도구입니다.
간단한 작동 원리는 파일 시스템 이벤트를 모니터링 하는데 사용되는 시스템 기능 중
하나인 inotify가 파일이나 디렉터리 변경에 대한 부분을 실시간으로 체크하고
rsync를 호출하여 파일 동기화를 합니다.
▶ 주의
‘lsyncd’를 사용하여 파일 동기화를 설정할 때에는 사용자 홈 디렉터리, 데이터 디렉터리
등과 같이 시스템 설정과 관련이 적은 안정적인 경로에 설정하는 것을 권장합니다.
시스템 디렉터리에 대한 동기화는 신중한 검토가 필요하며, 시스템의 안정성과 보안을
유지하기 위해 조심스럽게 다뤄져야 합니다.
▶ 작업 환경
– OS : Rocky 8.8
– IP : 192.168.1.20(node1), 192.168.1.40(node2)
▶ 필요 패키지
– epel 저장소, lsyncd, lua, rsync
– 보내는 대상은 lsyncd, rsync, lua가 무조건 설치 되어야 하고,
– lsyncd 설치하면 종속 패키지인 나머지 두개는 같이 설치가 됩니다.
– 받는 대상은 단방향일 경우 rsync만 설치 되어 있으면 됩니다.
▶ 패키지 설치

# yum install epel-release
### epel 저장소 추가
# yum install lsyncd
▶ SSH 키 생성
– # 단방향 (node1에서 node2 복사) 설정의 경우 SSH 키 생성은
– node1에서만 만들어서 node2로 복사해주면 됩니다.
– # 양방향 (node1과 node2 양방향 복사) 설정의 경우 SSH 키 생성은
– node1, node2 두 서버에서 키 생성 후 서로 키를 복사해주면 됩니다.
– ssh-keygen으로 두 서버 모두 SSH 키 생성(node1 에서 node2로
– 단방향 복사인 경우 node1에서만 진행하면 됩니다.

# ssh-keygen ### 명령어 입력 후
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
### key에 대한 패스워드 생성 여부(엔터 시 설정 X)
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:eIdjfskXPqMOfSkeoei16WFSwJspLnEFr5CWHdtEpc8 root@node1
The key's randomart image is:
+---[RSA 3072]----+
| o.o.. |
| + O . |
| = o B |
| . . o O . |
| . + = E o . |
| + . * * + o |
| . . o B B B |
| . . + B * o |
| ..+.+ |
+----[SHA256]-----+
node1의 id_rsa.pub 키 값을 node2의 authorized_keys에 등록하여
대상 서버에 패스워드를 입력하지 않고 접속 가능하도록 설정합니다.

# cat /root/.ssh/id_rsa.pub | ssh -p 22 root@’192.168.1.40’ "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
▶ lsyncd.conf 간단 설명
(Lua로 작성되어 있으며 주석 필요 시 맨앞에 ‘–‘ 하이픈 두개 넣으면 됩니다.)

# vi /etc/lsyncd.conf
settings {
logfile="/var/log/lsyncd.log", ### 로그 경로
statusFile="/var/log/lsyncd-status.log", ### 상태 로그
insist="true" ### lsyncd가 비정상적으로 종료 시 재시작하여 동기화를 유지 시키는 옵션
}
sync {
default.rsyncssh,
source="/My_PATH/", ### 동기화 시킬 디렉터리
host="Remote_IP", ### 동기화 할 대상 서버의 IP
targetdir="Remote_PATH", ### 동기화 할 대상 서버의 디렉터리 경로
delay=1, ### 파일 추가 및 수정 후 딜레이 설정 값 만큼 대기 후 동기화 진행
delete=true, ### 삭제 동기화, false로 설정 시 원본 서버에서는 삭제되어도 대상 서버에서는 삭제되지 않음
exclude = { ### 동기화에서 제외
"/exclude_data/", ### 경로 제외 : source("/My_PATH/")의 하위 경로
"*.sh", ### 확장자 단위 설정 가능
"*.txt"
},
rsync = {
archive = true, ### 파일 속성(권한) 동기화
compress = false, ### 파일을 압축하여 전송
verbose = false ### 로그 자세하게 작성 : 파일 동기화 작업이 많거나 큰 용량의 파일을 처리할 때 로그가 많이 쌓일 수 있음
}
}
node2의 웹소스 경로 /var/www/html/ 를 동기화 하기 위해 아래와 같이 설정하고,
동기화 경로의 .txt, .sh 파일 및 하위 ~/own 디렉터리는 동기화 하지 않게 설정합니다.

# vi /etc/lsyncd.conf
settings {
logfile="/var/log/lsyncd.log", ### 로그 경로
statusFile="/var/log/lsyncd-status.log", ### 상태 로그
insist="true"
### lsyncd가 비정상적으로 종료 시 재시작하여 동기화를 유지시키는 옵션
}
sync {
default.rsyncssh,
source="/var/www/html/", ### 동기화 시킬 디렉터리
host="192.168.1.40", ### 동기화 할 대상 서버의 IP
targetdir="/var/www/html", ### 동기화 할 대상 서버의 디렉터리 경로
delay=1, ### 파일 추가 및 수정 후 딜레이 설정 값 만큼 대기 후 동기화 진행
delete=true,
### 삭제 동기화, false로 설정 시 원본 서버에서는 삭제되어도 대상 서버에서는 삭제되지 않음
exclude = { ### 동기화에서 제외
"/own/", ### 경로 제외 : source("/My_PATH/")의 하위 경로
"*.sh", ### 확장자 단위 설정 가능
"*.txt"
},
rsync = {
archive = true, ### 파일 속성(권한) 동기화
compress = false, ### 파일을 압축하여 전송
verbose = false
### 로그 자세하게 작성 : 파일 동기화 작업이 많거나 큰 용량의 파일을 처리할 때 로그가 많이 쌓일 수 있음
}
}
▶ 서비스 시작 및 서비스 체크

# systemctl start lsyncd
# systemctl status lsyncd
● lsyncd.service - Live Syncing (Mirror) Daemon
Loaded: loaded (/usr/lib/systemd/system/lsyncd.service; disabled; vendor preset: disabled)
Active: active (running) since Wed 2023-11-22 13:12:28 KST; 6min ago
Main PID: 214943 (lsyncd)
Tasks: 1 (limit: 23492)
Memory: 536.0K
CGroup: /system.slice/lsyncd.service
└─214943 /usr/bin/lsyncd -nodaemon /etc/lsyncd.conf
11월 22 13:12:28 node1 systemd[1]: Started Live Syncing (Mirror) Daemon.
▶ node1 동기화 경로 하위 디렉터리 및 파일 생성

[root@node1 html]# pwd
/var/www/html
[root@node1 html]# mkdir own sync_test
[root@node1 html]# touch exclude_test.sh exclude_test.txt exclude_test.zip
[root@node1 html]# ll
합계 0
-rw-r--r-- 1 root root 0 11월 22 13:34 exclude_test.sh
-rw-r--r-- 1 root root 0 11월 22 13:34 exclude_test.txt
-rw-r--r-- 1 root root 0 11월 22 13:43 exclude_test.zip
drwxr-xr-x 2 root root 6 11월 22 13:34 own
drwxr-xr-x 2 root root 6 11월 22 13:34 sync_test
▶ node 1 상태 로그 확인

# vi /var/log/lsyncd-status.log
Lsyncd status report at Wed Nov 22 13:35:16 2023
Sync1 source=/var/www/html/
There are 0 delays
Excluding: ### 예외 목록
*.txt
/own/
*.sh
Inotify watching 2 directories ### Inotify가 현재 두개의 경로를 모니터링 중
1: /var/www/html/
2: /var/www/html/sync_test/
▶ node2 동기화 확인
node1의 예외 부분 제외 동기화 완료 된 것을 확인할 수 있습니다.

[root@node2 ~]# cd /var/www/html/
[root@node2 html]# pwd
/var/www/html
[root@node2 html]# ll
합계 0
-rw-r--r-- 1 root root 0 11월 22 13:43 exclude_test.zip
drwxr-xr-x 2 root root 6 11월 22 13:34 sync_test
오늘은 Lsyncd 설치 및 설정, 실시간 데이터 동기화 하는 방법에 대해서 말씀드렸습니다.
Lsyncd는 파일 동기화를 감시하고,
변경이 발생했을 시 실시간으로 동기화 할 수 있는 도구라는 점!
참고하시어 안전하게 기업 운영을 하시길 바랍니다!
추가적으로 궁금하신점이 있으시다면!
홈페이지 문의하기 or 기술 블로그에 댓글👇을 남겨주세요!
아이티이지는 앞으로도 안정적인 서비스와 더 좋은 서비스를 제공하기 위해 노력하겠습니다.
IT is easy, ITEASY!
