lsyncd は rsync をinotify で実行する.つまりファイルが書き換わったら転送。
ディレクトリを監視して,ファイルが更新されたら転送.同期.
以外と便利で,ファイルがワープするみたいな感覚になった。これはオススメかもしれない.
lsyncd の特長
- 同期ミラー構築ツール
- lsync はリアルタイムでファイルを同期する.
- ファイル・フォルダを監視する.
- ファイルが更新されたら同期コマンド実行
二つのディレクトリを監視して、更新されたら、同期を取ります。新規追加・削除も同期可能です.n個のディレクトリでも使えます.
lsyncd の中身
drdb など他のミラーソフトとの違い
- lsync は ファイル単位.
- drdb はブロック単位
- LVM ミラーはパーティション。
つまり lsync はファイル単位で同期をすることがポイントです.
ぶっちゃけると、MySQLでミラー構築面倒だし、PHPのセッションサーバー面倒だし.PHPはセッションにファイル使うんだ。PHPセッション管理にはコレで良いんジャネ?
インストール
インストールは apt で一発ですね
sudo aptitude install lsyncd 以下の新規パッケージがインストールされます: lsyncd 0 個のパッケージを更新、 1 個を新たにインストール、 0 個を削除予定、84 個が更新されていない。 26.8 kB のアーカイブを取得する必要があります。 展開後に 119 kB のディスク領域が新たに消費されます。 取得:1 http://jp.archive.ubuntu.com/ubuntu/ natty/universe lsyncd amd64 1.34-1 [26.8 kB] 26.8 kB を 0秒 秒でダウンロードしました (87.5 kB/s) 未選択パッケージ lsyncd を選択しています。 (データベースを読み込んでいます ... 現在 173655 個のファイルとディレクトリがインストールされています。) (.../lsyncd_1.34-1_amd64.deb から) lsyncd を展開しています... man-db のトリガを処理しています ... lsyncd (1.34-1) を設定しています ...
実験用ディレクトリを準備
実験用ディレクトリを作ります.まずは同サーバー内での同期
/tmp/origin [元] /tmp/target [先]
つくった
mkdir /tmp/origin sudo chmod 777 /tmp/origin mkdir /tmp/target sudo chmod 777 /tmp/target
rsyncd 設定
設定をつくる
sudo tee /etc/rsyncd.conf << EOF uid = root gid = root log file = /var/log/rsyncd.log pid file = /var/run/rsyncd.pid [my_sync_config] comment = rsync server for my test path = /tmp/target hosts allow = localhost read only = false EOF
設定出来た
なんか気になったこと.lsyncd は ファイル更新データで rsyncd を使って同期をする。基本はrsync になります.ubuntu には rsyncd.conf が作られていないので,じぶんで作って使います.
rsyncd を起動
設定出来たら rsyncd を起動します.
sudo rsync --daemon
起動を確認
takuya@atom:~$ ps `cat /var/run/rsyncd.pid` PID TTY STAT TIME COMMAND 1921 ? Ss 0:00 rsync --daemon
起動した
lsyncd で監視・転送を開始
じゃぁ転送開始しましょう
sudo lsyncd /tmp/origin atom::my_sync_config
lsync監視が起動できたことを確認
takuya@atom:~$ ps aux | grep lsy root 2016 0.0 0.0 14340 396 ? Ss 02:15 0:00 lsyncd /tmp/origin atom::my_sync_config
起動できたよ!!
さっそく動作確認してみる.
まず転送元にファイルを作る
touch /tmp/origin/sample takuya@atom:~$ ls -l /tmp/origin 合計 0 -rw-r--r-- 1 takuya takuya 0 2011-05-28 02:18 sample
転送先を確認する.
takuya@atom:~$ ls -l /tmp/target 合計 0 -rw-r--r-- 1 root root 0 2011-05-28 02:18 sample
転送されてる!
転送元が takuya:takuya で転送先が root:root なので確かに、作成されていますね.
たくさんファイルを作って同期してみます.
転送元
takuya@atom:~$ for i in {1..10} ; do touch /tmp/origin/$i; done takuya@atom:~$ ls -lt /tmp/origin/ 合計 0 -rw-r--r-- 1 takuya takuya 0 2011-05-28 02:22 10 -rw-r--r-- 1 takuya takuya 0 2011-05-28 02:22 7 -rw-r--r-- 1 takuya takuya 0 2011-05-28 02:22 8 -rw-r--r-- 1 takuya takuya 0 2011-05-28 02:22 9 -rw-r--r-- 1 takuya takuya 0 2011-05-28 02:22 5 -rw-r--r-- 1 takuya takuya 0 2011-05-28 02:22 6 -rw-r--r-- 1 takuya takuya 0 2011-05-28 02:22 3 -rw-r--r-- 1 takuya takuya 0 2011-05-28 02:22 4 -rw-r--r-- 1 takuya takuya 0 2011-05-28 02:22 1 -rw-r--r-- 1 takuya takuya 0 2011-05-28 02:22 2
転送先
takuya@atom:~$ ls -lt /tmp/target/ 合計 0 -rw-r--r-- 1 root root 0 2011-05-28 02:22 1 -rw-r--r-- 1 root root 0 2011-05-28 02:22 10 -rw-r--r-- 1 root root 0 2011-05-28 02:22 2 -rw-r--r-- 1 root root 0 2011-05-28 02:22 3 -rw-r--r-- 1 root root 0 2011-05-28 02:22 4 -rw-r--r-- 1 root root 0 2011-05-28 02:22 5 -rw-r--r-- 1 root root 0 2011-05-28 02:22 6 -rw-r--r-- 1 root root 0 2011-05-28 02:22 7 -rw-r--r-- 1 root root 0 2011-05-28 02:22 8 -rw-r--r-- 1 root root 0 2011-05-28 02:22 9
同期されてる.
一気にこれだけ同期されていると、なんか気持ち良い!!
削除も同期されるのか?
takuya@atom:~$ touch /tmp/origin/test2 #ファイル作って takuya@atom:~$ ls /tmp/target/test2 #同期されたので test2 takuya@atom:~$ rm /tmp/origin/test2 #元ディレクトリから消す takuya@atom:~$ ls /tmp/target/test2 ls: /tmp/target/test2にアクセスできません: そのようなファイルやディレクトリはありません
削除も反映される.
転送先でファイル削除するとどうなる?
takuya@atom:~$ sudo rm /tmp/target/test1 takuya@atom:~$ ls /tmp/target/ test2 takuya@atom:~$ touch /tmp/origin/test2 takuya@atom:~$ ls /tmp/target/ test1 test2
ターゲットを消しても,元ディレクトリにファイルが残っていれば再度転送される.
消しちゃったファイルが復活したのでこれで正しい.
Rsyncを転送先をミラーするモードで実行している。つまり転送先の変更をPullするのは出来ない.
転送設定を変えて、双方向ミラーにする
lsync が使っている rsync を考慮して双方向のミラーを作ってみる.
なんかatmarkit でこんな質問を見つけた.
調査した結果、rsync、unisonを使う例が多かったのですが、それぞれ、 1.rsync+lsyncでリアルタイムミラーリングはできるが、双方向での同期ができない 2.unisonを使うと双方向で同期をとれるがリアルタイムではない という部分があり、期待する機能になっていません。複数サーバ間でリアルタイムにファイルを同期させたい - Linux Square会議室
@ITのこのスレはツッコミどころ満載のように思えたけど。
だけど,質問に「真面目に」回答をしてみる.
lsync でも rsyncで双方向ミラーが出来ます.lsync は rsync を使っています。lsync の双方向のミラーはrsyncと同じようにすれば出来そうと想像が付きます.
rsync -a --update DirA DirB rsync -a --update DirB DirA
とやれば同期が出来る.
ただしrsyncの場合は削除同期順序を考えないと大変です。なぜなら新規作成か削除かがお互い分からないからです.
lsync でもrsync と同じように、2つの同期を起動すればいいでしょう
サーバーA ---> サーバーB サーバーB ---> サーバーA
そこで設定を二つ書いてみる.
/etc/rsyncd.conf
1 uid = root 2 gid = root 3 log file = /var/log/rsyncd.log 4 pid file = /var/run/rsyncd.pid 5 [my_config01] 6 comment = rsync server for my test 7 path = /tmp/target 8 hosts allow = atom 9 read only = false 10 [my_config02] 11 comment = rsync server for my test 12 path = /tmp/origin 13 hosts allow = atom 14 read only = false
2個の同期設定を作って、インスタンスを二つ起動する.
sudo lsyncd /tmp/origin atom::my_config01 sudo lsyncd /tmp/target atom::my_config02
これで双方向にミラーされます.一件落着
注意事項:この設定の場合、削除と新規作成がほぼ同時に行われると作ったファイルが消されたり,消したファイルが復活したりする可能性もある.
頻繁に大勢でファイルを消したり付くる場合には向いていない。
lsync双方向のミラー削除の動作の特長は「更新タイミングで rsync を起動する」こと。この動作のおかげで,ファイル削除が同期トリガーになり同期開始するため、同期による削除ミスが少なくなります。ほぼ同時更新などの場合は動作がおかしくなるかも
同期をより完璧にするなら
inotify をもっと厳密に 取り出せばいいんじゃないの?
inotify は 新規・追加・削除・更新の各イベントで通知してくれるので,
削除イベントで同期先を削除
新規イベントで同期先を新規追加
すれば確実でミスも少ないよね.Rubyでパパッと書いてみればいい。今度やって見ようかな.
lsync の感想
WinSCPのようなリアルタイム転送をシンプルに実現したいと想っていた.DRDBといったハードディスクのミラーも使えるが、あれはパーティション単位で設定が面倒.しかもブロック単位と面倒。
lsyncd という新進気鋭のライブラリはそういうところ簡単にしてくれる.ファイルにデータ書いて保存&同期すればいいじゃん.と言うこと。もしかしたらpuppet より使いやすいかもしれない.
rsync は便利で活用していますが、同期の度に起動するのもが面倒でした.Cronで定期バックアップだと同期タイミングが遅くて気に入らない.WinSCPに搭載されているミラーリングのように、自動で更新して欲しいと想っていた。WinSCPの同期が便利だなーと思ってたので結構活用できそう.