[TIPS] lsyncd が2.0にバージョンアップしていた

[TIPS] が2.0にバージョンアップしていた以前、『lsyncdとrsyncdでミラーリング』という記事を書きましたが、あれ以来lsyncdにはかなりお世話になっています。

で、RHETOLOサーバでもバックアップと負荷分散のために導入しようとしたところ、lsyncdのバージョンが上がっていました(遅)

現時点(2011/7/31)での最新バージョンは 2.0.4 で、こちらからダウンロードできます。
inotifyを利用してファイルの変更を検知し、rsyncdを起動する、、という本来の機能には変わりありませんが、最も大きな変更点としては設定ファイルのフォーマットが今までのXMLからLuaになったという点ですね。

ということで、早速使ってみました。


インストールっ


 
インストールやrsyncd関連についてはほぼ今までと同様でOKですので、詳細は以前の記事をご覧頂きたい(手抜き)のですが、バージョン2.xからビルドにはLuaライブラリが必要となりますので、先にインストールしておきましょう。

現在の最新版は5.1.4で、公式サイトからtarballがダウンロードできますし、EPELリポジトリにRPMパッケージもあるようですね。
今回はtarballからインストールしましたが、make & make install でOKでした。

[shell]
% make linux
# make install
[/shell]

 

make 時にプラットフォーム指定が必要ですが、「make」とだけ叩くとリストが表示されます。

[shell]
% make
Please do
make PLATFORM
where PLATFORM is one of these:
aix ansi bsd freebsd generic linux macosx mingw posix solaris
See INSTALL for complete instructions.
[/shell]

 


Lua がインストールできたらlsyncdをさくっとビルド&インストールしましょう。Luaのヘッダの場所とライブラリを環境変数で指定しておくとハッピーになれるかもしれません。あと、CentOS5.5でビルドするには libm と libdl を追加指定する必要があるようです。

[shell]
% ./configure LUA_CFLAGS=-I/usr/local/include LUA_LIBS="-L/usr/local/lib -llua" LIBS="-lm -ldl"
[/shell]

※luaのインストール先に合わせてパスを変更してください

[shell]
% make
# make install
[/shell]

 

これでインストールは完了です。あ、rsyncのインストールも忘れずに。

設定っ


 
さて、では設定してみましょう。前回の記事にならって
  • ファイル配布サーバ – srchost : 192.168.254.1
  • ファイル配布サーバ – dsthost : 192.168.254.2
  • ファイル格納場所はいずれも /home/www/htdocs ディレクトリ
という前提にしておきますね。ファイルの配布先(=受け取る方)サーバのrsyncとかsshの設定は前回の記事を御覧ください(手抜き)。

lsyncdの起動方法については今まで通りコマンドラインで指定する方法と設定ファイルを使用する方法があります。
コマンドラインであれば
  • lsyncd [オプション] <接続方法> <配布元> <配布先>

 
設定ファイルを使用するには
  • lsyncd [オプション] 設定ファイル

 
という書式が基本になります。接続方法には
  • -    rsyncプロトコルを使用する
  • -rsyncssh sshコマンドを利用したファイル移動を使用する
  • -direct    リモートではなくローカルでの同期を行う

 
があるようです。
オプションとしてはディレイ(遅延)の指定やログ関連のものがありますので、man lsyncd もしくは lsyncd -help でご確認下さい。


 
今回はすっ飛ばして設定ファイルを利用する方法を。

設定ファイル


 
さて、今までの設定ファイルはXML形式でしたが、前述のとおり2.xからはLuaで記述します。こんな感じですね。
  • /usr/local/etc/lsyncd.lua

 

[plain]
settings = {
logfile = "/var/log/lsyncd.log",
pidfile = "/var/run/lsyncd.pid",
statusFile = "/var/run/lsyncd.stat",
statusInterval = 10,
}
sync {
default.rsync,
rsyncOps = {
"-auzr4",
"–delete"
},
excludeFrom = "/usr/local/etc/lsyncd.exclude",
source = "/home/www/htdocs/",
target = "192.168.254.2::wwwroot",
}
[/plain]
 

settings グローバル変数


 
ここでlsyncd全体の設定を指定することができます。それぞれの設定項目は「キー=値」という形で指定し、項目のキーとしては
  • logfile
  • nodaemon
  • statusFile
  • statusInterval
  • logfacility
  • logident
  • inotifyMode
  • maxDelays
  • maxProcesses

 
