lsyncd 동기화 (inotify + rsyncd)

리눅스/OS 일반|2014. 12. 30. 23:52
반응형

참고 : 
http://coffeenix.net/board_view.php?bd_code=1696
http://code.google.com/p/lsyncd/

동기화에 또다른 방법이 있어서 알려드립니다.
좋은진호님에 글에 개인적으로 테스트하면서 해당내역을 추가해서 적습니다.



Lsyncd vs. DRBD
DRBD 블록 장치 수준에서 동작하며 스토리지형태의 큰파일 시스템을 동기화할경우에는 유용합니다.  하지만 백업되는 상황만 볼수 있으며 실제 백업 데이타를 확인하지는 못한다는것... 속도성면에서 빠르나 블록단위 백업이라 쓸모없는것까지 모조리 백업되기도 하는점이 있습니다.

하지만 Lsyncd 는 장치 변경 및 지점을 필요로하지 않습니다.
더군다나 rsync의 단점인 특정스케줄에 의해서 동기화 되기때문에 완전한 미러링 시스템으로는 부족한점이 있다.

이부분에 대해서 rsync 기능에 추가해서 실시간 미러링 시스템으로 구축할수 있는 방법이 있어서 소개드립니다.



1. lsyncd 동기화 툴

1) lsyncd의 원리는 간단하다.

- 리눅스 커널의 inotify로 파일시스템의 변경사항을 체크한다.          (판단은 inotify로)
- 변경사항이 생기자마자, rsync를 호출하여 상대 서버로 싱크를 해준다. (동기화는 rsync로)

inotify는 리눅스 커널에 포함된 기능으로, 파일시스템에 변경사항이 발생할 때 이벤트를 통보해준다. 이 inotify를 이용하게 되면, 파일 변경사항을 수시로 파악할 필요없이 가만히 앉아있으면 된다. 파일이 바뀔 때 커널에서 통보해주는 신호를 덥석 받아먹으면 되기 때문이다.

0.5초(0.5초는 그만큼 짧다는 것을 표현하기 위해서 사용했음)도 안되는 아주 짧은 시간 동안의 차이는 생길 수 있지만, 소규모 서버를 운영할 경우에는 무리가 없을 것으로 보인다.

