Linux > lsyncd ローカルファイルによるミラーリング

lsyncd を使ったファイルのミラーリング・バックアップ

lsyncd とは Live SYNCing (Mirror) Daemon の略である。≒ そこそこリアルタイムにファイルをミラーすることができるデーモンで Google Code から提供されている。
設定とソフトウェアの構成次第でリモートマシンへのミラーも可能。

lsyncd を使用するには Linux の kernel 2.6.13(2005 年公開) で組み込まれた inotify が必要。
inotify とはディレクトリまたはファイルの粒度でファイルがオープン(読み取り専用/書き込み可能のオープンの判別可能)されたことやファイルの追加、変更、削除をイベントとして監視することができる API である。

lsyncd のインストール

カーネルのリリース番号の確認 CentOS 6 64bit における実行例

# uname -r
2.6.32-358.2.1.el6.x86_64

例えば EPEL のリポジトリ を登録していれば

# yum -y install lsyncd 

にて完了
バグなどの理由で最新版を使いたいのであれば http://code.google.com/p/lsyncd/ 外部リンク から取得できる。2013-03-16 時点で ver. 2.1.4 ( yum で入手できるバージョンも同じ )

conf ファイルの編集

以下のファイルの同期を行なう場合の設定ファイル例

  1. ディレクトリ /tmp/src 以下のファイルの変更を /tmp/dest に伝播させたい
  2. ディレクトリ /tmp/src2 以下のファイルの変更を /tmp/dest2 に伝播させたい

/usr/share/doc/lsyncd-2.1.4/examples/lrsync.lua を参考に設定ファイルを作成する。
(lsyncd-2.1.4 の場合)

# cp -p /usr/share/doc/lsyncd-2.1.4/examples/lrsync.lua /etc/lsyncd.conf
# vi /etc/lsyncd.conf
----
-- User configuration file for lsyncd.
--
-- Simple example for default rsync.
--
settings = {
	logfile = "/var/log/lsyncd.log",
	statusFile = "/tmp/lsyncd.stat",
	statusInterval = 3,
}
-- #1 
sync{
	default.rsync,
	source="/tmp/src/",
	target="/tmp/dest/",
	rsyncOps={"-rptgo", "--links", "--delete"},
}
-- #2
sync{
	default.rsync,
	source="/tmp/src2/",
	target="/tmp/dest2/",
	rsyncOps={"-rptgo", "--links", "--delete"},
}

以上のように複数の同期したいものがある場合には sync {...} を並べて記述すればよい。
rsync へのオプションは 1 つずつに分けてダブルクォートで囲んで指定する。スペースを入れて複数個同時に指定したときは動作しなかった。

同期には rsync コマンドを使用しているが rsync 以外で動作させることも可能。興味があれば /usr/share/doc/lsyncd-2.1.4/examples/ 以下に他のサンプルがあるのでそちらを参考に。(rsync のオプションの詳細については別途調べてください)

lsyncd 起動スクリプト

起動スクリプトは多重起動防止やロックファイルを作成しておかないと異常動作の原因になることがあるので要注意。

コメント内の # chkconfig: - 80 20 によって起動と停止順番を定義する。80 は httpd(85) より少し前に START され、リブートやシャットダウン時には httpd(15) より少し後に STOP させたい場合の例である。番号は自分の目的に合わせて適当に設定する。

# vi /etc/init.d/lsyncd
#!/bin/bash
# chkconfig: - 80 20
# description: lsyncd

RETVAL=0
prog="/usr/bin/lsyncd"
pidfile="/var/run/lsyncd.pid"
lockfile="/var/lock/subsys/lsyncd"
option="-pidfile $pidfile"
# option="-log all -pidfile $pidfile"
conffile="/etc/lsyncd.conf"

. /etc/rc.d/init.d/functions

