うまいぼうぶろぐ

linuxとhttpdとperlのメモ

lsyncd(+rsync)で複数サーバ間のファイルを自動で同期する

linuxのinotify機能を使ってファイルアクセスを監視して、ファイルの更新を検知するとrsyncかけてくれるらしい。めちゃ便利じゃね?

lsyncd

参考URLにあるように、デフォルトではrsync --deleteオプション付きなので注意。また、permissionを変更しただけでは反映されない。inotify自体はpermissionの変更も検知するみたいだけど。lsyncdの仕様?
lsyncd.conf.xmlrsyncに"-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

Unix的なアレの中の人の設定

lsyncd.conf.xmlを使わずに、/etc/lsyncd.confというファイルで設定されてて、書式がすげー簡素で便利そう。と思って記事をよく読むと、起動スクリプト内でawkを使って/etc/lsyncd.confからsrc, dst, host情報を取ってきて、lsyncdの引数に渡して直接起動している模様。