Linux環境におけるリアルタイムファイル同期:sersyncとrsyncの統合構成

大規模なWebサービスやコンテンツ配信基盤では、複数サーバ間でのファイルの一貫性を保つためのリアルタイム同期が不可欠です。この記事では、inotifyベースの監視機能を活用したsersyncと、差分転送に特化したrsyncを組み合わせた高効率な同期アーキテクチャについて解説します。

なぜsersync+rsyncか?

  • sersyncは、Linuxカーネルのinotify APIを直接利用し、ディレクトリ内の変更イベント(作成・削除・更新)をファイル単位で検知できます。
  • 従来の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>セクションで失敗ログを記録し、定期的に再試行スクリプトと連携させるのが推奨されます。

タグ: sersync rsync inotify linux file-synchronization

7月29日 07:51 投稿