2012-12-14

lsyncdでApacheログの同期で嵌まったお話

lsyncdとrsyncを用いての実現を試みたのですが
  • 更新が検知されなず、同期されない
  • 更新が検知されてもtail -fできない
という現象に悩まされたので解決法をメモ
まずはインストール方法
yumで入ってくれるバージョンは古いので要注意
lsyncd.x86_64                         2.0.4-1.el5.1              epel
だと、Apacheのログファイルのようにファイルをオープンしっぱなしのファイルについては更新を検知できないらしい。
githubによると、inotifyModeのところに
(Lsyncd >= 2.0.5) Specifies on inotify systems what kind of changes to listen to. Can be "Modify", "CloseWrite" (default) or "CloseWrite or Modify".
と書かれている。
なので、こっちから2.0.7のrpmを入手
32bit版
http://www6.atomicorp.com/channels/atomic/centos/5/i386/RPMS/lsyncd-2.0.7-2.el5.art.i386.rpm
http://www6.atomicorp.com/channels/atomic/centos/6/i386/RPMS/lsyncd-2.0.7-2.el6.art.i686.rpm
64bit版
http://www6.atomicorp.com/channels/atomic/centos/5/x86_64/RPMS/lsyncd-2.0.7-2.el5.art.x86_64.rpm
http://www6.atomicorp.com/channels/atomic/centos/6/x86_64/RPMS/lsyncd-2.0.7-2.el6.art.x86_64.rpm
そして、サービス起動用のファイル/etc/init.d/lsyncdを作成してパーミッションを755に設定
#!/bin/bash
# chkconfig: - 85 15
# description: lsyncd

RETVAL=0
prog="/usr/bin/lsyncd"
conf="/etc/lsyncd.conf"
pidfile="/var/run/lsyncd.pid"

. /etc/rc.d/init.d/functions

start() {
        echo -n "Starting $prog:"
        daemon $prog $conf
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && touch $pidfile
        return $RETVAL
}
stop() {
        echo -n "Stopping $prog:"
        killproc $prog
        RETVAL=$?
        echo
        rm -f $pidfile
        return $RETVAL
}
case $1 in
        start  ) start ;;
        stop   ) stop ;;
        restart) stop && start ;;
        *)
                echo "Usage: $0 {start|stop|restart}"
                exit 1
esac
次に設定ファイルを作成
settings = {
        logfile = "/var/log/lsyncd.log",
        statusFile = "/var/log/lsyncd.stat",
        statusInterval = 1,
        inotifyMode = "CloseWrite or Modify",
}

sync{
        default.rsync,
        source = "/var/log/httpd/",
        target = "/mnt/log/httpd/",
        rsyncOpts = {"-rlptgoD","--append","--max-delete=-1"},
        maxDelays = 1
}
sync{
        default.rsync,
        source = "/var/log/mail/",
        target = "/mnt/log/mail/",
        rsyncOpts = {"-rlptgoD","--append","--max-delete=-1"},
        maxDelays = 1
}
ポイントとしては、inotifyModeに"CloseWrite or Modify"を指定することで、ファイルの更新かファイルハンドラがクローズされたかでイベントを検知するよう設定
rsyncOptsで--appendを指定することで、ログファイルのように追記更新型のファイル用に、同期先のファイルの置き換えではなく、追記で対応するように設定
--max-delete=-1を指定することで、同期元からファイルが削除されても同期先のファイルは消されないように設定 っという感じにしてみましたヾ(*・ω・)シ
あとは、サービスを起動するだけ
service lsyncd start

0 件のコメント:

コメントを投稿