ようへいの日々精進XP

よかろうもん

lsyncd と rsync でホスト間でリアルタイムにファイルを共有する

概要

  • lsyncdrsync を使って複数のホスト間でリアルタイムにファイルを共有する環境を構築する
  • ホストは LXC コンテナを使って検証する

参考


構成

検証環境

以下のような検証環境。今回はマスターのみデータの更新が発生する環境を構築する。

ホスト OS IP アドレス 同期対象ディレクトリ
マスター Debian 6.0.7 10.0.3.66 /var/www/
スレーブ Debian 6.0.7 10.0.3.253 /var/www/

同期対象のディレクトリは nginx のデフォルトのドキュメントルートを指定するのであらかじめ nginx パッケージもインストールしておく。尚、検証環境は全て LXC で構築した。

lsyncd とは

  • カーネルの inotify が監視するファイル更新について API を利用し更新を監視する
  • ファイルの更新が発生した場合にミラー先の rsyncdrsync を実行(デフォルトは rsync を使う)することにより、リアルタイムにディレクトリのミラーリングを実現
  • 設定に関しては lua を使って書くことができる
  • 同期する方法としてデフォルトの rsync 以外にも DRDBGlusterFSBindFS 等も利用することが出来るらしい

設定

マスター(lsyncd)

lsyncd のインストール

sudo apt-get install libc6 liblua5.1-0 lua5.1 rsync
wget http://ftp.nara.wide.ad.jp/debian/pool/main/l/lsyncd/lsyncd_2.0.7-3_amd64.deb
sudo dpkg -i lsyncd_2.0.7-3_amd64.deb

Debian 6.0.7 の場合 libc6 との依存関係で lsyncd の最新版(2.1.5-1)はインストールに失敗するので注意する。

/etc/lsyncd/lsyncd.conf.lua の設定

設定は lua で記述出来る。

----
-- User configuration file for lsyncd.
--
-- Simple example for default rsync.
--
settings = {
        statusFile = "/tmp/lsyncd.stat",
        statusInterval = 1,
}

sync{
        default.rsync,
        source="/var/www/",
        target="10.0.3.253::hoge",

}

上記の例では /var/www 以下を同期する。

lsyncd 起動

以下のようにして lsyncd を起動する。

invoke-rc.d lsyncd start

スレーブ(rsync

rsync のインストール

sudo apt-get install rsync

/etc/rsyncd.conf

uid = root
gid = root
read only = no
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid

[hoge]
path = /var/www/
hosts allow = localhost 10.0.3.66
hosts deny = *
read only = false
exclude = .svn

/etc/default/rsync

rsyncd として(デーモン)として起動させるには /etc/default/rsync を以下のように修正する。

--- rsync.original      2013-11-01 15:55:19.815687680 +0000
+++ rsync       2013-11-01 15:55:59.823688631 +0000
@@ -5,7 +5,7 @@
 #  Use "inetd" if you want to start the rsyncd from inetd,
 #  all this does is prevent the init.d script from printing a message
 #  about not starting rsyncd (you still need to modify inetd's config yourself).
-RSYNC_ENABLE=false
+RSYNC_ENABLE=true

 # which file should be used as the configuration file for rsync.
 # This file is used instead of the default /etc/rsyncd.conf

rsyncd を起動する

以下のようにして rsync をデーモンとして起動する。

sudo invoke-rc.d rsync start 

試す

ちょっと伝わり辛いかもしれないけど画像で...

ファイルの追加、削除、編集

追加

f:id:inokara:20131102064412p:plain

編集

f:id:inokara:20131102064422p:plain

削除

f:id:inokara:20131102064649p:plain

ファイルサイズ次第ではあるがマスターがディレクトリ、ファイルの変更を検知して瞬時に同期が行われている。

ちょっとイタズラ

ちょっとイタズラしてみる。

スレーブに既に存在するファイルをマスターで作成してみる

うっかりスレーブ側にファイルを作成した後、マスター側に同じファイル名でファイルを作成し編集する。

f:id:inokara:20131102070635p:plain

最終的にはファイル名が同じであればスレーブ側のファイルが上書きされてしまうようだ。

スレーブ側でファイルを削除してみる

f:id:inokara:20131102071012p:plain

だいたい予想は出来たが、そもそもスレーブ側では lsyncd で監視されていないので何も起こらない。ただ、マスター側で同じファイル名のファイルに更新が発生した場合には...

f:id:inokara:20131102071626p:plain

上記のようにマスター側で修正したファイルが同期される。

他にも色々とイタズラが出来そうなので引き続き試す。


同期のロジック

どのように同期が行われるかを lsyncdデバッグモードで動かしてみてログを眺めてみる。

デバッグモードで起動する

デバッグモードで起動するには /etc/init.d/lsyncd を以下のように修正して起動する。

--- lsyncd.original     2013-11-01 23:13:59.238766671 +0000
+++ lsyncd      2013-11-01 23:14:27.882767352 +0000
@@ -17,7 +17,7 @@
 DAEMON=/usr/bin/$NAME
 CONFIG=/etc/lsyncd/lsyncd.conf.lua
 PIDFILE=/var/run/$NAME.pid
-DAEMON_ARGS="-pidfile ${PIDFILE} ${CONFIG}"
+DAEMON_ARGS="-log all -pidfile ${PIDFILE} ${CONFIG}"
 SCRIPTNAME=/etc/init.d/$NAME

 # Exit if the package is not installed

ファイルを作成した際のログ

  • 長いのでこちらに添付
  • inotifyEvent() でファイル更新が検知されて /usr/bin/rsyncExec される

スレーブ側では

  • マスター側で rsync が実行された後、ファイルの同期が行われる
  • スレーブ側で tcpdump を眺めてみるとこちらのようになる
  • rsyncd(ポート:873)ポートへのアクセスが発生していることが判る

最後に

  • lsyncdrsync でお手軽にリアルタイムファイル同期を実現出来そう
  • マスター、スレーブ構成だととてもシンプル