環境
lsyncd2.0.4
rsync2.6.8-3.1
CentOS5.5
Intel QuadCore Xeon、メモリ4GB

リアルタイムミラーリングツールのlsyncd。
こいつを使うと複数サーバ間でファイルのリアルタイム同期ができるようになります。

 

このlsyncdを使ってファイルの同期をしていて、ミラー元のファイル変更の検知ができていなかった時の対処法です。

Webサーバ間で画像ファイルの同期を行っており、ロードバランサでアクセスが各Webサーバに振り分けられるよくある構成です。
テストをしていると稀にリロードすると画像が表示されなかったり、別の画像が表示される現象が発生しました。

/var/log/lsyncd/lsyncd.logを確認してみましたが、転送に成功したログは残っているものの失敗したログは残っておらず。
続いて/var/log/lsyncd/lsyncd.statusを眺めていてこんなログが。

Inotify watching 8962 directories

そういえば監視できるファイル数の上限があったような…

 

以下のコマンドで確認してみると転送対象ファイルが50000ファイル近くありました。

find /path/to/dir/ -type f | wc -l

一方、lsyncdで監視できるファイル数の上限は

cat /proc/sys/fs/inotify/max_user_watches

で表示される8185ファイル。

 

やはり監視可能なファイル数の上限を超えてしまっていたため、監視対象外となってしまっていたようです。

lsyncdで上限ファイル数を超えた時の対処策 – Unix的なアレ
こちらのブログの記事によると

Fri Jan 22 14:11:51 2010: ERROR: Cannot add watch /foo/bar/ (28:No space left on device)

というようなエラーがlogに吐き出されていたら要注意と書かれていましたが、手元の環境ではこういったエラーは吐かれていませんでした。

対処法としては以下のように上限値を上げてやることで解決。

$ sudo vi /etc/sysctl.conf
-> fs.inotify.max_user_watches = 100000 # 追加
# sudo /sbin/sysctl -p

設定値については悩んだ末に100000という値を指定していますが、Intel QuadCore Xeon、メモリ4GBの環境では設定変更前後で負荷はそれほど変わりませんでした。

 

無事現象が発生しないようになりましたとさ。

関連記事

コメント一覧

コメントはまだありません

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

スパム防止のため下の計算結果を入力して下さい *

ページの先頭へ