があります。それぞれの項目の詳細についてはlsyncdのドキュメントをご覧頂くとして、上の例では
  •     logfile = “/var/log/lsyncd.log”,   — ログファイルの指定
  •     pidfile = “/var/run/lsyncd.pid”,   — PIDファイルの指定
  •     statusFile = “/var/run/lsyncd.stat”,  — ステータス管理ファイルの指定
  •     statusInterval = 10,    — ステータスの更新頻度(秒)

 
という指定を行っています。

さて、その次が肝である同期の指定ですが、
[plain]
sync {
デフォルト,
source="配布元ディレクトリ",
target="配布先",
}
[/plain]

 
という書式で指定します。

「デフォルト」

予め幾つかの基本設定がデフォルトとして組み込まれており、それをさくっと選択して指定することができます。
現状、
  • default.rsync
  • default.rsyncssh

 
の2つから選択します。上の例では rsync の基本設定をデフォルトとして選択しているわけですねー。

もちろん、基本設定は sync{} ブロックの中で上書きすることができ、rsyncOptsやinit、exclude・excludeFromなどがあります。ちなみに、指定の順番や改行は特に意味が無く無視されるようです。
  • rsyncOpts
    名前の通り、rsyncコマンドへのオプション指定です。これに複数のオプションを指定する(= rsync に複数のオプションを指定する)場合は、上の例のように rsyncOpts = {“オプション1”, “オプション2”, …} と記述することで、実行時に “rsync オプション1 オプション2 …”と展開されます。
  • init
    lsyncd起動時の初期同期を行うかどうか指定します。デフォルトはtrueで、初期同期を行います。falseにするにはlsyncd起動時に双方の同期がとれていることが保証されている必要がありますね。
  • excludeexcludeFrom
    同期対象から除外するファイル/ディレクトリのパターンを指定できます。パターンを記述したファイルを excludeFromで指定することもできます。上の例では除外パターンを記述したファイル/usr/local/etc/lsyncd.excludeを指定しています。除外パターンはこんな感じ。
    • 文字列:対象ファイルパスの一部に一致
    • /で始まる:対象ファイルパスの先頭に一致
    • /で終わる:対象ファイルパスの終端に一致
    • ?: “/”以外の任意の一文字にマッチ
    • *: “/”以外の任意のゼロ個以上の文字にマッチ
    • **: 任意のゼロ個以上の文字にマッチ(“/”も含む)

 

複数ディレクトリを監視させる


 
これは単純に sync {} ブロックをずらずら並べておけばOK!簡単ですねー!
しかし調子に乗って大量のファイルやディレクトリのある場所を指定しまくると、inotifyの監視最大ディレクトリ数の上限を超えてしまうので、要注意ですっorz


 

 
さてさて、こんな感じで設定したところ、RHETOLOサーバでは(ディレクトリ数上限の件を除いて)快調に同期しまくってくれています。非常に大雑把&手抜きで駆け足の説明でしたが、何かのお役に立てたら幸いです。


 
なお、lsyncdの進化はこれだけではなく、Luaを採用したことで
  • onCreate/onModify/onDelete/onMove 等のイベントに対するハンドラを書く
  • そのハンドラの中でlog()やspawn()、spanShell()なんていう関数を使う
  • さらにはlsyncdのデフォルトの挙動や基本設定をオーバーライドする

 
なんてことができるようになったそうです。

公式サイトには
  • ファイルが更新されたらパーミッションをチェックして揃える
    http://code.google.com/p/lsyncd/wiki/ExampleGForce
  • 投げ込まれた画像ファイルを自動で加工する「magicディレクトリ」を実現させる
    http://code.google.com/p/lsyncd/wiki/ExampleAutoImageMagic

 
なんて設定例が掲載されていますので、こちらもご覧あれ。
この辺もうまく使うと開発時に
  • 「うわパーミッション無くて上書きできねぇ|ι´Д`|っ」
  • 「画像アップロードの度にサムネイル生成かぁ。。(´・ω・`)」

 
なんていうトラブルや、運用のちょっとした手間が減ったりするかもですね。ちょっと調べて&試してみたらまた記事に起こしますね~!

・・・・いつになることやら(´・ω・`)

  1. コメント 0

  1. トラックバック 0

return top