かぴぶろぐ

またかぴったかと思った・・・(´A`;)

lsyncでファイル同期

カテゴリ[ Linux Unix ]

殆どlsyncによるリアルタイムミラーリングさんの情報のままですが・・。とりあえずやってみた。

前提条件

ミラー元(ホスト)

  • IP:192.168.1.1
  • lsyncのセットアップ先:/opt/softwares/lsyncd-1.39
  • 作業ディレクトリ:/opt/src/work
  • 同期ディレクトリ名:/opt/lsync_test/

ミラー先(クライアント)

  • IP:192.168.1.2
  • 同期ディレクトリ名:/opt/lsync_backup/

※両方ともCentos5.5

※test前提のディレクトリ名なので適宜読み替えてください。

ミラー先(クライアント)

xinetdのインストール

[client]# yum install xinetd

xinetd rsyncを有効にする

[client]# vi /etc/xinetd.d/rsync
# default: off
# description: The rsync server is a good addition to an ftp server, as it #   allows crc checksumming etc.
service rsync
{
    disable = no # <- yesをnoに変更
    socket_type     = stream
    wait            = no
    user            = root
    server          = /usr/bin/rsync
    server_args     = --daemon
    log_on_failure  += USERID
}

backupディレクトリを作成

[client]# mkdir /opt/lsync_backup
[client]# chown nobody:nobody /opt/lsync_backup

confを作成

[client]# vi /etc/rsyncd.conf
[site]
path = /opt/lsync_backup
hosts allow = 192.168.1.0/24 # 又は192.168.1.1/32等で指定
read only = false

xinetdを起動

[client]# /etc/init.d/xinetd start
Starting xinetd:                                           [  OK  ]

スタートアップ登録

[client]# /sbin/chkconfig --level 345 xinetd on

ミラー元(ホスト)

libxml2-devel zlib-devel readline-develが入ってることを確認し無ければインストールする。

[host]# yum -y install libxml2-devel zlib-devel readline-devel

lsyncをゲット -> インストール

[host]# cd /opt/src/work/
[host]# wget http://lsyncd.googlecode.com/files/lsyncd-1.39.tar.gz
[host]# tar zxf lsyncd-1.39.tar.gz
[host]# cd lsyncd-1.39
[host]# ./configure --prefix=/opt/softwares/lsyncd-1.39
[host]# make
[host]# make install

同期ディレクトリを作成

[host]# /opt/lsync_test

confのコピー。コピー元のxmlはソース内にある。

[host]# cd /etc
[host]# cp -rfp /opt/src/work/lsyncd-1.39/lsyncd.conf.xml .

confの修正

62,63行目辺りの source pathとtarget pathをクライアントに合わせて修正

[host]# vi cd /etc/lsyncd.conf.xml
<directory>
        <source path="/opt/lsync_test/"/>
        <target path="192.168.1.2::site/"/>
</directory>

起動ファイルの作成

vi /etc/init.d/lsyncd
-------------------------------------------------
#!/bin/bash

# lsyncd: Starts the lsync Daemon
# chkconfig: 345 99 90
# description: Starts the lsync Daemon
# processname: lsyncd

. /etc/rc.d/init.d/functions
config="/etc/lsyncd.conf.xml"
lsyncd="/opt/softwares/lsyncd-1.39/bin/lsyncd"
lockfile="/var/lock/subsys/lsyncd"
prog="lsyncd"
RETVAL=0

start() {
    if [ -f $lockfile ]; then
        echo -n $"$prog is already running: "
        echo
        else
        echo -n $"Starting $prog: "
        daemon $lsyncd --conf=$config
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && touch $lockfile
        return $RETVAL
    fi
}
stop() {
    echo -n $"Stopping $prog: "
    killproc $lsyncd
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] && rm -f $lockfile
    return $RETVAL
}
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
        ;;
    status)
        status $lsyncd
        ;;
    *)
    echo "Usage: lsyncd {start|stop|restart|status}"
    exit 1
esac
exit $?
-------------------------------------------------

こんな感じで。
configとlsyncdの箇所は適宜書き換える。

[host]# chmod 755 /etc/init.d/lsyncd

lsyncdの起動

[host]# /etc/init.d/lsyncd start

起動すると/var/log/lsyncdが出来るので、エラーがないか確認。

logrotateの設定

[host]# cd /etc/logrotate.d/
[host]# vi lsyncd
/var/log/lsyncd {
   daily
   copytruncate
   compress
   notifempty
   missingok
   postrotate
     /etc/rc.d/init.d/lsyncd restart 2>&1 > /dev/null || true
   endscript
}

スタートアップ登録

[host]# /sbin/chkconfig --level 345 lsyncd on

テストファイル作成

[host]# cd /opt/lsync_test
[host]# touch kapi

クライアント側にファイルが出来ていれば一先ず同期OK

障害テスト

クライアント障害を想定し、試しにクライアントのxinetdを落としてみる

[client]# /etc/init.d/xinetd stop

ホストで新たなファイル作成

[host]# cd /opt/lsync_test
[host]# touch server_down

勿論同期されない。
/var/log/lsyncdに

 /usr/bin/rsync /opt/lsync_test/ --> 192.168.1.2::site/ [6816]
rsync: failed to connect to 192.168.1.2: Connection refused (111)
rsync error: error in socket IO (code 10) at clientserver.c(122) [sender=3.0.7]
Tue Nov 23 11:37:07 2010: Forked binary process returned non-zero return code: 10

とでてる。接続失敗を検知。

復旧を想定し、クライアントのxinetdをstart

[client]# /etc/init.d/xinetd start

しかし、この段階では自動同期されない・・・。
ホストで新たにファイルを追加

[host]# touch restart

/var/log/lsyncdに

/var/log/lsyncdに
Tue Nov 23 11:40:37 2010: CREATE restart in /opt/lsync_test/ - delayed.
Tue Nov 23 11:40:37 2010: ATTRIB restart in /opt/lsync_test/ - already delayed.
Tue Nov 23 11:40:37 2010: CLOSE_WRITE restart in /opt/lsync_test/ - already delayed.
Tue Nov 23 11:40:42 2010: delay expired: acting for /opt/lsync_test/.
Tue Nov 23 11:40:42 2010:   /usr/bin/rsync /opt/lsync_test/ --> 192.168.1.2::site/ [7175]

と出てる。
この段階で再同期したらしい。

[client]# # ls
server_down  kapi  restart

うーん・・・。ディレクトリの更新等をトリガーにsyncしてるのだろうか、当然の動きかも知れないが
クライアントへの接続検知で再同期されるともっとうれしいが。
でも、ディレクトリ更新タイミングでも充分実用ベースで使える。

NFSのように双方同期ではないので、理想はホストは単に同期用サーバとし、複数のアプリサーバを
クライアントとして同期する、みたいな使い方が良いと思う。

参考URL

http://kapi.jp/kapi_blog/282

2010年11月23日

関連カテゴリ Linux Unix

この記事のコメント

この記事にコメントする