DSASのファイル転送システムをオープンソースで公開します
DSASのファイル転送システムを、オープンソースで公開します。
その名は、makuosan(まくおさん:通称「まくお」)っていいます。
名前は冗談っぽいですが、内容はわりと真面目です(^^;
Webサイトの運用に欠かせない作業のひとつに、「デプロイ」という作業があります。 これは、新しいプログラムやデータなどをWebサーバに設置して利用できるようにす ることを指していますが、サイトの規模が大きくなってWebサーバの台数が増えると、 それに比例してファイル転送にかかる時間も長くなっていきます。
一般的な話として、サイトの規模が大きくなるほど運用コストは増大しますが、 その要因のひとつとして「デプロイ時のファイル転送に時間がかかる」という 点がありました。そこで、できるだけ運用コストを抑える(作業者の負担を減 らす)ために、独自のファイル転送システムをこしらえてみました。
「まくお」は、マルチキャストを利用して、複数のサーバへ同時にディレクト リ構造を複製するファイル転送システムです。
【まくおの特徴】- 転送時間がサーバ台数に依存しない
- サーバが増えても、転送にかかる時間はほとんどかわりません。10台のサーバ に転送しても、20台のサーバに転送しても、ほとんど同じ時間で完了します。 ただし、転送時間は一番応答が遅いサーバの性能に引っ張られるので、同程度 のスペックのサーバで構築された環境で利用することが望ましいです。
- すべてのサーバで同時にファイルが更新される
- マルチキャストを使って全サーバへ同時にファイルを転送します。そのため、 「このサーバのファイルは更新されてるけど、あのサーバのファイルはまだ 更新されていない」といったことが起こりません。
- 面倒な設定は不要
- 「まくお」のメインプログラムは、全サーバにデーモンとして常駐させます。 それぞれのサーバに常駐している「まくお」は、互いの存在を確認しあうこ とで、自動的にネットワーク上のサーバ構成を把握します。サーバを増設も しくは撤去する際においても、既設サーバの設定を変更する必要はありません。
「まくお」は、DSASの都合に合わせて仕様を決めていたので、一見意味不明 とも思えるオプションがあったり、この手のソフトでは当り前に付いている はずの機能が未実装だったりもしています。しかし、これでも誰かの役に立 てるのではないかと思い、オープンソースとして公開することにしました。
「まくお」は、DSASを運用する上で長年の懸念であった「ファイル転送の悩
み」を解消するためにこしらえました。今回は、どのような事に悩んでいて、
どう解決しようとしたのかをお話ししながら、作り始めたきっかけなどを紹
介したいと思います。
※機能の詳細や具体的な使用例などはプロ
ジェクトサイトを参照してください。
負荷分散環境におけるファイル転送の悩み
何十台ものWebサーバを負荷分散環境で運用していると、コンテンツの更新 や追加をするために、大量のファイルを複数台のサーバへ、できるだけ速く転 送する必要がでてきます。以下のようなスクリプトで、1台づつ順番に転送す るのは簡単で確実ですが、これではサーバ台数に比例して転送にかかる時間も 増えていってしまいます。
#!/bin/sh for i in host2 host3 host4; do rsync -aR /var/www/ $i:/ done
+-------+ rsync +-------+ | host1 |------->| host2 | +-------+ +-------+ +-------+ rsync +-------+ | host1 |------->| host3 | +-------+ +-------+ +-------+ rsync +-------+ | host1 |------->| host4 | +-------+ +-------+
また、このスクリプトのように転送先ホスト名をハードコードしてしまうと、 サーバが増えたり減ったりして構成が変わってしまった場合に、スクリプト を書き換える必要がでてきます。
サーバが故障したり増設した際に、うっかり書き換えを忘れてしまうと「フ ァイルが転送されない!」という障害に直結してしまいます。これはあまり にも危険すぎます。
この問題は、「稼働中のサーバを管理する機構」と「並列にファイル転送す る機構」を構築し、これらを組み合わせることで解決できると思います。稼 働中のサーバ一覧を取得し、下図のような論理的なツリー構造を形成してか らファイルを転送すればよいのです。
+-------+ +--->| host4 | +-------+ | +-------+ +--->| host2 |--+ | +-------+ | +-------+ | +--->| host5 | +-------+ | +-------+ | host1 |--+ +-------+ | +-------+ | +--->| host6 | | +-------+ | +-------+ +--->| host3 |--+ +-------+ | +-------+ +--->| host7 | +-------+
DSASの中には、実際にこのようにして全サーバのファイルを同期をしている システムがあります。この構成は、とても転送効率はよいのですが、システ ム構成や転送プログラムの処理が必要以上に複雑になってしまう点が悩まし いところです。その結果として、以下のような別の問題を抱えることになり ます。
- 軽微な変更や機能追加をするだけでもかなりの労力が必要
- 転送中に発生したエラーを拾うのが大変
- 不具合が発生したときに挙動を追うのが結構大変
- 動作検証が超面倒
速度を求めれば構成が複雑になり、シンプルにすると遅くなるというジレン マに陥ってしまいました。
DSASにおけるファイル転送のニーズ
DSASでファイルを転送するニーズは大きく分けて二種類あります。
まずひとつめは、サーバを増設したりHDDが故障したときなどの”システム
全体のミラーリング”です。これは、1対1の転送なのでrsyncが便利です。
ふたつめは、Webアプリケーションのデプロイや、素材ファイルのアップロ ードなどの”コンテンツの転送”です。運用フェーズでは、こちらのニーズ の方が圧倒的に多いです。冒頭でお話した長年の懸念とは、このニーズを満 たすことを指しています。今までは、この作業にrsyncを利用したスクリプト を使っていました。(今でも使ってますが(^^;
このスクリプトは、htdocsやwebapps以下のファイルをrsyncで全サーバに転 送するものです。コマンド一発で簡単に転送できて便利ですが、いろいろと 問題もありました。
サイトの規模やWebアプリケーションが肥大化するとともに、ファイル構成 やアーキテクチャが複雑になってきたため、サイト毎に特殊なニーズがでて くるようになりました。たとえば、、、
- あるタイミングで一部のファイルだけ転送したい
- このファイルは転送したいけどこれはしたくない
- 定期的に指定した部分だけを転送したい
- Webアプリケーションの動作と連動して転送したい
- あるイベントをトリガにして転送を開始したい
- できるかぎりリアルタイムに転送したい
- などなど
これまで使っていたスクリプトは、簡単にファイルを転送できる反面、きめ 細かなニーズに対応することが困難でした。そのため、効率よくファイルを 転送できるようにするためには、それぞれのニーズに見合ったスクリプトを 書く必要があります。しかし、実際に「rsync で全サーバに効率よくファイ ルを転送するスクリプト」を書くのはとても大変な作業です。
そこで、「全サーバに効率よくファイルを転送する」という機能をDSASの内 部に組み込んでしまい、「転送したいファイルやディレクトリのみを指定す るインターフェイス」をアプリケーション開発者に提供できれば、きめ細か なニーズに対して、簡単で柔軟に対応できるようになるのではないかと考え ました。これが「まくお」を作り始めたきっかけです。
「まくお」の仕組み
最後に、「まくお」がどのようにしてファイルを転送しているのかを簡単に
紹介します。
「まくお」では、複数のサーバへ同時にファイル転送をするために、マルチ
キャストを利用しています。送信元のサーバは、マルチキャストアドレスに
対してファイルの内容を送出します。転送先のサーバはそれを拾ってローカ
ルファイルを生成します。
+-------+ +-------+ | host2 |<-----+-------->| host4 | +-------+ | +-------+ | +-------+ | +-------+ | HOST1 |------->(Multicast)---->| host5 | +-------+ 224.0.0.108 +-------+ | | +-------+ | +-------+ | host3 |<----+-------->| host6 | +-------+ +-------+
送信元のサーバは、ひとつのファイルを何度も送りなおす必要がありません。 転送先のサーバが何台あったとしても、一度の送信ですべてのサーバへ転送 することができます。
とはいっても実際は、取りこぼしたパケットを補間するために再送処理が必 要になるので、同じデータが何度か繰り返し流れることもあります。その場 合でもファイルをまるごと再送するわけではなく、取りこぼしたパケットの みを再送するので、すべてのサーバへ一台づつ転送するよりも、ネットワー ク全体を流れるデータ量や転送時間は少なくて済んでいます。
今後の予定
現在の「まくお」には、以下のような問題(というか未実装の機能)があります。
- 転送先のファイルを消せない(rsync --delete相当の機能がない)
- SysVinit向けの、起動/停止スクリプトを作っていない
- マニュアルが不十分(><)
- ファイルの転送効率をもっと上げられるはず
これらは、今後のバージョンアップで随時対応していきたいと思います。