커피닉스, 시스템 엔지니어의 쉼터 커피향이 나는 *NIX
커피닉스
시스템/네트웍/보안을 다루는 곳
* HanIRC의 #coffeenix 방
[ 장비 및 회선 후원 ]
HOME > 시스템 관리 / 서버운영 도움말
검색 : 사이트 WHOIS 웹서버 종류

최적화 / 튜닝 / 성능개선 (6, 글 1, 자료 3)
디스크 쿼터(quota) (3, 글 1, 자료 3)
디스크 관리 / 파일시스템 / mount (34, 글 13, 자료 12)
백업(backup) / 시스템 복구 (14, 글 6, 자료 11)
서버운영 (8, 글 2, 자료 9)
프린터 관리 / 프린팅 (7)
패키지 관리 / 패치 / rpm (10, 글 5, 자료 1)
부팅, boot / LILO / GRUB (10, 글 5, 자료 9)
서버 모니터링 (10, 글 5, 자료 2)
로그인 / 로그아웃 (1)
로그(log) / syslog (5, 글 3, 자료 3)
메모리, 스왑(swap), 램디스크(ramdisk) (3, 글 2)
사용자 관리(계정 관리) (1, 자료 1)

  lsyncd로 서버간 파일을 실시간으로 동기화해보자. 작성일 : 2009/12/08 19:22
 
  • 글쓴이 : 좋은진호 ( http://coffeenix.net/ )
  • 조회수 : 42706
          [ 이전화면 / 수정 ]   비밀번호 :     인쇄용 화면
      제  목 : 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) 어떤 경우 유용할까?


    • 소규모 사이트에서 NFS대신하여 동기화를 고민할 때. (단, 파일이 너무 많으면 동기화가 늦어질 수 있음)
    • 실시간 백업이 필요할 때.
    • 대규모 웹사이트에서 메인페이지나 대메뉴의 첫페이지 등 유저 접속이 많다.
      이 페이지에서 실시간으로 변경되는 데이터를 매번 DB접속하여 처리하는 것은 좋지 않다.
      실시간 데이터를 1분 또는 더 짧은 간격으로 텍스트로 저장하고, 변경이 되자마자 자동 동기화 되도록 처리할 때.
      규모가 크면 1차 master -> 2차 여러대의 master -> 상당수의 서비스 서버의 구조가 될 수도 있다.



    2. lsyncd를 이용한 실시간 동기화

    기본 형식은 다음과 같다.

     
    lsyncd [SOURCE] [TARGET 1] [TARGET 2] ....
     


    다음은 간단한 사용 예이다. lsyncd은 rsync를 사용하여 동기화하므로, TARGET은 rsync처럼 1) 로컬 디렉토리를 지정할 수도 있으며, 2) 원격지의 rsync 경로도 가능하다. TARGET을 다수 지정하게 되면 여러 서버로 실시간 동기화가 이뤄진다.

     
    # ./lsyncd /home/cnx/ /data/backup/
    # ./lsyncd /home/cnx/ 192.168.123.3::backup/
    # ./lsyncd /home/cnx/ 192.168.123.3::backup/ 192.168.123.4::backup/
     


    lsyncd는 기본적으로 daemon형태로 실행되며, /var/log/lsyncd 파일에 로그가 저장된다. 다음은 테스트를 위해서 --no-daemon옵션을 넣고 실행했다. 로그를 살펴보면 다음과 같은 사항을 파악할 수 있다.


    • 어디에서 어디로 동기화가 되는지 확인할 수 있다. ( syncing /home/cnx/ -> 192.168.123.3::backup/ )
    • 16개 디렉토리( /home/cnx/ + 15개의 서브디렉토리 )를 모니터링한다. ( [16] monitored directories )
    • truefeel.txt 파일이 생성되자마자 rsync를 호출하여 동기화된다.
    • 서브 디렉토리( /home/cnx/docs/ ) 내의 파일이 변경된 경우 그 디렉토리만 동기화한다. ( rsyncing /home/cnx/docs/ --> 192.168.123.3::backup/docs/ ) 전체 디렉토리를 동기화하지 않기 때문에 그 만큼 동기화 시간이 빨라진다.


     
    # ./lsyncd --no-daemon /home/cnx/ 192.168.123.3::backup/
    Fri Dec  4 18:13:13 2009: command line options: syncing /home/cnx/ -> 192.168.123.3::backup/

    Fri Dec  4 18:13:13 2009: Starting up
    Fri Dec  4 18:13:13 2009: watching /home/cnx/
    Fri Dec  4 18:13:13 2009: found new directory: ?????? in /home/cnx/ -- added on tosync stack.
    Fri Dec  4 18:13:13 2009: found new directory: ?????? in /home/cnx/ -- added on tosync stack.
    ... 생략 ...
    Fri Dec  4 18:13:13 2009: --- Entering normal operation with [16] monitored directories ---
    Fri Dec  4 18:14:40 2009: event CREATE:truefeel.txt triggered.
    Fri Dec  4 18:14:40 2009: rsyncing /home/cnx/ --> 192.168.123.3::backup/
    Fri Dec  4 18:14:40 2009: event CLOSE_WRITE:truefeel.txt triggered.
    Fri Dec  4 18:14:40 2009: rsyncing /home/cnx/ --> 192.168.123.3::backup/
    Fri Dec  4 18:16:22 2009: event CREATE:vimcheatsheet.pdf triggered.
    Fri Dec  4 18:16:22 2009: rsyncing /home/cnx/docs/ --> 192.168.123.3::backup/docs/
    Fri Dec  4 18:16:22 2009: event CLOSE_WRITE:vimcheatsheet.pdf triggered.
    Fri Dec  4 18:16:22 2009: rsyncing /home/cnx/docs/ --> 192.168.123.3::backup/docs/
     


    다음은 TARGET을 2곳으로 지정했을 때 동기화 결과이다.

     
    Fri Dec  4 19:04:37 2009: event CREATE:cnx.txt triggered.
    Fri Dec  4 19:04:37 2009: rsyncing /home/cnx/ --> 192.168.123.3::backup/
    Fri Dec  4 19:04:37 2009: rsyncing /home/cnx/ --> 192.168.123.4::backup/
    Fri Dec  4 19:04:37 2009: event CLOSE_WRITE:cnx.txt triggered.
    Fri Dec  4 19:04:37 2009: rsyncing /home/cnx/ --> 192.168.123.3::backup/
    Fri Dec  4 19:04:37 2009: rsyncing /home/cnx/ --> 192.168.123.4::backup/
     



    3. lsyncd config 파일

    lsyncd.conf 샘플 설정 파일이다.

    * lsyncd.conf 샘플 내려받기
     
    <lsyncd version="1">

    <settings>
       <!--uncomment to log all debug messages.-->
       <!--debug/-->
       
       <!--uncomment to log only errors.-->
       <!--scarce/-->
       
       <!--uncomment to not detach, log to stdout/stderr.-->
       <!--no-daemon/-->

       <!--uncomment to not call any actions, run dry only.-->
       <!--dryrun/-->

       <!--uncomment to exclude file handled to rsync.-->
       <!--exclude-from filename="/tmp/exclude"/-->

       <logfile      filename="/var/log/lsyncd"/>
       <binary       filename="/usr/bin/rsync"/>
       <!--pidfile      filename="/var/run/lsyncd.pid"/-->

       <callopts>
          <option text="-ltogp%r"/>
          <option text="--delete"/>
          <exclude-file/>
          <source/>
          <destination/>
       </callopts>
    </settings>

    <directory>
       <source path="/home/cnx/"/>
       <target path="192.168.123.3::backup/"/>
       <target path="192.168.123.4::backup/"/>
    </directory>

    </lsyncd>
     


    <settings> 의 설정에는 다음 항목들이 있다.


    • debug     : debug mode로 실행한다. 상세한 로그가 남는다. 적용하려면 <debug/> 처럼 설정한다.
    • scarce    : debug와는 반대되는 개념. 에러만 로그에 남긴다.
    • no-daemon : 데몬형태로 실행하지 않으며, 로그는 화면에 바로 출력된다.
    • dryrun    : 실제 적용하지는 않는다 어떻게 동작하는지 로그에만 남기고, 동기화(rsync)는 실행하지 않는다.
    • exclude-from : 제외할 목록이 들어있는 파일명을 지정한다.
    • logfile   : 로그 파일명
    • binary    : rsync의 경로
    • pidfile   : PID 파일명
    • callopts  : rsync 호출할 때 사용할 옵션을 지정한다.


    <directory> 은 따로 설명하지 않아도 바로 이해가 될 것이다. 대상 서버가 많으면 쭈욱 나열해주면 된다.

     
    # ./lsyncd --conf lsyncd.conf
     



    4. lsyncd 깊이 알기

    1) 특정 서브 디렉토리나 파일을 제외(exclude)하려면?

    lsyncd는 동기화에서 제외할 디렉토리 목록을 '--exclude-from FILE' 옵션으로 지정할 수 있다. lsyncd_exclude.lst 파일에 아래 내용을 넣으면 2개 디렉토리를 제외하게 된다. 특정 파일만 제외할 수는 없다. 디렉토리만 지정이 가능하다. 제외한 디렉토리는 rsync할 때 제외되는 것이 아니라, inotify의 모니터링 대상 자체에서 빠진다. 빠진 디렉토리수(서브디렉토리도 있다면 그 것도 포함)만큼 'Entering normal operation with [??] monitored directories' 로그에 남으니, 계산해보면 확인이 될 것이다.

     
    doc/
    photo/
     


    config파일에서 설정하려면 다음과 같이 한다.

     
    <exclude-from filename="/etc/lsyncd_exclude.lst"/>
     


    디렉토리가 아닌 파일을 동기화 대상에서 제외하려면 어떻게 해야할까? rsync 옵션을 활용해야 한다. rsync의 --exclude-from=FILE 옵션이 있다. 파일(예. lsyncd_file_exclude.lst) 에 제외할 파일목록을 넣는다. 그리고, config 파일의  rsync옵션부분에 다음을 추가하면 된다.

     
    <option text="--exclude-from=/etc/lsyncd_file_exclude.lst"/>
     


    파일 제외할 때 주의할 것은 서브 디렉토리에 같은 파일명이 있을 때도 제외될 수 있다. 만약 lsyncd_file_exclude.lst에 cnx.doc 을 지정했다고 하자. 그러나 우연찮게 lib/cnx.doc 파일이 실제 존재할 때 lib/cnx.doc 파일이 변경되어도 동기화 안될 수 있다.

    2) 퍼미션, 소유자까지 변경하려면?

    lsyncd는 퍼미션과 소유자의 변경은 무시하도록 되어 있다. debug 모드로 살펴보면 로그에 다음과 같이 남는다.

     
    Fri Dec  4 19:13:18 2009: inotfy event: ATTRIB:cnx.txt
    Fri Dec  4 19:13:18 2009: ... ignored this event.
    Fri Dec  4 19:13:18 2009: Processing through tosync stack.
    Fri Dec  4 19:13:18 2009: being done with tosync stack
     


    파일 속성 변경까지 동기화하기 위해서는 lsyncd.c 소스 수정이 필요하다. 1131번째줄에서 IN_ATTRIB를 추가해주면 파일속성 변경시 동기화된다.

     
            if ((IN_CREATE | IN_CLOSE_WRITE | IN_DELETE |
                 IN_MOVED_TO | IN_MOVED_FROM | IN_ATTRIB ) & event->mask
     


    그리고, config파일에서 rsync 옵션 변경이 필요하다. <callopts> 에서 <option text="-lt%r"/> 대신 <option text="-ltogp%r"/>로 변경한다. o는 소유자 유지, g는 소유그룹 유지, p는 퍼미션 유지.

    3) lsyncd가 rsync를 어떻게 호출하는지 궁금하다?

    lsyncd가 실행되는 서버에서 다음 스크립트를 실행한다. 파일변경시 즉시 실행되는 rsync 명령을 확인할 수 있다.

     
    #!/bin/bash

    while [ 1 ]
    do
       date +'%H:%M:%S'
       ps auxww|grep [r]sync
       sleep 0.05
    done
     


    rsync가 호출되는 순간에 다음과 같이 화면에 출력될 것이다.

     
    19:19:46
    19:19:46
    root      4076  0.0  0.0   5812  1036 ?        S    19:19   0:00 /usr/bin/rsync -ltogpd --delete /home/cnx/docs/ 192.168.123.3::backup/docs/
     


    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. 주의할 점

    • DB 파일, log 파일처럼 파일이 계속 active된 상태로 변경되는 디렉토리에는 사용하지 않는다.
    • 파일 변화가 상당히 잦을 디렉토리에는 사용하지 않는다.
    • 한 개의 디렉토리 내에 파일이 너무 많으면 동기화가 느려질 수 있다.
    • 파일이 큰 파일(몇 백메가 또는 몇 기가)이 변경될 경우 동기화가 느려질 수 있다. 또한 이렇게 큰 파일의 변경이 잦으면 제외해주는 것이 좋다.
    • lsyncd가 파일 변화를 모니터링할 수 있는 디렉토리 갯수는 최대 8192개이다.


    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

      커피닉스 카페 최근 글
    [08/25] #gpt_question_subje
    [08/20] From what I've seen
    [08/14] сайт
    [06/16] [질문]SAN 스위치 브로드케이드 dcx8510-4 장비관련입니다.
    [04/22] Re: 영화속에 컴퓨터 이야기 ~스워드피쉬(2001)
    [10/20] Cross Compiler 깔
    [07/14] SSL АО
    [04/26] Re: 도스화면 원격조종 여부
    [04/25] 도스화면 원격조종 여부
    [10/30] Cshell에서 난수 설정
    [10/23] 공항철도주식회사 SE 구인 件
    [01/26] Re: wget으로 다른서버에있는 디렉토리를 가져오려고합니다.
    [01/25] wget으로 다른서버에있는 디렉토리를 가져오려고합니다.
    [01/11] 특정 안드로이드 WebView 버전에서 SSL 문제 (WebView 버그)
    [08/01] DNS forwarder (전달자) 서버를 통해서 쿼리하면 역방향을 받아오질 못합니다.
      New!   최근에 등록한 페이지
      KiCad EDA Suite project (Free/Libre/Open-Source EDA Suite) (CAD)
      오픈캐스케이드 캐드 (OpenCASCADE CAD)
      QCad for Windows --- GNU GPL (Free Software)
      The Hello World Collection
      IPMI를 활용한 리눅스 서버관리
      DNS 설정 검사
      nagiosgraph 설치 방법
      Slony-I 설치 방법 (postgresql replication tool)
      Qmail기반의 Anti spam 시스템 구축하기
      clusterssh

    [ 함께하는 사이트 ]




    운영진 : 좋은진호(truefeel), 야수(yasu), 범냉이, sCag
    2003년 8월 4일~