大規模なWebサービスやコンテンツ配信基盤では、複数サーバ間でのファイルの一貫性を保つためのリアルタイム同期が不可欠です。この記事では、inotifyベースの監視機能を活用したsersyncと、差分転送に特化したrsyncを組み合わせた高効率な同期アーキテクチャについて解説します。
なぜsersync+rsyncか?
- sersyncは、Linuxカーネルの
inotifyAPIを直接利用し、ディレクトリ内の変更イベント(作成・削除・更新)をファイル単位で検知できます。 - 従来の
inotify-tools + rsync連携では、変更対象のパス情報が失われるため、全ディレクトリ再スキャンが必要でしたが、sersyncは「どのファイルが変更されたか」を正確に伝達し、rsyncに最小限の差分転送を指示します。 - 結果として、数百GBを超える大量ファイル環境でも、低負荷かつ高速な同期が実現可能です。
rsyncサーバのセットアップ
まず、同期先となるサーバ(例: 10.1.20.109)でrsyncデーモンを準備します。
# インストール(RHEL/CentOS系)
sudo yum install -y rsync
# 設定ファイル作成
sudo tee /etc/rsyncd.conf <<'EOF'
uid = root
gid = root
use chroot = no
max connections = 500
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors = yes
read only = false
list = false
hosts allow = 10.1.20.0/24
auth users = sync_user
secrets file = /etc/rsync_auth.conf
[web_assets]
path = /data/web/
comment = Static assets for web applications
[forum_data]
path = /data/forum/
comment = Community forum attachments
[blog_content]
path = /data/blog/
comment = Blog posts and media files
EOF
認証情報を安全に設定します:
echo "sync_user:securePassw0rd" | sudo tee /etc/rsync_auth.conf
sudo chmod 600 /etc/rsync_auth.conf
同期用ディレクトリを作成し、デーモンを起動:
sudo mkdir -p /data/{web,forum,blog}
sudo rsync --daemon --config=/etc/rsyncd.conf
# 開機時自動起動登録(systemd環境の場合)
echo "/usr/bin/rsync --daemon --config=/etc/rsyncd.conf" | sudo tee -a /etc/rc.local
クライアント側のrsync設定
同期元サーバでは、認証情報のみを保持します:
echo "securePassw0rd" | sudo tee /etc/rsync_client.pwd
sudo chmod 600 /etc/rsync_client.pwd
初期データを手動同期して動作確認:
# テストファイル生成
mkdir -p /data/web /data/forum
touch /data/web/index.html /data/forum/post_001.zip
# 同期実行(プッシュ方式)
rsync -avz --delete --password-file=/etc/rsync_client.pwd \
/data/web/ sync_user@10.1.20.109::web_assets/
sersyncの導入と構成
sersyncバイナリを展開し、モジュールごとに個別設定ファイルを用意します。
# 展開と配置
tar -xzf sersync2.5.4_64bit_binary_stable_final.tar.gz -C /opt/
sudo mv /opt/GNU-Linux-x86 /opt/sersync
# Webアセット専用設定(/opt/sersync/conf_web.xml)
sudo tee /opt/sersync/conf_web.xml <<'EOF'
<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5">
<host hostip="localhost" port="8008"></host>
<debug start="false"/>
<sersync>
<localpath watch="/data/web">
<remote ip="10.1.20.109" name="web_assets"/>
</localpath>
<rsync>
<commonParams params="-artuz"/>
<auth start="true" users="sync_user" passwordfile="/etc/rsync_client.pwd"/>
<timeout start="true" time="120"/>
<ssh start="false"/>
</rsync>
<failLog path="/var/log/sersync_fail.log" timeToExecute="60"/>
<crontab start="false" schedule="600"><!-- 10分間隔 --></crontab>
</sersync>
</head>
EOF
サービスの起動と監視
システムリソース制限を調整後、sersyncをデーモンとして起動します:
# inotifyリソース上限の拡張
echo 50000000 | sudo tee /proc/sys/fs/inotify/max_user_watches
echo 327679 | sudo tee /proc/sys/fs/inotify/max_queued_events
# 起動コマンド(-r: 初期フル同期、-d: デーモン化、-o: 設定ファイル指定)
/opt/sersync/sersync2 -r -d -o /opt/sersync/conf_web.xml
# 状態確認
ps aux | grep sersync
tail -f /var/log/sersync_fail.log
マルチモジュール運用
異なる用途のディレクトリを独立して監視する場合、各モジュールに対応するXML設定ファイルを複数作成し、それぞれ別プロセスで起動します:
# 論理的に分離された設定ファイル群
/opt/sersync/conf_forum.xml # /data/forum → forum_data
/opt/sersync/conf_blog.xml # /data/blog → blog_content
# 各々をバックグラウンド起動
/opt/sersync/sersync2 -d -o /opt/sersync/conf_forum.xml &
/opt/sersync/sersync2 -d -o /opt/sersync/conf_blog.xml &
補足:制限事項と回避策
- 小ファイル過多環境:inotifyイベントバッファ溢れを防ぐため、
max_queued_events値を適宜増加させます。 - 大容量ファイル転送:タイムアウトを
<timeout time="300"/>などに延長し、--partialオプションで中断後の再開を有効化します。 - ネットワーク不安定時:
<failLog>セクションで失敗ログを記録し、定期的に再試行スクリプトと連携させるのが推奨されます。