- 원본 데이터가 있는 서버(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 -> 상당수의 서비스 서버의 구조가 될 수도 있다.
  • 설치 
     -
     http://code.google.com/p/lsyncd/downloads/list

    [root@node1 src]# wget http://lsyncd.googlecode.com/files/lsyncd-1.26.tar.gz

    [root@node1 src]# tar zxf lsyncd-1.26.tar.gz

    [root@node1 src]# cd lsyncd-1.26

    [root@node1 lsyncd-1.26]# ./configure
    [root@node1 lsyncd-1.26]# make
    [root@node1 lsyncd-1.26]# make install



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

    기본 형식은 다음과 같다.

    USAGE: lsyncd [OPTION]... [SOURCE] [TARGET 1] [TARGET 2] ...
    SOURCE: a directory to watch and rsync.
    TARGET: can be any name accepted by rsync. e.g. "foohost::barmodule/"

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

    [root@node1 lsyncd-1.26]# ./lsyncd /home/aaa/ /data/backup/
    [root@node1 lsyncd-1.26]# ./lsyncd /home/aaa/ 192.168.123.3::test1/
    [root@node1 lsyncd-1.26]# ./lsyncd /home/aaa/ 192.168.123.3::test1/ 192.168.123.4::test1/


    테스트)
    동기화할 서버에는 rsync 설정과 동일하게 /etc/rsyncd.conf 설정을...

    [test1]
    path =/home/aaa
    comment =
    uid = root
    gid = root
    use chroot = yes
    read only = no
    hosts allow = 218.236.115.225
    max connections = 5
    timeout = 600


    Master 서버에서 lsyncd 데몬을....올리고

    [root@node1 lsyncd-1.26]# /usr/local/src/lsyncd-1.26/lsyncd /home/aaa 218.236.115.226::test1 

    [root@node1 lsyncd-1.26]# ps -aux
    root     15226  0.0  0.0  13884   488 ?        Ss   12:31   0:00 /usr/local/src/lsyncd-1.26/lsyncd /home/aaa 218.236.115.226::test1

     

    두개의 서버에서 동기화되는 과정을 FTP 를 통해 파일을 계속해서 올리면서 확인해보면...실시간으로 바로 동기화가 되고있음이 확인된다.




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


    • 어디에서 어디로 동기화가 되는지 확인할 수 있다. ( syncing /home/aaa/ -> 192.168.123.3::test1/ )
    • 16개 디렉토리( /home/aaa/ + 15개의 서브디렉토리 )를 모니터링한다. ( [16] monitored directories )
    • truefeel.txt 파일이 생성되자마자 rsync를 호출하여 동기화된다.
    • 서브 디렉토리( /home/aaa/docs/ ) 내의 파일이 변경된 경우 그 디렉토리만 동기화한다. ( rsyncing /home/aaa/docs/ --> 192.168.123.3::test1/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 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/aaa/"/>
              <target path="218.236.115.226::test1/"/>
      </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
         


        따로 시작/중지 스크립트를 만들어서 사용...

        #!/bin/bash
        # description: lsyncd auto start script

        start() {
            pid=`pidof lsyncd`
            if [ $? -eq 0 ]; then
                echo "lsyncd (pid $pid) is running..."
                echo " "
            else
                echo "Starting lsyncd..."
                echo " "
                /usr/local/bin/lsyncd
            fi
        }

        stop() {
            echo "Stopping lsyncd..."
            echo " "
            /bin/kill -9 `/sbin/pidof rsync`
            until [ -z $(/sbin/pidof lsyncd) ]; do :; done
        }

        case "$1" in
            start)
                start
                ;;
            stop)
                stop
                ;;
            restart)
                stop
                start
                ;;
            status)
                pid=`pidof lsyncd`
                if [ $? -eq 0 ]; then
                    echo "lsyncd (pid $pid) is running..."
                    echo " "
                else
                    echo "lsyncd is not running"
                    echo " "
                fi
                ;;
            *)

            echo "Usage: lsyncd {start|stop|restart|status}"
            exit 1
        esac

        exit $?



        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개이다.
        •  커널변수를 이용해서 수정가능하다.  
           기본설정은 8192개 이나 수정하면 늘릴수 있습니다.
          그리고 ext2. ext3 파일시스템에서는 기본적으로 디렉토리가 32000개 까지 만들어집니다.
           cat /proc/sys/fs/inotify/max_user_watches

           

           


반응형

댓글()

Linux swap 메모리 늘리기

리눅스/OS 일반|2014. 12. 30. 23:51
반응형

swap메모리는 주 메모리가 부족할 때 하드디스크와 같은 공간을 메모리로 사용하기 위한 가상메모리이다.(윈도우에선 가상메모리라 함)

그런데, 오늘은 주 메모리는 남아도는데 swap메모리가 부족한 어처구니없는 상황이 벌어졌으니….

 

머 이번 포스팅은 이런 현상의 원인이 아니라 걍 swap메모리 늘리기니깐 상황분석은 생략..(실은 잘 몰라서..-ㅅ-;;)

 

swap영역을 확보하기 위해서는 2가지 방법이 있다고 한다.

1. swap 파티션 구성

2. swap 파일 생성

위 2가지 중 swap 파일을 생성하는 것이 상대적으로 용이하기 때문에 swap파일을 생성, 설정, 활성화 하는 것을 이용하였다.

 

1. swap파일의 생성 - root(/)에 512MB의 swapfile_temp라는 것을 만든다.

dd if=/dev/zero of=/swapfile_temp bs=1024 count=524288

              (참고 : 4G 로 생성할 경우 4000 * 1024 = 4096000 을 count 값으로 하면 된다. bs는 그대로.)

 

2. swap파일 설정 - v1옵션은 new스타일, v0옵션은 old스타일이다.

mkswap -v1 /swapfile_temp

3. swap파일 활성화

swapon /swapfile_temp

