| lsyncd로 서버간 파일을 실시간으로 동기화해보자. | 작성일 : 2009/12/08 19:22 |
| 조회수 : 42760 |
|
제 목 : lsyncd로 서버간 파일을 실시간으로 동기화해보자. 작성자 : 좋은진호(truefeel, http://coffeenix.net/ ) 작성일 : 2009.12.4(금) 수정일 : 2009.12.7(월) 퍼미션까지 동기화 추가 수정일 : 2009.12.13(일) '5. 주의할 점' 추가 - 거의 실시간으로 서버간의 파일 동기화가 필요한 경우라면 어떻게 해야할까? - 실시간으로 백업을 하고 싶다면? 서버간의 파일 동기화를 위해서는 3가지 방법을 생각해볼 수 있다. 1. NFS를 이용한다. 2. A, B, C서버를 동기화하려고 할 때, 원본 데이터를 D서버(배포용 서버)에 넣어둔다. 그리고 D 서버에서 A, B, C서버로 rsync, makuosan툴 등으로 동기화 한다. (D 서버 -> A, B, C 서버로 동기화) 3. DRBD(Distributed Replicated Block Device)를 구축한다. 1. lsyncd 동기화 툴 위의 방법을 이용하지 않고, 한 서버의 변경사항을 다른 서버로 실시간으로 동기화시키는 흥미로운 툴이 있다. 바로 실시간 싱크 프로그램인 lsyncd이 그 주인공. lsyncd - Live Syncing (Mirror) Daemon http://code.google.com/p/lsyncd/ 1) lsyncd의 원리는 간단하다. - 리눅스 커널의 inotify로 파일시스템의 변경사항을 체크한다. (판단은 inotify로) - 변경사항이 생기자마자, rsync를 호출하여 상대 서버로 싱크를 해준다. (동기화는 rsync로) inotify는 리눅스 커널에 포함된 기능으로, 파일시스템에 변경사항이 발생할 때 이벤트를 통보해준다. 이 inotify를 이용하게 되면, 파일 변경사항을 수시로 파악할 필요없이 가만히 앉아있으면 된다. 파일이 바뀔 때 커널에서 통보해주는 신호를 덥석 받아먹으면 되기 때문이다. 0.5초(0.5초는 그만큼 짧다는 것을 표현하기 위해서 사용했음)도 안되는 아주 짧은 시간 동안의 차이는 생길 수 있지만, 소규모 서버를 운영할 경우에는 무리가 없을 것으로 보인다. 2) 원본 서버와 동기화 대상 서버(target)간의 구조 ![]() - 원본 데이터가 있는 서버(1대의 서버)에는 lsyncd 데몬(lsyncd 데몬 + rsync 클라이언트)이 동작하게 되고, - 동기화 대상 서버(다수의 서버)에는 rsync 데몬(rsync 서버)이 띄워져 있어야 한다. 3) lsyncd master서버에서 필요 환경은 다음과 같다. 대상 서버는 rsync만 동작하면 OS종류, 버전에 상관없다. - Linux Kernel 2.6.13 이상 (inotify를 위해) - rsync 프로그램 - lsyncd 컴파일을 위해서 libxml2가 필요하다. CentOS : libxml2-devel 패키지 Ubuntu : libxml2-dev 패키지 4) 어떤 경우 유용할까?
2. lsyncd를 이용한 실시간 동기화 기본 형식은 다음과 같다.
다음은 간단한 사용 예이다. lsyncd은 rsync를 사용하여 동기화하므로, TARGET은 rsync처럼 1) 로컬 디렉토리를 지정할 수도 있으며, 2) 원격지의 rsync 경로도 가능하다. TARGET을 다수 지정하게 되면 여러 서버로 실시간 동기화가 이뤄진다.
lsyncd는 기본적으로 daemon형태로 실행되며, /var/log/lsyncd 파일에 로그가 저장된다. 다음은 테스트를 위해서 --no-daemon옵션을 넣고 실행했다. 로그를 살펴보면 다음과 같은 사항을 파악할 수 있다.
다음은 TARGET을 2곳으로 지정했을 때 동기화 결과이다.
3. lsyncd config 파일 lsyncd.conf 샘플 설정 파일이다. * lsyncd.conf 샘플 내려받기
<settings> 의 설정에는 다음 항목들이 있다.
<directory> 은 따로 설명하지 않아도 바로 이해가 될 것이다. 대상 서버가 많으면 쭈욱 나열해주면 된다.
4. lsyncd 깊이 알기 1) 특정 서브 디렉토리나 파일을 제외(exclude)하려면? lsyncd는 동기화에서 제외할 디렉토리 목록을 '--exclude-from FILE' 옵션으로 지정할 수 있다. lsyncd_exclude.lst 파일에 아래 내용을 넣으면 2개 디렉토리를 제외하게 된다. 특정 파일만 제외할 수는 없다. 디렉토리만 지정이 가능하다. 제외한 디렉토리는 rsync할 때 제외되는 것이 아니라, inotify의 모니터링 대상 자체에서 빠진다. 빠진 디렉토리수(서브디렉토리도 있다면 그 것도 포함)만큼 'Entering normal operation with [??] monitored directories' 로그에 남으니, 계산해보면 확인이 될 것이다.
config파일에서 설정하려면 다음과 같이 한다.
디렉토리가 아닌 파일을 동기화 대상에서 제외하려면 어떻게 해야할까? rsync 옵션을 활용해야 한다. rsync의 --exclude-from=FILE 옵션이 있다. 파일(예. lsyncd_file_exclude.lst) 에 제외할 파일목록을 넣는다. 그리고, config 파일의 rsync옵션부분에 다음을 추가하면 된다.
파일 제외할 때 주의할 것은 서브 디렉토리에 같은 파일명이 있을 때도 제외될 수 있다. 만약 lsyncd_file_exclude.lst에 cnx.doc 을 지정했다고 하자. 그러나 우연찮게 lib/cnx.doc 파일이 실제 존재할 때 lib/cnx.doc 파일이 변경되어도 동기화 안될 수 있다. 2) 퍼미션, 소유자까지 변경하려면? lsyncd는 퍼미션과 소유자의 변경은 무시하도록 되어 있다. debug 모드로 살펴보면 로그에 다음과 같이 남는다.
파일 속성 변경까지 동기화하기 위해서는 lsyncd.c 소스 수정이 필요하다. 1131번째줄에서 IN_ATTRIB를 추가해주면 파일속성 변경시 동기화된다.
그리고, config파일에서 rsync 옵션 변경이 필요하다. <callopts> 에서 <option text="-lt%r"/> 대신 <option text="-ltogp%r"/>로 변경한다. o는 소유자 유지, g는 소유그룹 유지, p는 퍼미션 유지. 3) lsyncd가 rsync를 어떻게 호출하는지 궁금하다? lsyncd가 실행되는 서버에서 다음 스크립트를 실행한다. 파일변경시 즉시 실행되는 rsync 명령을 확인할 수 있다.
rsync가 호출되는 순간에 다음과 같이 화면에 출력될 것이다.
4) rsync 대신 다른 동기화 프로그램 호출 lsyncd는 rsync의 경로를 --binary 옵션이나 config에서 설정할 수 있다. 따라서 이 경로를 수정하게 되면 rsync를 직접 호출하지 않고, 스크립트를 통해 호출할 수가 있다. 그래서 동기화할 때 ① 원하는 명령을 실행할 수도 있고, ③ rsync 대신 다른 동기화 프로그램도 사용할 수가 있게 된다. 일본 KLAB에서 만든 동기화 툴인 Makuosan( http://lab.klab.org/wiki/Makuosan )이 있다. 이 툴은 동기화 서버가 1대이든 몇십대이든 속도 저하없이 거의 동시에 동기화된다. 이 툴을 이용하여 스크립트를 만든다면 재밌는 조합( lsyncd + Makuosan )이 될 것이다. 실시간 파일 변경 판단은 lsyncd로 하고, 동기화는 빠른 Makuosan로 이뤄지는 것이다. 참고로 rsync를 스크립트로 만든 경우는 http://code.google.com/p/lsyncd/wiki/HowToExecAfter 를 읽어보기 바란다. 5. 주의할 점
lsyncd는 기본적으로 소유자와 퍼미션 변경은 동기화하지 않는다. 속성 변경까지 동기화하기 위해서는 '4. lsyncd 깊이 알기'의 '2) 퍼미션, 소유자까지 변경하려면?'를 살펴보기 바란다. ※ '범냉이'의 제안으로 '주의할 점' 추가함. 6. 참고 자료 * lsyncd wiki http://code.google.com/p/lsyncd/w/list * inotify로 파일 시스템 활동 감시하기 http://www.ibm.com/developerworks/kr/library/l-ubuntu-inotify/index.html * inotify http://ko.wikipedia.org/wiki/Inotify * Rsync를 이용한 데이터 미러링 구축 (2004.1, 글 굿스피드) http://coffeenix.net/board_view.php?bd_code=166 * rsync의 write only 기능(쓰기만 가능한 설정) (2004.12, 글 좋은진호) http://coffeenix.net/board_view.php?bd_code=616 * 자료를 다른 파티션으로 그대로 백업(rsync이용) (2003.10, 글 좋은진호) http://coffeenix.net/board_view.php?bd_code=88 * rsync 활용(대역폭제한, 날짜별sync 등) (2006.6, 글 좋은진호) http://coffeenix.net/board_view.php?bd_code=1418 |
||||||||||||||||||||||||||||||||||||||||
|
|