2015年3月20日金曜日

Odroid C1 / Ubuntu でサーバ構築 3: rsync(lsyncd)の設定,リアルタイムのバックアップをする

Odroid C1を利用してサーバを構築する.今回は前回マウントした2基の外付けUSB HDDをミラーリングして自動バックアップできるようにします,

lsyncdのインストールと設定

インストール

lsyncdをapt-getでインストールしてとりあえずバージョンの確認,恐らく2.1系列だと思われる.
$sudo apt-get install lsyncd 
$lsyncd --version

設定

今回は,異なるストレージをまたぐものの,外部のマシンと同期するわけではないローカルディレクトリの同期であるため設定もシンプルなはず..
まず,設定ファイルを作成し,編集します.設定ファイルはサンプルをコピーし,編集します.設定ファイルの場所はデーモンのファイル/etc/init.d/lsyncdに記載されています.
cat /etc/init.d/lsyncd 
-省略-
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="synchronization daemon"
NAME=lsyncd
DAEMON=/usr/bin/$NAME
CONFIG=/etc/lsyncd/lsyncd.conf.lua
-省略-

CONFIGの位置ですね.これを書き換えても良いかと思いますが今回はコレを使います.
$sudo cp /usr/share/doc/lsyncd/examples/lrsync.lua /etc/lsyncd/lsyncd.conf.lua
$sudo emacs /etc/lsyncd.conf
File Edit Options Buffers Tools Conf Help                                                                                           
----
-- User configuration file for lsyncd.
--
-- Simple example for default rsync.
--
settings {
        logfile = "/var/log/lsyncd.log", ←追記
        statusFile = "/tmp/lsyncd.stat",
        statusInterval = 1,
}

sync{
        default.rsync,
        source="/mnt/storage/", ←変更(元ディレクトリ)
        target="/mnt/backup/", ←変更(コピー先ディレクトリ)
以下,追記
 rsync = {
       compress = false,
       _extra = {
             "--delete", 
             "-a",
             "exclude=*~",
       }
 }
ここまで追記
}

settingsの部分はlogfileを追記して,ログを記録するようにしましょう.あとはこのままで良いでしょう. 詳細はLsyncd 2.1.x ‖ The Configuration Fileで解説されています.
次のsyncではミラーリングするディレクトリ同士を個別に記述します.sourceとtargetを逆に書いてしまうと悲惨なことになるから注意ですね.毎回緊張します. オプションは,アーカイブすなわちファイルパーミッションなども維持したコピーを行う-aと元が削除されたらミラー先も削除する--deleteを付随させます. またemacsなどが出力する一時ファイル*~は除外します.
また,以前はsettings={}と記述したいようですが=(イコール)はいらないみたいですね.

rsyncオプションの書き方の注意

rsyncの2.1.xと2.0.xではrsyncオプションの書き方には大幅な変更が加えられているようです.
rsync2.0.xまではrsyncへのオプションを
rsyncOps={"-a", "--delete"}
などと書いていたようですが,2.1.xからはLsyncd 2.1.x ‖ Layer 4 Config ‖ Default Behaviorにあるように,rsync={}で書くようになっているようです.
もし,2.0.xの書き方の場合,次のlsyncdの実行時に

Error: error preparing /etc/lsyncd/lsyncd.conf.lua: Parameter "rsyncOps" unknown. (if this is not a typo add it to checkgauge)

とエラーになると思います.

開始

lsyncdを開始します.
$sudo service lsyncd start

ミラーリングできてるか,ファイルを作成するなどして確認します.

inotifyの上限変更

lsyncdはinotifyでファイルの変更を検知しているようですが,たくさんのファイル変更には対して限界値が設定されています.限界を超えると同期がストップするようです.その際,ログ/var/log/lsyncd.logには次のように記載されていました.
Mon Mar 23 12:44:00 2015 Error: Terminating since out of inotify watches.
Consider increasing /proc/sys/fs/inotify/max_user_watches

/proc/sys/fs/inotify/max_user_watchesに記載された値が限界値のようです. これを大きくしてみましょう.初期の8192の10倍,81920と設定します.
/etc/sysctl.confもしくは/etc/sysctl.d/以下の*.confファイルに
fs.inotify.max_user_watches=81920
などと書き換えもしくは追記するという方法の紹介を見かけます. (例えば,CentOS 6 でも /etc/sysctl.d/ は使える(ipv6 無効化とか) lsyncd設定)

ただし,今回は
$sudo sysctl -w fs.inotify.max_user_watches=81920
で変更しました.

参考

http://www.shift-the-oracle.com/linux/utility/lsyncd-local.html