2017年10月13日
複数サーバー構成のファイル転送にはlsyncdが便利です
ファイル転送のご要望
PowerCMSは、静的なHTMLの生成を特長とするCMSです。
この特長はエンタープライズ用途では重要です。CMSをLAN内やアクセス制限のあるネットワーク内に配置し、そこで編集、内容を確認したWebコンテンツだけを公開側サーバーに転送する運用が実現可能で、コンテンツによっては、公開側に全くプログラム等を置かない構成が実現できるためです。
PowerCMSで、生成したWebコンテンツを公開側サーバーに転送する機能にはCopy2PublicまたはPowerSyncがあります。
他方で、Web制作案件を多く手掛け、 PowerCMSクラウドを展開する中で、これらの標準機能では実現できないようなご要望をいただくことがあります。
一例として:
- CMSで作成し確認したWebコンテンツを、複数の公開側サーバーにほぼ同時にコピーしたい(負荷分散構成など)
- 公開鍵認証のみ許可しているLinuxサーバーにWebコンテンツをコピーしたい
- ファイル転送の指示から、公開側サーバーへのファイル転送をなるべく短時間に終えたい
このようなご要望の実現には、lsyncdが便利です。
この記事では、動作原理などの説明はおさえめに、インフラ構築の現場で得られたノウハウを多めにlsyncdについてご紹介します。
lsyncdについて
lsyncdは、Linuxカーネルの機能を利用して、特定ディレクトリを監視し、そのディレクトリ以下でのファイルの新規作成、編集(変更)、削除といったイベントを検知、rsyncなど特定のコマンドを実行し、別のディレクトリに変更を反映するデーモンになります。
例えば以下のような構成が実現できます。
- PowerCMSで、Webサイトパスを /var/www/html/ に指定していて、CMSで制作したコンテンツはここに保存される
- PowerCMSの Copy2Public または PowerSync で、[ステージ環境に同期]を実行すると、/var/www/staging/ に更新ファイルがコピーされる
- /var/www/staging/ ディレクトリは、http://staging.example.com/ でコンテンツを確認できる
- PowerCMSの Copy2Public または PowerSync で、[公開環境に同期]を実行すると、/var/www/public/ に更新ファイルがコピーされる
- lsyncd で /var/www/public/ を監視させる。
- lsyncdは、/var/www/public/ にコピーされたコンテンツを、即座に rsync over SSHで別のサーバーにコピーする
CMSで広範囲なコンテンツを再構築した場合などは多数の更新ファイルがコピーされる場合があります。lsyncdは、監視ディレクトリ下の複数ファイルの「イベント」をまとめて扱うことが可能で、このようなケースでもファイルの数だけ rsync が起動されるようなことはありません。
いくつかのご留意事項
このように魅力的な機能を持つ lsyncdですが、ご利用上ご留意いただきたい事項がいくつかあります。
- Linuxカーネルの機能を利用しているため、Linuxのみで利用可能です。
- 同期コマンドで rsync を利用している場合、同期先サーバに Windows Server は選択できません。
- CentOSまたは RHELはバージョン6以上が無難です。
- 同期元、同期先サーバーに rsync の バージョン3.1以上がインストールされている必要があります。
- 監視ディレクトリは、ローカルファイルシステムに限られます。NFSでマウントしたディレクトリは指定しても監視できません。
- 設定ファイルの書式については、バージョンによってが大きく異なるため、 公式サイトのドキュメントを参照するのが一番確実です。
- 監視ディレクトリ以下の監視ファイル数をカーネルパラメタ fs.inotify.max_user_watches に指定する必要があります。簡単には変更できないため、将来の増加予測も含めてサーバー構築時に設定しておく必要があります。
- これまで、弊社では100万ファイル単位での監視実績があります。ファイルの監視には1ファイルあたり1KBのスワップ不可能なメモリを消費することを考慮します。また、この程度の数になると、lsyncd の起動から監視開始までに、1時間程度を要する場合があります。
簡単な使い方
インストールは、各ディストリビューションにてパッケージが用意されているため、これを利用します。
lsyncd の設定はLua言語で記述されます。前記「例えば以下のような構成」の例では次のようになります。
settings { logfile = "/var/log/lsyncd/lsyncd.log", statusFile = "/var/log/lsyncd/lsyncd.status", } sync { default.rsync, delay = 5, source = "/var/www/public/", target = "user@www.example.com:/var/www/html/", exclude = "/secret", rsync = { archive = true, compress = true, rsh = "/usr/bin/ssh -i /home/user/.ssh/key.pem -o StrictHostKeyChecking=no" } }
この設定ファイルは、おおむね以下のような設定になります。
- lsyncdの動作ログ、ステータスファイルを、新規作成した /var/log/lsyncd/ディレクトリ以下に保存します
- 同期元サーバーの監視対象ディレクトリは /var/www/public/ 以下です
- ただし、/var/www/public/secret/ 以下は監視対象から除外します
- 同期先サーバーは、www.example.com で、ユーザー user で接続し、その権限で /var/www/html/ ディレクトリにコピーします
- rsync同期の際、同期元サーバーの /home/user/.ssh/key.pem を秘密鍵として利用します
- rsyncには、オプション "-az" を指定します
- 監視ディレクトリでのイベント発生から5秒間待って同期を開始します
応用的な利用方法
lsyncdを使った応用的な利用方法をご紹介します。
- 監視ディレクトリと同期設定は複数指定が可能です。それぞれ別のサーバーへの転送も可能です
- 同一監視ディレクトリをsourceとする指定を複数記述することが可能です。これにより、複数サーバーへの同時コピーが実現できます
- lsyncdの設定ファイルには「レイヤ」が存在し、より低レベルな処理の記述も可能です。例えばrsyncではなくAWS CLIを呼び出すことで、Amazon S3へのコピーなども実現可能です
まとめ
lsyncdをうまく設定して、セキュアに高速・効率的な転送を実現し、堅牢なシステムの構築を!
- カテゴリー
- 技術情報