2016年1月23日土曜日

rsyncがあればlsyncもある。

ロードバランサ配下などで、複数のサーバ間でコンテンツの同期を取りたいときがあります。
いつまでたってもAWSのEFSが東京リージョンにこないし、個人的にNFSには過負荷時の謎の挙動など辛い思い出が多い。
かといって、Cronで定期的にrsyncというのもラグがあるしスマートじゃないなと調べていたところ、
ぴったりな記事を発見

rsyncがあるんだからlsyncがあっても不思議ではないよね。と思いながら、いざ検証しようとするも、lsyncのバージョンが違うので、設定ファイルの記述がそもそも違う。とか実はrsyncやxinetdはいらないんじゃないか?とか色々はまりました・・・

同期の罠については、ここが参考になりました。
また、lsyncの2.1系での設定についてはここが参考になりました。

いきなり双方向同期の設定は理解するのが難しいので、まずは検証ということで片方の同期を例に挙げます。

構成としてはこんな感じです。

サーバOYABUNに加えられた変更(追加や削除、編集など)を検知し、KOBUNサーバに反映させます。
反映させる通信手段としてSSH経由でrsyncかけます。ので、OYABUNとKOBUNの間でSSH接続を許可するのと、KOBUNサーバへ接続する秘密鍵をOYABUNサーバに設置しておきます。
ここまでがKOBUNサーバでやっておくことです。
以下はOYABUNサーバでの作業になります。

まずは、OYABUNサーバにlsyncをインストールします。
yum install --enablerepo=epel lsyncd
次にlsyncの設定をします。
前提条件として、
  • KOBUNへ接続するユーザはwebmaster
  • 秘密鍵はOYABUNサーバの/home/webmaster/.ssh/webmaster_id_rsa
  • 同期するディレクトリは/var/www/html/images/と/var/www/somecontents/の2つ
とします。
/etc/lsync.confに設定がありますので、以下のように設定します。
KOBUNのところは実際はIPアドレスになります。

settings{
        statusFile = "/var/log/lsyncd.status",
        logfile = "/var/log/lsyncd/lsyncd.log",
        nodaemon = false,
        insist = 1,
}
sync {
    default.rsync,
    delay = 0,
    source = "/var/www/html/images/",
    target = "webmaster@KOBUN:/var/www/html/images/",
    delete = 'running',
    rsync = {
        rsh = "/usr/bin/ssh -i /home/webmaster/.ssh/webmaster_id_rsa -o StrictHostKeyChecking=no"
    }
}
sync {
    default.rsync,
    delay = 0,
    source = "/var/www/somecontents/",
    target = "webmaster@KOBUN:/var/www/somecontents/",
    delete = 'running',
    rsync = {
        rsh = "/usr/bin/ssh -i /home/webmaster/.ssh/webmaster_id_rsa -o StrictHostKeyChecking=no"
    }
}
このように、syncのところに複数書くと、複数のディレクトリを監視し、同期を取ることが出来ます。
今回はデーモンで動かしたいので、nodaemonはfalseにしています。
なお、rsync以外にも、S3で同期など色々出来るようです参考
また、設定ファイルの=はちゃんと両端にスペースを入れないと反映されなかったり挙動がおかしくなるので注意です。あとrsyncと同様最後は/で終わらせておくのが無難です。

設定が終わりましたら、起動と自動起動設定をします。
/etc/rc.d/init.d/lsync start
chkconfig lsync on
では、OYABUNサーバの/var/www/somecontentsに何か適当なファイルを作成してみましょう。
ほぼリアルタイムでファイル作成を検知し、rsyncにてKOBUNサーバに反映されます。
この設定をKOBUN側からOYABUN側に設定すれば、双方向同期ができます。
・・・が、2台ならいいですが、3台以上になると、双方向同期はカオスになるので、素直にNFSなりにしましょう。





0 件のコメント:

コメントを投稿