はじめに

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

lysncdとrsyncを連動する方法は二つある。
一つは、SSHを通してrsync同士が通信する方法で、もう一つがバックアップ先でrsyncデーモンを動かす方法になる。
rsync をデーモンモードで動作させることで、rsyncプロトコル(rsync://)による同期が可能になり、SSHを利用する場合より、暗号化によるオーバヘッドがなく高速で同期することができる。

rsync over SSH + lsyncd

1.rootでパスワードなしの公開鍵でログインできるようにしておく。(参考

2.lsyncdの設定ファイルを作成する。

# vi /etc/lsyncd.conf

----
-- User configuration file for lsyncd.
--
-- Simple example for default rsync.
--
settings{
    logfile = "/var/log/lsyncd.log",
    statusFile = "/var/log/lsyncd.stat",
    delay = "1",
}

sync{
    default.rsync,
    source="/sourcedir/",
    target="172.16.5.149:/sourcedir/",
    rsync = {
        copy_links = true,
        perms = true,
        owner = true,
        group = true,
        verbose = true,
        times = true,
    },
}

syncのtargetは「IPアドレス」:「ディレクトリ名」。 rsyncオプションにはrsyncコマンドで指定したいものと同じオプションを記載する。
ファイルを更新してからlsyncdがrsyncを呼び出してくれるまでの時間差をdelayで指定する。デフォルトは15秒もあるので、リアルタイム性をできるだけ追求するために1等小さい値を入れておく。

3.lsyncdの自動起動設定

# chkconfig lsyncd on

4.lsyncdの起動

# /etc/init.d/lsyncd start

rsyncd + lsyncd

1.rsyncdの設定ファイルを作成する。

# vi /etc/rsyncd.conf

transfer logging = true
log format = %h %o %f %l %b
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
hosts allow = localhost 172.16.1.0/24
hosts deny = *

use chroot = no

[srcdir]
path = /sourcedir
uid = root
gid = root
read only = false
auth users = root
secrets file = /etc/rsync.secrets

2.パスワードを利用する場合は、secrets fileにパスワードを記載したファイルを指定する。(パーミッションは600)

# ll /etc/rsync.secrets
-rw------- 1 root root 15  4月  1 23:38 2013 /etc/rsync.secrets
# cat /etc/rsync.secrets
root:rsyncpass

3.設定ファイルの記載が終わったら、xinetdにrsyncを登録して、xinetd経由でクライアントにアクセスしてもらう。

※/etc/rc.dにおくrsyncの起動スクリプトは不要で、/etc/xinetd.dに起動設定ファイルをおく。

# vi /etc/xinetd.d/rsync

# default: off
# description: The rsync server is a good addition to an ftp server, as it
# allows crc checksumming etc.
service rsync
{
    disable = no
    socket_type = stream
    wait = no
    user = root
    server = /usr/bin/rsync
    server_args = --daemon
    log_on_failure += USERID
}

4.rsyncdのポートを開放する。

# iptables -A INPUT -p tcp --dport 873 -j ACCEPT

5.自動起動

# chkconfig xinetd on

6.確認

# chkconfig rsync --list
rsync on

7.lsyncdの設定ファイルを作成する。

# vi /etc/lsyncd.conf

settings{
    logfile = "/var/log/lsyncd.log",
    statusFile = "/var/log/lsyncd.stat",
    delay = "1",
}

sync{
    default.rsync,
    source="/sourcedir/",
    target="172.16.5.149::srcdir",
    rsync = {
        copy_links = true,
        perms = true,
        owner = true,
        group = true,
        verbose = true,
        times = true,
        password_file = "/etc/rsync.passwd",
    },
}

syncのtargetは「IPアドレス」::「rsyncd.confで設定したパス名」。
rsyncオプションにはrsyncコマンドで指定したいものと同じオプションを記載する。
ファイルを更新してからlsyncdがrsyncを呼び出してくれるまでの時間差をdelayで指定する。デフォルトは15秒もあるので、リアルタイム性をできるだけ追求するために1等小さい値を入れておく。

8.lsyncdの自動起動設定

# chkconfig lsyncd on

9.lsyncdの起動

# /etc/init.d/lsyncd start

注意事項

lsyncdがデフォルトで監視対象にしてくれるファイル数は8192に制限されている。これ以上のファイル数を監視対象にしたい場合は、inotify のカーネルパラメーターを増やす必要がある。

# vi /etc/sysctl.conf
fs.inotify.max_user_watches = 30000

sysctl.confに設定を記述した後は、有効にするためにsysctl -p コマンドを実行する。

# sysctl -p