이 후 top 또는 free명령을 통해 늘어난 swap공간을 확인할 수 있다.

 

* 활성화된 swap공간을 삭제하기 위해선 swapoff명령을 사용한 후 해당 파일을 삭제하면 끝~

* 리부팅시 swap 용량이 전상태로 돌아가므로 /etc/rc.d/rc.local 에 맨 마지막 명령어(swapon /swapfile_temp)를 추가해 준다.

 


[출처] South Life's 生活錄 - 인생에 개그가 없다~! | SouthLife (http://southlife.tistory.com/90)

반응형

댓글()

스핑크스 (sphinx) 설치 - 검색엔진 만들기

리눅스/OS 일반|2014. 12. 30. 23:50
반응형

내 블로그 검색에 오픈 소스 검색엔진을 붙여보자!

 

내 블로그나 홈페이지에 검색엔진을 장착해 보고 싶다면 엔진으로 스핑크스(Sphinx)를 선택해보는 것도 좋을 것 같습니다. 오픈 소스이고 PHP, Perl, C/C++, 등의 프로그래밍 언어 API 를 제공하고 있으므로 PHP 로 개발된 텍스트큐브와 같은 설치형 블로그에 검색을 붙이려면 PHP 용 API 를 이용하며 될 것입니다. 이미 텍스트큐브에도 검색이 있지만 레코드수가 많아서 검색해야할 항목이 많아질 경우 검색 시간이 많이 소요되고 복잡한 조건의 검색을 할 수 없는 문제가 있습니다. 개발언어를 다룰 수 있다는 조건 하에 스핑크스 검색엔진을 사용해볼 것을 권해봅니다.
스핑크스 검색엔진이 어떤 것인지 체험 해보려면 간단히 아래에 설명하는 방법으로 설치하고 테스트 해보면 됩니다. 참고로 리눅스 CetOS 5.x 에서 테스트 되었습니다. 물론 소스 코드가 공개 되어 있으므로 윈도우즈와 다른 리눅스, 유닉스 계열 OS 를 사용할 수 있습니다.

[root@sphinx ~]# yum -y install mysql-devel
[root@sphinx ~]# cd /usr/local/src
[root@sphinx src]# wget http://www.sphinxsearch.com/downloads/sphinx-0.9.8.1.tar.gz 
[root@sphinx src]# tar xvzf sphinx-0.9.8.1.tar.gz
[root@sphinx src]# cd sphinx-0.9.8.1
[root@sphinx sphinx-0.9.8.1]# ./configure
[root@sphinx sphinx-0.9.8.1]# make
[root@sphinx sphinx-0.9.8.1]# make install


위와 같이 설치하면 아래와 같은 스핑크스 관련 파일들이 기본 폴더(/usr/local/bin)에 설치됩니다.

  /usr/local/bin/indexer
  /usr/local/bin/searchd
  /usr/local/bin/search
  /usr/local/bin/spelldump

또한 아래와 같은 설정 파일 샘플과 MySQL 용 SQL 샘플이 설치됩니다.

 /usr/local/etc/sphinx.conf.dist
 /usr/local/etc/sphinx-min.conf.dist
 /usr/local/etc/example.sql

MySQL 에 접속해서 테스트용 데이타베이스(test) 를 만들고 user 와 password 를 만들고 이 데이타베이스(test)에 권한을 부여 합니다. test로 데이타베이스를 정할 경우 이미 생성되 있으므로 권한 부여만 합니다.

[root@sphinx sphinx-0.9.8.1]# mysql -uroot -p
Enter password: ********
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 116
Server version: 5.0.45 Source distribution
 
Type 'help;' or 'h' for help. Type 'c' to clear the buffer.
 
