バックグランドで特定フォルダを監視して、定義に基づき処理を行うデーモン
本家様https://github.com/axkibe/lsyncd/wiki
特定フォルダにファイルが作られる(CREATE)、変更(MODIFY)、削除(DELETE)らをトリガーにして処理が行われる。
DRBDのようなブロックレベルのミラーリングでもいいのだが、ファイルシステムレベルで動くのがこれみたい。
ファイルレベルな物なので、ミラーされる側のPCに特別な措置は不要。rsyncdやsshdが動いていればいいみたい。
ここでは、ローカルの/homeを監視して、作成、変更、削除があれば、ミラー先(c105)の/homeに反映させることとを想定する。
NFSサーバとかのファイルサーバが対象となるだろう。
pkgs.orgサイトで調べてみるとhttp://pkgs.org/search/lsyncd
epelリポジトリで入手可能なようだ。CentOS7でepelリポジトリを組み込むにはここを参照yum
[root@c ~]# yum --enablerepo=epel install lsyncd
インストールしたパッケージは「lsyncd-2.1.5-6.el7.x86_64」
設定ファイルは「/etc/lsyncd.conf」となる。
設定ファイルの中身は
----
-- User configuration file for lsyncd.
--
-- Simple example for default rsync, but executing moves through on the target.
--
-- For more examples, see /usr/share/doc/lsyncd*/examples/
--
sync{default.rsyncssh, source="/var/www/html", host="localhost", targetdir="/tmp/htmlcopy/"}
となっている。「--」はコメント行。デフォルトで書かれている内容は
「/var/www/html」の内容をrsync+sshでlocalhost内の「/tmp/htmlcopy/」にコピーを行う設定である。
ここでは ローカルの/home を c105の/home に移したいので
[root@c ~]# vi /etc/lsyncd.conf
settings {
logfile = "/var/log/lsyncd/lsyncd.log",
}
sync{
default.rsyncssh,
source="/home",
host="c105",
targetdir="/home",
rsync = {
compress = false,
archive = true,
_extra = {"--bwlimit=125"},
rsh = "ssh -i /root/.ssh/lsyncd_dsa", -- ssh経由にして、秘密鍵を指定(後述)
}
}
[root@c ~]# mkdir /var/log/lsyncd
とします。rsync+sshで 圧縮はなし(compress = false)で、転送速度を 125KBps(1Mbps) とします。
*詳細はこちら https://github.com/axkibe/lsyncd/wiki/Manual-to-Lsyncd-2.1.x
lsyncdをデーモンで動かして、変化があったら即座に相手側c105にファイルを送る、削除する。
そのため、パスワードなしで rsync を行う必要がある。
*/homeを扱うのでrootでrsyncを行います
rsyncでも示しているが、lsyncd を実行する側(ローカル)で rootの公開鍵・秘密鍵 を作ります。
既存にある公開鍵・秘密鍵を使ってもいいが、lsyncd のための公開鍵・秘密鍵を作りましょう
[root@c ~]# ssh-keygen -t dsa -f .ssh/lsyncd_dsa
Generating public/private dsa key pair.
Enter passphrase (empty for no passphrase): <--- リターンキーのみを叩きパスフレーズを登録しない
Enter same passphrase again: <--- 再度リターンキーのみを叩く
(略)
[root@c ~]#
[root@c ~]# ls -l .ssh/lsyncd_dsa*
-rw------- 1 root root 672 5月 7 12:19 .ssh/lsyncd_dsa
-rw-r--r-- 1 root root 608 5月 7 12:19 .ssh/lsyncd_dsa.pub
[root@c ~]#
この作った 公開鍵「.ssh/lsyncd_dsa.pub」の中身をミラー先(c105)の /root/.ssh/authorized_keysに追記します。
*追記するファイル名(authorized_keys)は、/etc/ssh/sshd_configの AuthorizedKeysFile で定義されています
[root@c ~]# ssh root@c105 'mkdir .ssh && chmod 700 .ssh'
[root@c ~]# ssh root@c105 'cat > .ssh/authorized_keys' < .ssh/lsyncd_dsa.pub #ローカルの.ssh/lsyncd_dsa.pubをc105に渡す
[root@c ~]# ssh root@c105 'chmod 600 .ssh/authorized_keys'
追記が完了したらパスフレーズなしの秘密鍵・公開鍵のテストを行ってみます。
[root@c ~]# ssh -i .ssh/lsyncd_dsa root@c105 # -i を設けて秘密鍵を指定します
[root@c105 ~]#
これでパスフレーズなしで行けることを確認した。
[root@c ~]# systemctl enable lsyncd.service
[root@c ~]#
[root@c ~]# systemctl start lsyncd.service
これで起動時に同期が開始され、その後に変化があったら c105:/home にも反映されます。
iftopコマンドで見て見ると
と確かに設定した 1Mbps でコピーされている
パーミッションの関係でroot同士で rsync+ssh を行ってます。
ファイルサーバとか lsyncd を稼働させるサーバのsshdは PermitRootLogin noでいいですが、
ミラー先となるマシンでは、rootでの接続が必要なので、
PermitRootLogin yes
とする必要があります。
加えて最低限PasswordAuthentication noとして
公開鍵方式でないとログインできないような構成にすべきかも。
設定ファイルにinit = false を入れるとlsyncd起動時に同期は行われない。
また、delete = false を入れると、source側のファイルが削除されてもコピー先は削除されません。
[root@c ~]#
settings {
logfile = "/var/log/lsyncd/lsyncd.log",
}
sync{
default.rsyncssh,
source="/home",
host="c105",
targetdir="/home",
init = false, --- 初回起動時に同期させない
delete = false, --- rsync に '--delete'を含まない
rsync = {
compress = false,
archive = true,
_extra = {"--bwlimit=125"}, --- 転送速度を 125KBps(1Mbps)
rsh = "ssh -i /root/.ssh/lsyncd_dsa",
}
}
[root@c ~]# mkdir /var/log/lsyncd
[root@c ~]# /etc/init.d/lsyncd start