リアルタイムミラーリングツールの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の環境では設定変更前後で負荷はそれほど変わりませんでした。
無事現象が発生しないようになりましたとさ。