rsyncとlsyncdでリアルタイムにディレクトリを同期する

· 2 min read
rsyncとlsyncdでリアルタイムにディレクトリを同期する


差分を算出してファイルやディレクトリを同期してくれるrsyncと
ローカルファイルへの変更を監視してくれるlsyncdを組み合わせることで
リアルタイムにディレクトリを同期することができます。

lysncdとrsyncを連動する方法は二つあります。
・SSHを通してrsync同士が通信する方法
・バックアップ先でrsyncデーモンを動かす方法

rsync をデーモンモードで動作させることで
rsyncプロトコル(rsync://)による同期が可能になり
SSHを利用する場合より、暗号化によるオーバヘッドがなく高速で同期することができます。

前提環境

ホストOS IPアドレス 同期対象ディレクトリ
マスター CentOS6.8 10.0.0.6 /var/www/html/
スレーブ CentOS6.8 10.0.0.7 /var/www/html/

同期対象のディレクトリはapacheのデフォルトのドキュメントルートを指定するので
予めapacheのインストールも必要になります。

lsyncd + rsyncのインストール

マスター側には「lsyncd rsync」、スレーブ側には「rsync」を設定します。

\\マスター側
# yum -y install lsyncd
# yum -y install rsync

\\スレイブ側
# yum -y install xinetd
# yum -y install rsync

これでインストールは完了。

lsyncdの設定をする [マスター側]

lsyncd.confを設定します。
/etc/lsyncd.confの中に下記を追記します。

# vi /etc/lsyncd.conf

settings{
    logfile = "/var/log/lsyncd.log",
    statusFile = "/tmp/lsyncd.stat",
    statusInterval = 1,
}
sync{
    default.rsync,
    source="/var/www/html/",
    target="10.0.0.7::sync", 
    rsync = {
     _extra = {  "-a" },
   }
}

ちょこっと解説しておくと、logとかstatusは適当に設定して、
syncという項目の中で、同期元ディレクトリ(source)と同期先(target)を設定しておきます。

同期先のtargetには::以降にsyncとありますが、ここは何でもいいです。
ここはrsyncdのモジュール名ということでrsyncd側に設定する文字列と同じであればよいといった感じです。

lsyncdの起動 [マスター側]

自動起動の設定をして…

# chkconfig lsyncd on

lsyncdを起動。その他の諸々設定をしてないので、ここでは起動しないです。

# /etc/rc.d/init.d/lsyncd start

rsyncの設定をする [スレーブ側]

スレーブ側の設定はxinetdの設定とrsyncの設定になります。
xinetdの設定がファイルを変更します。

# vi /etc/xinetd.d/rsync

service rsync
{
    disable = no  # yes から no に変更します。
    flags = IPv6
    socket_type = stream
    wait = no
    user = root
    server = /usr/bin/rsync
    server_args = --daemon
    log_on_failure += USERID
}

userはrootじゃない方がいいかもしれないんですが、rootでも動くのでこれでいいです。
そもそもこのconfigファイルはxinetdで/usr/bin/rsyncを叩いてますよっていう意味の設定ファイルなので
それが満たされていれば充分といった内容になっています。

# chkconfig xinetd on
# service xinetd start

自動起動設定もしておいて、起動というところです。

rsyncd.confの設定 [スレーブ側]

スレーブ側のrsyncdの設定をします。(xinetdに叩かれた際の挙動になります。)

# vi /etc/rsyncd.conf

# マスター側で設定したlsyncd.conf内のtargetと同じ命名規則
[sync]
# コピー先対象ディレクトリ
path = /var/www/html/
hosts allow = localhost 10.0.0.6
list = true
uid = root
gid = root
read only = false
port = 873

肝は[sync]の箇所で、これがリアルタイムで同期をする際のモジュールみたいなものになります。

lsyncで設定したtargetの部分がここになります。
この[sync]の中身が実行されます。同期先のディレクトリ、許可するホストなどなど設定します。

同期先のディレクトリ、許可するホストなどなど設定します。
その他、portが873っていうのと、hostをallowしておくことぐらいでしょうか。その他はコピペで大丈夫そうです。

マスター側のlsyncdを起動する。

順番が前後してしまいましたが、もう一度lsyncdを起動しておきます。
本来はスレーブ側でxinetdとrsyncの設定を済ませてから、マスター側の設定になるので
もう一度lsyncdを起動してきます。

# /etc/rc.d/init.d/lsyncd start

ここまでできたら、だいたい完成です。
xinetdを起動してrsyncdを動かせるようにしておきます。lsyncが差分検知してrsyncd(マスター側)が送信して
xinetdがそれを受けてrsyncd (スレイブ側)が起動します。いろんなエラーが出て困った場合は、最低限の設定にしてみてください。

# less /var/log/lsyncd.log 

Mon May  1 00:31:17 2017 Normal: recursive startup rsync: /var/www/html/ -> 10.0.0.7::sync/
Mon May  1 00:31:22 2017 Normal: Startup of "/var/www/html/" finished.
Mon May  1 00:32:12 2017 Normal: Calling rsync with filter-list of new/modified files/dirs

ログにもきちんと吐かれてますね。試しにtestファイルを生成してみましたが
きちんと同期できておりました。

※余談
ちなみ、スレーブ側のファイルをいろいろやるとどうなるんですか?と思われるかもしれませんが
かなりおかしなことになるので、「触らない」ということにしておいてください。(すごくいろいろ考えたい人はGoogleさんへ)