start() {
	echo -n "Starting $prog:"
	daemon --pidfile=$pidfile $prog $option $conffile
	RETVAL=$?
	echo
	[ $RETVAL = 0 ] && touch $lockfile
	return $RETVAL
}
stop() {
	echo -n "Stopping $prog:"
	killproc -p $pidfile $prog
	RETVAL=$?
	echo
	[ $RETVAL = 0 ] && rm -f $lockfile $pidfile
	return $RETVAL
}
case $1 in
	start) start ;;
	stop) stop ;;
	restart) stop && start ;;
	*)
		echo "Usage: $0 {start|stop|restart}"
		exit 1
esac

# option="-log all" は設定が上手くいかないときにコメントアウトする。大量のログが出るので通常時は使用しない方が良い。

lsyncd を自動起動 / 停止させる

起動スクリプトを登録 rc3.d , rc6.d や rc0.d などにエントリされる 参考: ランレベル

chmod +x /etc/init.d/lsyncd
chkconfig --add lsyncd
chkconfig lsyncd on

lsyncd の起動

マシンを再起動して設定できているか確認、または、service コマンドで直接起動する。

# service lsyncd start
Starting /usr/bin/lsyncd:                                  [  OK  ]
# service lsyncd start
Starting /usr/bin/lsyncd:

2回目は [OK] がでないことを確認 = 多重起動されていない。
同じ監視をする設定で lsyncd が多重起動されてしまうと更新ファイルを同期できない原因になる。

設定に誤りがあったりするとログファイルが延々と大量に出力され続けることがあるので念のため確認する。

# tail -f /var/log/lsyncd.log

ミラーするファイルを指定する方法

lsyncd の除外設定は rsync のinclude / exclude の設定に似ているが + や - による設定は行えない。つまり、除外のみしか行なうことができない。

そのため lsyncd の除外リストと rsync の許可リストと除外リストを併用して記述することでファイルの選別を実現する。
lsyncd の除外リストは必須ではないが、ミラーしないファイルが変更されても lsyncd でイベントが発生し rsync で何もしないという不毛な処理が発生するのはもったいない。

指定したディレクトリを除外し、特定のファイルだけミラーをしたい場合の設定

ミラーの条件例

  • /tmp/src3/subdir , /tmp/src3/subdireX をミラーから除外
  • hoge.txt のみをミラーする。それ以外はすべて除外する

以上の条件でミラーするときの conf ファイル記述例

sync{
	default.rsync,
	source="/tmp/src3/",
	target="/tmp/dest3/",
	exclude={"/subdir/", "/subdirX/"},
--      exclude="/subdir**",        ワイルドカードによる指定も可能
--      exclude="/*/",              サブディレクトリすべて
--      exclude={"*.log", "/*/"},   ファイル名にも指定可能
	rsyncOps={"-a", "--include=hoge.txt" ,"--exclude=*"},
}

使用できるワイルドカードは

  • ? - スラッシュ(/) を除く任意の 1 文字にマッチ
  • * - スラッシュ(/) を除く任意の 0 文字以上にマッチ
  • ** - スラッシュ(/) を含む任意の 0 文字以上にマッチ

lsyncd の exclude を外部ファイルで指定する場合には "excludeFrom=ファイル名" を使用して宣言する。
外部ファイルで指定する場合には + による include 設定は機能しない。'/' で終了している場合には除外ディレクトリと判定される。

(注意) 除外するパターンマッチについて

exclude="log"

の除外指定を行なうと log(ファイル) , /log/ (ディレクトリ)が除外対象となる。
つまり /abc/log/ はマッチするので除外対象となるが /login/ は除外対象にはならない。

関連カーネルパラメータ

inotify で監視できるファイル数の上限に関するパラメータ
監視対象を一気に増やしたときなどには上限を超えていないか確認する。

  • /proc/sys/fs/inotify/max_queued_events
  • /proc/sys/fs/inotify/max_user_instances
  • /proc/sys/fs/inotify/max_user_watches ← 特にコレ

lsyncd による同期の体感スピード

同一ファイルに対して絶え間なく連続して変更を加えると伝播は遅延するし、単純な追加、変更、削除であってもリアルタイムに同期されるのではなく一呼吸おいて同期されるという感じなので過剰な期待はしてはいけない。



lsyncd ローカルファイルによるミラーリングの関連トピックス

日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ Oracle Web セミナー