差分を算出してファイルやディレクトリを同期してくれる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さんへ)