それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

lsyncd を使ってWinSCP的なリアルタイム同期を実現する.使い方

lsyncd は rsync をinotify で実行する.つまりファイルが書き換わったら転送。

ディレクトリを監視して,ファイルが更新されたら転送.同期.


以外と便利で,ファイルがワープするみたいな感覚になった。これはオススメかもしれない.

lsyncd の特長

  • 同期ミラー構築ツール
  • lsync はリアルタイムでファイルを同期する.
  • ファイル・フォルダを監視する.
  • ファイルが更新されたら同期コマンド実行

二つのディレクトリを監視して、更新されたら、同期を取ります。新規追加・削除も同期可能です.n個のディレクトリでも使えます.

lsyncd の中身

  • 更新監視には inotify を使用
  • ファイル更新タイミングでrsync 実行
  • 受け側には rsyncd を使う
  • 送信先には rsync 使う
  • rsync オプションは任意指定可能

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の同期が便利だなーと思ってたので結構活用できそう.