UNIX的なアレ

UNIX的なこととかいろいろ

lsyncdをつかって簡単にファイル同期を

lsyncdというツールをご存じでしょうか?これを導入することで、リモートのホストとディレクトリ単位で同期をすることができます。
先日のエントリーでも紹介していますが、実は設定や導入がすごく簡単です。した設定でリモート間でファイルの同期をとれるのはやはり便利ですよね。
さて、今回はlsyncdの簡単な導入方法を紹介したいと思います。

lsyncdの仕組み

lsyncdlinux kernel2.6.13で導入された、inotifyというAPIをつかって動作しています。
inotifyファイルシステムのイベントを取得することができるAPIで、ファイルの作成や削除などをそれぞれイベントとして取得をすることができます。
この仕組みと、rsyncを組み合わせてファイルの同期を行うことを実現しています。

lsyncdのインストール

まず、以下のページからsourceをダウンロードしてください。
http://sourceforge.jp/projects/freshmeat_lsycnd/resources/

 $ tar xvfz lsyncd-1.25.tar.gz && cd lsyncd-1.25
 $ ./configure --prefix=/usr/local/lsyncd
 $ make && sudo make install

インストールは簡単ですね。特別なことはせずに上記のコマンドだけで簡単に導入することができます。

lsyncdを動かす

さて、それではlsyncdを動作させましょう。ネットワーク越しにファイルを同期させる設定のため、host1とhost2という2つのホストがありそれぞれ名前解決ができるという前提で進めます。

動作イメージ

動作イメージは下記の通りです。

  • originalデータ

host1:/var/tmp/original/

  • copy先

host2:/var/tmp/copy/

host2の設定

まず先に、コピー先のサーバをセットアップする必要があります。下記のコマンドで設定をしましょう。

 $ sudo tee /etc/rsyncd.conf << EOF
uid = root
gid = root
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
[data]
        comment = rsync server
        path = /var/tmp/copy/
        hosts allow = host1
        read only = false
EOF

さて、上記の設定ファイルが更新されたらrsyncdaemonを起動させましょう。

 $ sudo rsync --daemon
 $ ps `cat /var/run/rsyncd.pid`
  PID TTY      STAT   TIME COMMAND
  22290 ?        Ss     0:00 rsync --daemon

上記のように正常にプロセスがあがっていれば成功です。

host1の設定

それでは、ファイルのコピー元のサーバでlsyncdを起動しましょう。オプションを引数に渡すだけで簡単に起動をすることができます。

 $ sudo mkdir /var/tmp/original/
 $ /usr/local/lsyncd/bin/lsyncd /var/tmp/original/ host2::data

これで完了です!それではテストをしてみましょう。

ファイル同期のテスト

それではhost1側からテストをしてみましょう。

 $ for i in {1..10} ; do sudo touch /var/tmp/original/$i ; done
 $ for i in {11..20} ; do sudo mkdir /var/tmp/original/$i ; done

これでhost2:/var/tmp/copy/を確認してみてください。これで正常にファイルができていれば成功です。
簡単に設定でき、とても便利なツールなのでぜひ導入を検討してみてください。

lsyncdの起動script

かなり簡素なものですが、起動scriptです。centos5.3で動作を確認しています。

#!/bin/bash
#
# lsyncd
#
# chkconfig: - 99 20
# description: lsyncd start script

LSYNCD=/usr/local/lsyncd/bin/lsyncd
SRC=/var/tmp/original/
HOST=localhost
DEST=data
PID=/var/run/lsyncd/lsyncd.pid

. /etc/init.d/functions

start() {
   daemon $LSYNCD $SRC $HOST::$DEST --pidfile $PID
}

stop() {
   killproc -p $PID
}

checkproc() {
   if [ -e $PID ] ; then
       echo "Already running..."
       exit 1
   fi
}

case "$1" in
    start)
        checkproc
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
        ;;
    *)
        echo "Usage: lsyncd [ start | stop | restart ]"
        exit 1
esac
exit $?