mysql> grant all privileges on test.* to user@"localhost" identified by "password";
Query OK, 0 rows affected (0.05 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
 
mysql> exit
Bye
[root@sphinx sphinx-0.9.8.1]#


데이타베이스 설정이 완료 되었으면 스핑크스 셋팅 파일을 만들어줍니다.

[root@sphinx sphinx-0.9.8.1]# vi /usr/local/etc/sphinx-min.conf.dist
[root@sphinx sphinx-0.9.8.1]# cp /usr/local/etc/sphinx-min.conf.dist /usr/local/etc/sphinx.conf
[root@sphinx sphinx-0.9.8.1]# cat /usr/local/etc/sphinx.conf
#
# Minimal Sphinx configuration sample (clean, simple, functional)
#
source src1
{
        type                                    = mysql
 
        sql_host                                = localhost
        sql_user                                = user
        sql_pass                               = password
        sql_db                                  = test
        sql_port                                = 3306  # optional, default is 3306
 
        sql_query                               = 
                SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content 
                FROM documents
 
        sql_attr_uint                   = group_id
        sql_attr_timestamp              = date_added
 
        sql_query_info                  = SELECT * FROM documents WHERE id=$id
}
index test1
{
        source                                  = src1
        path                                    = /var/data/test1
        docinfo                                 = extern
        charset_type                    = sbcs
}
indexer
{
        mem_limit                               = 32M
}
searchd
{
        port                                    = 3312
        log                                             = /var/log/searchd.log
        query_log                               = /var/log/query.log
        read_timeout                    = 5
        max_children                    = 30
        pid_file                                = /var/log/searchd.pid
        max_matches                             = 1000
        seamless_rotate                 = 1
        preopen_indexes                 = 0
        unlink_old                              = 1
}
[root@sphinx sphinx-0.9.8.1]#


나의 데이타베이스 설정에 맞게 위와 같이 설정이 완료되면 아래와 같이 스핑크스에서 제공하는 샘플 테이블을 MySQL 에 만들어줍니다. 그리고 커멘드라인 프로그램 indexer 를 실행해서 검색을 위한 인덱스를 생성합니다. 인덱싱이 완료 되면 커멘드라인 프로그램 search 를 실행해서 검색을 할 수 있습니다.

[root@sphinx sphinx-0.9.8.1]# mysql -uroot -p test < /usr/local/etc/example.sql 
Enter password: ********
[root@sphinx sphinx-0.9.8.1]# mkdir /var/data
[root@sphinx sphinx-0.9.8.1]# indexer test1
[root@sphinx sphinx-0.9.8.1]# search number
Sphinx 0.9.8.1-release (r1533)
Copyright (c) 2001-2008, Andrew Aksyonoff
 
using config file '/usr/local/etc/sphinx.conf'...
index 'test1': query 'number ': returned 3 matches of 3 total in 0.000 sec
 
displaying matches:
1. document=1, weight=1, group_id=1, date_added=Sat Dec  6 11:42:12 2008
        id=1
        group_id=1
        group_id2=5
        date_added=2008-12-06 11:42:12
        title=test one
        content=this is my test document number one. also checking search within phrases.
2. document=2, weight=1, group_id=1, date_added=Sat Dec  6 11:42:12 2008
        id=2
        group_id=1
        group_id2=6
        date_added=2008-12-06 11:42:12
        title=test two
        content=this is my test document number two
3. document=4, weight=1, group_id=2, date_added=Sat Dec  6 11:42:12 2008
        id=4
        group_id=2
        group_id2=8
        date_added=2008-12-06 11:42:12
        title=doc number four
        content=this is to test groups
 
words:
1. 'number': 3 documents, 3 hits
 
[root@sphinx sphinx-0.9.8.1]#


위와 같이 인덱싱이 완료되고 search 커멘드라인 명령어를 이용해 "number" 라는 검색어(키워드)로 검색하면 검색결과 3개의 문서가 검색되었다고 알려줍니다. 
PHP 로 검색엔진을 제어하기 위해 아래와 같이 검색 데몬(searchd)을 띄우고 PHP 용 API 를 이용해서 검색할 수 있습니다.

[root@sphinx sphinx-0.9.8.1]# /usr/local/bin/searchd 
Sphinx 0.9.8.1-release (r1533)
Copyright (c) 2001-2008, Andrew Aksyonoff
 
using config file '/usr/local/etc/sphinx.conf'...
creating server socket on 0.0.0.0:3312
[root@sphinx sphinx-0.9.8.1]# cd api
[root@sphinx api]# php test.php number
Query 'number ' retrieved 3 of 3 matches in 0.000 sec.
Query stats:
    'number' found 3 times in 3 documents
 
Matches:
1. doc_id=4, weight=100, group_id=2, date_added=2008-12-06 11:42:12
2. doc_id=1, weight=1, group_id=1, date_added=2008-12-06 11:42:12
3. doc_id=2, weight=1, group_id=1, date_added=2008-12-06 11:42:12
[root@sphinx api]#


위와 같이 검색 데몬 searchd 를 띄우고 샘플 PHP 소스 파일 test.php 를 실행하면 검색 결과를 확인할 수 있습니다. 샘플 소스 상단을 보면 sphinxapi.php 라는 파일을 Include 합니다. 이것이 PHP 용 API 입니다.

간단하게 스핑크스를 설치하고 테스트도 해봤습니다. 이제 내 블로그 데이터를 인덱싱하고 이를 검색할 수 있도록 검색 페이지를 만드는 일만 남았습니다. 

오픈 소스 검색 엔진 스핑크스(Sphinx) 홈페이지
    - http://www.sphinxsearch.com/
스핑크스(Sphinx)로 PHP로 커스텀 검색 엔진 구현하기
    - http://www.ibm.com/developerworks/kr/library/os-php-sphinxsearch/index.html

 

 

[출처] 웹프로그래머의 홈페이지 정보 블로그 | 프로그래밍 (http://hompy.info/539)

반응형

댓글()

mdadm을 이용한 software raid 만들기

리눅스/OS 일반|2014. 12. 30. 23:49
반응형

-----------------------------------------------
 Software RAID
-----------------------------------------------

 

1. mdadm 유틸리티 설치하기

 

 


2. 소프트웨어 레이드 만들기 사례

1) 두 번째와 세 번째 하드를 이용하여 100MB짜리 미러 볼륨(raid-1) 만들기

; 파티션 하기 ---------------------  
;
; 설명중 [ ]안은 상황에 따라 다른 것을 써야 함
; 두 개의 하드디스크 /dev/sdb와 /dev/sdc를 사용함 (파티션되지 않은 하드라고 가정함)
; 두 하드를 각각 100MB 용량으로 파티션하고 파티션 종류를 'Linux raid auto'로 설정함
; 100MB씩 주어야하는 이유는 미러 볼륨이니까
; 다음과 같이 파티션을 실행함.
;
fdisk /dev/sdb     
   명령 : n --> p --> [1] --> 시작 [enter] --> 용량[+100M]  --> t(change type) --> fd(Linux raid auto) --> w
fdisk /dev/sdc
   명령 : n --> p --> [1] --> 시작 [enter] --> 용량[+100M]  --> t(change type) --> fd(Linux raid auto) --> w


; Software RAID 만들기 ------------------

mdadm -C /dev/md0 -l 1 -n 2 /dev/sdb1 /dev/sdc1 
;   -C create라는 뜻이겠지요.
;   /dev/md0는 /dev/md1 또는 /dev/md5와 같이 바꿀 수 있겠고요. mknod명령으로도 만들 수 있고요. mdadm명령을 사용하면 자동으로 만들어져요.
;  -l i가 아닌 L입니다.  Level이라는 옵션이구요.  1이면 raid-1 5이면 raid-5입니다.
;  -n 사용하는 파티션 수입니다.  -n 2는 2개의 파티션을 사용한다는 뜻이지요.
; 맨 뒤에 실제로 사용하는 파티션을 순서대로 공백으로 구분하면서 적습니다.

mdadm --detail --scan
; 소프트웨어 레이드가 잘 만들어졌는지 확인하는 명령입니다.


; 포맷하기 ----------------------------

mkfs -t ext3 /dev/md0
; ext3 파일시스템으로 포맷합니다. 시간이 좀 걸리겠지요.


; 마운트하기 ------------------------

mkdir /mirror   ; 마운트할 빈 디렉터리를 만들고,
mount /dev/md0  /mirror  ;  raid-1 볼륨을 /mirror에 마운트 했습니다.


; 영구 마운트하기 -------------------

; /etc/fstab 파일을 vi 편집기로 편집합니다.
; 다음과 같은 행을 추가 합니다. 
; 띄어쓰기를 조심하지 않으면 낭패를 봅니다.

 /dev/md0 /mirror ext3 defaults 1 1 


2) 2~4번째 하드 3개를 이용하여 200MB짜리 Raid-5 볼륨 만들기

