PerlbalでMogileFSを更に高速化、効率化する

原和久(moonlinx)
2009-04-20 18:03:01
  • このエントリーをはてなブックマークに追加

MogileFSのさらなる高速化、効率化

 前回「MogileFSで構築する高速スケーラブルな分散ファイルシステム」では、moonlinxで活用しているMogileFSについて説明しました。今回はMogileFSの更なる高速化、効率化を追求してみましょう。

MogileFS活用のために、まずは問題点を把握

 素のMogileFSをそのまま利用した場合、ファイルにアクセスするために、クライアントが毎回trackersへ問い合わせをすることになります。これは、trackersはデータベースに全ての情報を格納しているので、毎回データベースを参照することを意味しています。

 moonlinxでは、作品メディアファイルのサムネイルも含めてMogileFSに保存しています。そのため、サムネイルが多い画面では1つの画面を表示するために、数十回ほどMogileFSへアクセスすることになります。

 trackersは1つのデータベースを共有する形で簡単にスケールすることもできますが、これではサーバ負荷が高く、データを取得するだけで様々なサーバを仲介することにもなるため、あまりスマートとはいえません。

 また、ファイルサイズが大きくなればなるほど、MogileFSクライアントとなるウェブアプリケーションへの負荷も高まります。

 そこでアプリケーションサーバの前に、プロキシキャッシュサーバであるPerlbalを置き、ファイルの代行取得、およびファイルのありか(URL)をキャッシュする方法を採用しました。

Perlbalとは?

 PerlbalはPerlで書かれた、ウェブサーバやロードバランサの機能を持ったモジュールです。設定次第で様々な機能を持たせることができます。

  • ウェブサーバ
  • ロードバランサ
  • リバースプロキシ
  • プロキシキャッシュサーバ

 moonlinxでは、リバースプロキシとプロキシキャッシュを設定して運用しています。

moonlinxでのPerlbal活用例(画像をクリックすると拡大します) moonlinxでのPerlbal活用例(画像をクリックすると拡大します)

 MogileFSの前段にPerlbalを設置することで、Perlbalがファイルを代行して取得および返却してくれるようになります。また、一度取得したことがあるファイルに関しては、ファイルのありか(URL)をキャッシュさせることで、MogileFSへのアクセスを大幅に減らすことができます。

 これらの仕組みを実現するために、Perlbalには「X-REPROXY-URL」「X-REPROXY-CACHE-FOR」というヘッダが用意されています。

X-REPROXY-URLとX-REPROXY-CACHE-FOR

 Perlbalに対し、HTTPのレスポンスヘッダとしてX-REPROXY-URLヘッダを与えてやると、Perlbalが自動的にファイルを取得し、返却まで行ってくれるようになります。

X-REPROXY-URL: http://exampledomain/path/to/file http://exampledomain/path/to/file2

 また、複数のURLをスペースで区切って指定することで、そのいずれかからファイルを取得してくれます。TrackerからファイルのURLを取得する際、レプリケーションが行われていれば最低でも2つのURLが返却されるはずなので、そのままX-REPROXY-URLヘッダに指定してやると良いでしょう。

 さらに、X-REPROXY-CACHE-FORのヘッダを一緒に与えてやることで、Perlbalが自動的にURLをキャッシュしてくれるようになります。

X-REPROXY-URL: http://exampledomain/path/to/file http://exampledomain/path/to/file2

X-REPROXY-CACHE-FOR: 604800
※:604800はキャッシュ有効時間(秒)です。

 これで一度PerlbalにURLをキャッシュさせてしまえば、以降trackerへのアクセスは発生しなくなり、大きく負荷を減らすことができます。

 次にMogileFSを運用する際の注意点を説明します。

  • 新着記事
  • 特集
  • ブログ