Daemon)はリアルタイムのファイル同期を提供する仕組みのひとつです。inotifyというファイルの変更を検知すると、rsyncd経由で同期先のサーバへファイルを転送します。rsyncdの使い方についてまとめます。概要lsyncdの動向lsyncdは、2009年7月のソフトウェアデザインに掲載されてから徐々に有名になった技術ですが、現在(2014年10月)ではわりと下火になってきました。GitHubを見ると最近のコミットの数が少ないし、新しいバージョンの開発が行われていません。私自身もlsyncdはかなり痛い目にあったオープンソースなので、正直お勧めできません。言っても、lsyncdを運用せざるを得ない残念な方もいらっしゃると思いますので、そんな残念なOpsのためにまとめ記事を書きます。lsyncdのバージョンlsyncdにはバージョン1とバージョン2があります。ソフトウェアデザインに掲載されたのがバージョン1であった影響もあり、バージョン1を前提としてたブログが多数みられます。他のブログ記事を読む時は、その記事がバージョン1なのかバージョン2なのかを慎重に読み取った方が良いでしょう。このサイトはバージョン2のみを取り扱います。バージョン1は、もはや公式サイトからダウンロードする事すらできなくなっています。DRBDlsyncdと比較される概念として、DRBDのようなクラスタリングソフトウェアが挙げられます。両者の違いは以下の通りです。データベースのクラスタリングlsyncdはファイル単位の転送であるのに対し、DRBDはブロック単位の転送です。DRBDはブロック単位の転送を行うため、ファイルシステムの再構築やマウントポイントの定義など構築の手間が非常に大きいです。それに対し、lsyncdは比較的容易に導入する事ができます。lsyncdは多数のホストに対して同期を効かせる事ができるのに対し、DRBDは2台のホストを同期させる用途で使用する事が多いです。多数のホストに対して同期を行いたい場合は、lsyncdを採用しましょう。BindFSのようなクラスタリングソフトを使用し、少量のファイル転送にはlsyncdを使用する」と覚えておけば、原則間違えはないと思います。rsyncコマンドrsyncコマンドの使い方lsyncdはリアルタイムでrsyncを行う常駐プログラムです。lsyncdを設定する前に、まずはrsyncコマンドの復習をしておきましょう。rsyncはディレクトリ単位の同期を行うコマンドです。同一ホスト内のファイルコピーを行う事もできますが、多くの場合はリモートホストへのファイル転送で使用する事が多いでしょう。rsyncの構文は以下のようになります。<target_dir>使用頻度が高いオプションをまとめると以下の通りです。-rlptgoDと同じ意味です。詳細な説明はマニュアルに任せますが、-aをつけた方が何かと便利な事が多いです。転送するファイル一覧を表示します。リモートシェルのコマンドを指定します(デフォルトはssh)。secret.pem"とすれば秘密鍵を指定できます。ファイル転送の進捗を表示します。大きなファイルを転送する進捗が見えないと何かと不安になります。転送対象から除外したいファイルを指定します。転送対象から除外したいファイル一覧を定義した設定ファイルを指定します。-vと併用する事で、実際には転送せずに転送するファイル一覧を表示します。オプション指定やディレクトリ指定に誤りがないか、事前に動作確認したい時に使用します。使用例は以下の通りです。–exclude–excludeオプションで転送対象から除外したいファイルを定義する事ができます。ディレクトリ単位で除外したい場合は、コピー元ディレクトからの相対パスで指定します。特定のファイルを除外したい場合は、ワイルドカードと範囲指定でファイル名を指定します(例えば、”*.log.[0-9]”のように指定します。正規表現は使用できません)。使用例は以下の通りです。”not_sync”ディレクトリとログファイルを除外して転送する例です。–exclude-fromrsyncの除外対象が多くなると、除外対象をコマンドラインで指定するのはメンテナンス上無理があります。そのような場合は、除外対象をファイルで定義する事もできます。実行例は以下の通りです。~]$設定例は示しませんが、”+”で除外リストから除く(転送対象に含める)事もできます。”+”でincludeの意味、”-“でexcludeの意味と考えて差し支えございません。机上で–exclude指定を考えるのは設定ミスをしやすいので、実行前に–dry-runオプションで動作確認する事をお勧めします。lsyncdによるリアルタイムの同期を実現するためには、ファイルを受信する側のサーバでrsyncdを起動させる必要があります。このrsyncdという言葉は聞きなれないと思いますが、rsyncとは別物です。多くのエンジニアはrsyncと言えばsshでディレクトリ単位のコピーを行うコマンドを思い浮かべますが、rsyncdはtcp873で待ち受けるファイル同期のための常駐プログラムです。[必須]rsyncdはxinetd経由で呼び出されるます。xintedがインストールされていない場合は、xinetdをインストールして下さい。startrsyncdはデフォルトで無効化されていますので、/etc/xinetd.d/rsyncの”disable”をyesからnoに変更しrsyncdを有効化します。CentOS6からはデフォルトでIPv6でのみ受信する設定になっていますので、”flags”をIPv6からIPv4に変更します。USERID}xinet.dを再起動し設定を反映させます。tcp873でListenしている事を確認します。0.0.0.0:873′′との記述がある事を確認してください。”:::873′′となっていればIPv6で受信している事を意味しますので、設定の見直しが必要です。(0.00/0/0)#環境によっては、iptablesやhosts.allowのような受信許可設定も必要になる事にもご注意ください。/etc/sysconfig/iptablesの設定変更が必要ならば、以下のような設定例になります。[必須]rsyncdの設定を行います。設定は、/etc/rsyncd.confに記述して下さい。以下は、/usr/local/Workdirに対して”Workdir”というラベルを付与する例です。denyはrsyncdによって接続したいホストを限定したい場合に指定して下さい。要件がないならば、設定の必要はございません。onlyは書き込みを許すかどうかです。rsyndは公開サーバとしての用途もありますので、デフォルト設定は読取専用です。gidは同期ディレクトリに対して読み書きを行うユーザです。root”とするのが良いでしょう。ちなみに、この設定を省略してしまうとnobodyで読み書きが行われます。[任意]複数のディレクトリに対してrsyncdによる同期を行う事もできます。/usr/local/Workdir2の2つのディレクトリに対してrsyncdによる同期を許可した設定です。ディレクトリを複数指定する場合は、以下のようにグローバルな設定を利用し設定ファイルの簡素化を図りましょう。ディレクトリ設定より前に設定を記述すると、全てのディレクトリに対する共有設定になります。gid=rootを共通設定として記載した例です。[任意]rsyncdはデフォルトで/var/log/messagesに同期を行ったディレクトリをログ出力します。ログ出力例は以下の通りです。duration=5(sec)もし、大量のログ出力を嫌うならば、ログ出力を抑制する事ができます。no”を加筆する事でログ出力を抑制する事ができます。lsyncdのトラブルが多かったです。ログを抑制するという事は、後からの追跡ができなくなるデメリットがある事は理解した上で設定を投入して下さい。/usr/local/Workdirrsyncdを大量に使用する現場では、rsyncdのログが膨大になってしまいます。これを/var/log/messagesに出力すると、OSに対するエラーが埋もれてしまう可能性があります。そのような場合は、rsyncdのログ出力を別ファイル化する事を検討しましょう。facilityのdaemonに対してログ出力します。これを何か適当なfacilityに変更する事で、ログ出力の別ファイル化ができます。facility”を加筆し、ログ出力先を指定して下さい。以下はlocal0にrsyncdのログを出力する例です。/usr/local/Workdirあとは、rsyslogdとログローテーションの設定をすれば、ログ関連の設定が完了です。設定に任せ、ここでは設定例のみ紹介します。/etc/rsyslog.confに以下ハイライトされた部分の設定を加筆します。###rsyslogdを再起動し設定を反映させます。restartみんな忘れがち、そして後任の運用担当者がよく泣くログローテーションの設定例は以下の通りです。設定方法に任せ、ここでは設定例のみ紹介します。rsyncdではありません)。/etc/logrotate.d/syslogに、ログローテーション対象として/var/log/rsyncを加筆します。以下ハイライトされた部分を加筆して下さい。[必須]lsyncdをインストールします。現在(2012/02/26)はrpmforgeから提供されていますので、yumコマンドで簡単にインストールできます。rpmforgeの設定については、yumリポジトリの使い方/設定/作成方法を参照下さい。[必須]lsyncdは/etc/lsyncd.confに設定を記述します。デフォルト設定やサンプル設定のファイルは存在しないので、設定ファイルを新規作成して下さい。設定例は以下の通りです。エントリを増やしてください。[必須]lsyncdは起動スクリプトを用いて、起動させることができます。操作例は以下の通りです。startlsyncdの起動に成功してもファイル転送に成功しているとは限りません。公開鍵の設定が間違っていたとしても、psコマンド等によるプロセス確認では正常に見えます。そのため、以下のようにログを確認し正常にファイル転送できているかを確認する必要があります。startup”のようなメッセージが出力され続けます。以下はエラーが存在する場合のログ出力例です。files/dirs一方、ファイル転送が正常に行なわれ射る場合は、以下のように出力されます。[必須]ログファイルを明示的に定義した場合は、ログローテーションの設定も忘れずに行いましょう。以下はログローテーションの設定例です。/etc/logrotate.d/lsyncdというファイルを以下のような内容で作成します。trueendscript}なお、ログファイル設定を省略した場合は、facilityがuserでログ出力されます。syslog.confの設定次第ですが、多くの場合は/var/log/messagesにログ出力されると思います。[必須]lsyncdはionotifyというファイルシステムのイベントを取得するAPIを使用しています。ionotifyは監視できるファイル数の上限が定められており、max_user_watchesで定義されています。デフォルトでは8192個までしか監視できません。大量のファイルを同期したい場合は、カーネルパラメータfs.inotify.max_user_watchesを変更する必要があります。/etc/sysctl.confにfs.inotify.max_user_watchesを追加します。設定例は以下の通りです。-p”により設定を反映させます。6.X系の違いこの記事は2012年2月に初めて書き、2014年10月に再度見直しを行いました。6.5で動作確認を行っております。その際、rsyncdの仕様変更をいくつか見つけました。注意すべき仕様変更は以下の通りです。2.1系の違いlsyncdはバージョンによって書式や指定可能オプションが異なります。1.X系と2.0系では設定ファイルの書式が大きく異なります。1.X系の頃はXML形式の読みづらい記述になっていましたが、2.0系では読みやすい記述方法になっています。2.0系から2.1系からのバージョンアップでは、指定可能なオプションが異なります。2.0系の頃は以下のようにrsyncOpsというパラメタを用いて転送対象外となるファイルを定義しましたが、2.1系ではrsyncOpsというパラメタが廃止されています。ちなみに、2.0系の頃はrsyncOpsを省略するとファイル転送が行われなくなる不具合がありました。bitrsync-3.0.6-9.el6_4.1.x86_64lsyncd-2.1.4-1.el6.rf.x86_64シェアするツイートフォローするsyauichi関連記事sudoersの設定方法sudoersとはsudoに関する設定の定義ファイルです。業務でよく使用するyumコマンドの使い方についてまとめます。serverの設定についてまとめます。無事にセットアップできました。ありがとうございました。PMお褒めの言葉ありがとうございます。lsyncdは障害の多い困った子ちゃんだったので、使いどころは気を付けて下さいね。クリティカルな用途でlsyncdを使うと痛い目にあいますので。コメントをキャンセルメールアドレスが公開されることはありません。date*日本語が含まれない投稿は無視されますのでご注意ください。ネットワークチェンジニアとして。