概要
lsyncd
とrsync
を使って複数のホスト間でリアルタイムにファイルを共有する環境を構築する- ホストは
LXC
コンテナを使って検証する
参考
- Lsyncd - Live Syncing (Mirror) Daemon
- axkibe / lsyncd
- Lsyncd Wiki
- lsyncd と rsync を使ってリアルタイムなサーバー間ファイル同期を実現する
- Linux でファイルの変更を検出する(inotify/fanotify)
- リアルタイムミラーリングツール導入(lsyncd+rsyncd)
構成
検証環境
以下のような検証環境。今回はマスターのみデータの更新が発生する環境を構築する。
ホスト 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
を利用し更新を監視する - ファイルの更新が発生した場合にミラー先の
rsyncd
へrsync
を実行(デフォルトはrsync
を使う)することにより、リアルタイムにディレクトリのミラーリングを実現 - 設定に関しては
lua
を使って書くことができる - 同期する方法としてデフォルトの
rsync
以外にもDRDB
やGlusterFS
やBindFS
等も利用することが出来るらしい
設定
マスター(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
試す
ちょっと伝わり辛いかもしれないけど画像で...
ファイルの追加、削除、編集
追加
編集
削除
ファイルサイズ次第ではあるがマスターがディレクトリ、ファイルの変更を検知して瞬時に同期が行われている。
ちょっとイタズラ
ちょっとイタズラしてみる。
スレーブに既に存在するファイルをマスターで作成してみる
うっかりスレーブ側にファイルを作成した後、マスター側に同じファイル名でファイルを作成し編集する。
最終的にはファイル名が同じであればスレーブ側のファイルが上書きされてしまうようだ。
スレーブ側でファイルを削除してみる
だいたい予想は出来たが、そもそもスレーブ側では lsyncd
で監視されていないので何も起こらない。ただ、マスター側で同じファイル名のファイルに更新が発生した場合には...
上記のようにマスター側で修正したファイルが同期される。
他にも色々とイタズラが出来そうなので引き続き試す。
同期のロジック
どのように同期が行われるかを 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/rsync
がExec
される
スレーブ側では
- マスター側で
rsync
が実行された後、ファイルの同期が行われる - スレーブ側で
tcpdump
を眺めてみるとこちらのようになる rsyncd
(ポート:873)ポートへのアクセスが発生していることが判る
最後に
lsyncd
とrsync
でお手軽にリアルタイムファイル同期を実現出来そう- マスター、スレーブ構成だととてもシンプル