lsyncdで、拠点間同期(バックアップ)をしたい!
作成日: ・ 更新日:
rsyncを使うと、リモートとファイルを同期させることができるが、さらにlsyncdを使うことでリアルタイムに同期させることができる
バックアップもかねてlsyncdを導入したので、そのメモです
必要なパッケージのインストール
rsync
は、リモートへの同期をするプログラム
lsyncd
は、ローカルのファイルを監視し、変更があれば内部で
rsync
を実行してリアルタイムに同期させるプログラム
ということで、同期元/同期先双方に
rsync
、同期元には
lsyncd
もインストールする。
$ sudo apt-get install -y rsync lsyncd
SSH接続の準備
rsyncは内部でSSHを使用しているため、SSHで同期先と接続しておく。
この際、パスワード認証ではなく公開鍵認証で接続できるように設定しておく
また、所有者やパーミッション等も同期させたい場合は、 *
同期元:
sudo ssh [同期先]
で接続できるようにしておく *
同期先:同期に使用するアカウントでsudoが使えるようにしておく
(TODO 公開鍵認証でSSH接続)
lsyncdの設定ファイルを作成する
以下は、私の環境での設定ファイルです。必要に応じて公式ドキュメント( Config Layer 4: Default Config )等を参照して変更してください。
設定ファイル
/etc/lsyncd.conf
を作成&編集する
settings {
logfile="/var/log/lsyncd/lsyncd.log",
statusFile="/var/log/lsyncd/lsyncd.status",
}
sync {
default.rsyncssh,
source="/mnt/hdd/data/",
host="User@Host",
targetdir="/mnt/hdd/data/",
delay = 0,
rsync = {
rsync_path = "sudo rsync",
archive = true,
}
}
-
settings
-
logfile
: ログファイルの保存先 -
statusFile
: ステータスファイルの保存先(監視対象ディレクトリ一覧?)
-
-
sync
-
default.rsyncssh
: rsyncsshのデフォルト値を使用する -
source
: 同期元のディレクトリ -
host
: 同期先ホスト -
targetdir
: 同期先のディレクトリ -
delay
: ファイルが変更されてから同期されるまでの遅延時間 -
rsync
: rsyncの設定-
rsync_path
: リモートのrsyncの指定。今回、所有者やパーミッション等も同期させたいため、sudoを使用 -
archive
: rsyncの--archive
オプションのこと
-
-
設定できる項目は先ほども記述したとおり、公式ドキュメント( Config Layer 4: Default Config )に書いてあるので、各自カスタムしてください!
ファイルの監視数を増やす
同期対象のファイル数が多い場合、デフォルト設定では足りずに以下のようなエラーが出る場合がある。
$ sudo lsyncd ./lsyncd.conf
00:00:00 Normal: --- Startup ---
00:00:01 Error: Terminating since out of inotify watches.
Consider increasing /proc/sys/fs/inotify/max_user_watches
デフォルト設定の確認
$ cat /proc/sys/fs/inotify/max_user_watches
29831
わたしの環境では、デフォルトは29831だった。
同期対象のファイル数を確認する(大体の値)
$ sudo find [同期対象] -type f | wc -l
189443
設定の変更
$ sudo vi /etc/sysctl.conf
以下の部分を変更orなければ追記 ファイル数は先ほど調べたものよりも大きい値にする
fs.inotify.max_user_watches = 819200
設定の反映
$ sudo sysctl -p
lsyncdの起動
lsyncdの引数に、先ほど作成した設定ファイルを指定する
$ sudo lsyncd /etc/lsyncd.conf
最後に
Systemdに登録するとシステム起動時にlsyncdを起動させられるため便利かな?(TODO)
あとは、双方向同期とかも設定してみたいけど、ファイルの競合とかあるとめんどくさそう…(TODO)