lsyncd(+rsync)で複数サーバ間のファイルを自動で同期する
- http://fedorasrv.com/lsyncd.shtml
- http://www.naney.org/diki/d/2009-02-13-lsyncd.html
- http://d.hatena.ne.jp/wadap/20090913/1252839223
linuxのinotify機能を使ってファイルアクセスを監視して、ファイルの更新を検知するとrsyncかけてくれるらしい。めちゃ便利じゃね?
inotify
lsyncd
参考URLにあるように、デフォルトではrsync --deleteオプション付きなので注意。また、permissionを変更しただけでは反映されない。inotify自体はpermissionの変更も検知するみたいだけど。lsyncdの仕様?
lsyncd.conf.xmlでrsyncに"-p"オプションを設定しておけば、他のファイルが更新されたタイミングで、permission情報も更新されるとさ。
複数のサーバでlsyncdを起動して設定しとけば、相互に同期をかけることも可能ぽい。もちろんその場合はデフォルトのrsync --deleteオプションは外す必要あるけど。でも、同時に同ファイル名に書き込むと整合性とれなくなりそ?他にも、ファイル数が多かったり、書き込み頻度が多い場合も危険な香りがするから実運用では、相互に同期取るのは危険かなぁ。
lsyncdの設定
- /etc/lsyncd.conf.xml
lsyncdの引数にsrc, dstを指定しないでlsyncdを起動した場合、/etc/lsyncd.conf.xmlが読まれる。他のファイルを読む場合は--confで。
/foo => host2のfoo module (host2の/etc/rsyncd.confで設定)に同期
/bar => /tmp/barに同期する設定例
<lsyncd version="1.25"> <settings> <logfile filename="/var/log/lsyncd"/> <binary filename="/usr/bin/rsync"/> <callopts> <option text="-lt%r"/> <option text="-p"/> <exclude-file/> <source/> <destination/> </callopts> </settings> <directory> <source path="/foo"/> <target path="host2::foo"/> </directory> <directory> <source path="/bar"/> <target path="/tmp/bar"/> </directory> </lsyncd>
host2のrsyncd設定
- /etc/rsyncd.conf
host1のlsyncd.conf.xmlに指定しているfooにあわせてをmodule_nameをfooに設定。実際に使う場合はたぶんアクセス制御も書いたほうがいい。
uid = root gid = root [foo] path=/foo read only = no
lsyncd 起動
# lsyncd --conf /etc/lsyncd.conf.xml