; 파티션 과정은 미러 볼륨과 같음
; 각 파티션의 용량은 100MB로 함 (세 개 중 하나는 복구용으로 사용하므로 실제 사용 가능한 용량은 300이 아닌 200MB가 됨)

; Raid 만들기에서 다음과 같은 식으로 함

 # mdadm -C /dev/md1 -l 5 -n 3 /dev/sdb2 /dev/sdc2  /dev/sdd1


; 포맷하고 마운트하는 과정은 똑 같음

 

-- 검색할 때는 mdadm이라는 키워드로 검색하면 엄청 많은 자료가 있어요.  되도록 누가 간단히 요약해 놓은 자료만 탐독하지 말고, RAID의 원리부터 차근 차근 공부할 수 있게 되어 있는 사이트들을 보았으면 하네요.

 

-- Red Hat Linux 9: Red Hat Linux 사용자 정의 가이드 중 RAID 부분 (넘기다 보면 LVM도 나오지요)

     http://coffeenix.net/doc/RH-DOCS/rhl-cg-ko-9/s1-raid-why-use.html

 

-- LVM에 대한 짧은 글 : http://www.linuxlab.co.kr/docs/01-05-4.htm

 

 

[출처] 모든가능성 | 조화 (http://blog.naver.com/hjunki?Redirect=Log&logNo=100094179645)

반응형

댓글()

리눅스 quota 설정

리눅스/OS 일반|2014. 12. 30. 23:48
반응형

우선, 예전 쿼타 설정 문서(http://kldp.org/HOWTO/mini/html/Quota/index.html)을
참조하시길 바랍니다.
쿼타패키지의 버전업에 따라 쿼타설정이 다소 차이가 있습니다.


1.Quota 설정상태 확인
시스템에 설치된 quota 패키지의 버전을 확인합니다.
rpm -qa | grep quota
quota-3.03-1


2.fstab 파일에 usrquota 옵션 추가
quota를 설정하고자 하는 파티션에 usrquota (사용자별) 또는 grpquota (그룹별) 등의 옵션을 추가합니다. 같이 사용 가능합니다.

vi /etc/fstab

LABEL=/                 /                       ext3    defaults        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2
none                    /dev/pts                devpts  gid=5,mode=620  0 0
LABEL=/home             /home                   ext3    defaults,usrquota        1 2
none                    /proc                   proc    defaults        0 0
none                    /dev/shm                tmpfs   defaults        0 0
LABEL=/tmp              /tmp                    ext3    defaults        1 2
LABEL=/usr              /usr                    ext3    defaults        1 2
LABEL=/usr/local        /usr/local              ext3    defaults        1 2
LABEL=/var              /var                    ext3    defaults        1 2
/dev/hda2               swap                    swap    defaults        0 0


3. Quota 기록 파일 생성
quota를 설정하고자 하는 최상위 파티션에 aquota.user 또는 aquota.group 등의
쿼타기록 파일을 생성합니다.
그 파일들의 퍼미션은 보안상 600 모드를 줍니다.

cd /home
touch aquota.user
chmod 600 aquota.user


4. 파티션 리로드
파일시스템을 재인식 시키기 위해서 리부팅을 하거나

mount -o remount /home 의 명령으로 리마운트를 합니다.


5. Quota 데이타베이스파일 초기화
quota 상태를 체크하여 aquota.user 파일을 초기화시킵니다.

quotaoff -avug
/dev/hda3 [/home]: user quotas turned off

quotacheck -avug
quotacheck: WARNING -  Quotafile /home/aquota.user was probably truncated. Can't save quota settings...
quotacheck: Scanning /dev/hda3 [/home] done
quotacheck: Checked 456 directories and 6013 files

quotaon -avug
/dev/hda3 [/home]: user quotas turned on


6. Quota 상태 확인
현재 설정된 쿼타 내용을 확인합니다.

repquota -a
*** Report for user quotas on device /dev/hda3
Block grace time: 7days; Inode grace time: 7days
                        Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
root      --  889244       0       0           1124     0     0       
admin     -- 2253416       0       0            414     0     0       
test      --    1160       0       0             25     0     0


7. Quota 할당
하드용량을 admin 계정에게 200MB을 할당하고자 한다면 아래와 같이
명령을 내린 후 수동으로 soft와 hard에 204800을 입력하고 저장합니다. 

edquota -u admin
Disk quotas for user admin (uid 500):
  Filesystem                   blocks       soft       hard     inodes     soft     hard
  /dev/hda3                   2253416    204800   204800        414        0        0       

저장후 쿼타할당 상태를 확인하면 아래와 같이 바뀌어 있을 것입니다.

repquota -a
*** Report for user quotas on device /dev/hda3
Block grace time: 7days; Inode grace time: 7days
                        Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
root      --  889244       0       0           1124     0     0       
admin     -- 2253416 204800 204800            414     0     0       
test      --    1160       0       0             25     0     0       


8. 기타 (명령 command 로 limit 설정)
수동으로 편집하여 적용하기 어려운 환경에서는 quotatool 을 이용하면 명령 command 로 적용이 가능해집니다.

rpmfind.net 에서 검색해서 받으면 되며, 아래는 CentOS 7 에서 설치할 수 있는 rpm 파일입니다.


# wget http://rpmfind.net/linux/epel/7/x86_64/Packages/q/quotatool-1.6.2-3.el7.x86_64.rpm

# rpm -i quotatool-1.6.2-3.el7.x86_64.rpm


적용

# quotatool -u sysdocu -b -q 10M -l 10M /home

// 설명: sysdocu 계정의 -b (블록설정) -q (소프트쿼터:경고알림) 10M -l (하드쿼터:강제적용) 10M /home (파티션위치)

// 설명 : inode 제한은 -b 대신 -i 로 하면 됩니다. 모든 설명은 --help 를 참조.


반응형

댓글()

VLC media player 1.0.2 (무료 스트리밍 서비스 프로그램)

리눅스/OS 일반|2014. 12. 30. 23:47
반응형

무료 스트리밍 서비스 프로그램

 

여러 OS버전이 있음

 

http://www.videolan.org/

반응형

댓글()

<defunct> 좀비 프로세스 Kill 시키기

리눅스/OS 일반|2014. 12. 30. 23:46
반응형

ps -ef|grep defunct | awk '{print $3}' | xargs kill -9


위 명령과 동시에 root 세션이 끊어져 버리므로 주의 (재로그인 해야 한다)

반응형

댓글()

파일내 특정 문자열 일괄 변경하기 (하위 디렉토리 포함)

리눅스/OS 일반|2014. 12. 30. 23:45
반응형

find . -name "*" -exec perl -pi -e 's/바꿀문자/새로운문자/g' {} \; 

반응형

댓글()

스퀴드 (이미지캐싱) 초기화 명령

리눅스/OS 일반|2014. 12. 30. 23:45
반응형

# cd /sbin/
# ln -s /usr/local/squid/sbin/squid
# squid -z

 

squid -z : 초기화

반응형

댓글()

chkconfig 이용하여 런레벨별 구동 데몬 설정

리눅스/OS 일반|2014. 12. 30. 23:44
반응형

# chkconfig --add vsftpd

# chkconfig --level 3 vsftpd on

# chkconfig --level 5 vsftpd on


vsftpd 를 구동선택할 수 있는 데몬으로 추가하고 3번, 5번 런레벨 에서만 vsftpd 를 구동되도록 설정한다.

반응형

댓글()

폴더 및 파일 수정 날짜 변경

리눅스/OS 일반|2014. 12. 30. 23:42
반응형

# touch -t 08151521 readme.txt

 

설명 : 08월 15일 15시 21분

반응형

댓글()