
PerlbalでMogileFSを更に高速化、効率化する
MogileFSのさらなる高速化、効率化
前回「MogileFSで構築する高速スケーラブルな分散ファイルシステム」では、moonlinxで活用しているMogileFSについて説明しました。今回はMogileFSの更なる高速化、効率化を追求してみましょう。
MogileFS活用のために、まずは問題点を把握
素のMogileFSをそのまま利用した場合、ファイルにアクセスするために、クライアントが毎回trackersへ問い合わせをすることになります。これは、trackersはデータベースに全ての情報を格納しているので、毎回データベースを参照することを意味しています。
moonlinxでは、作品メディアファイルのサムネイルも含めてMogileFSに保存しています。そのため、サムネイルが多い画面では1つの画面を表示するために、数十回ほどMogileFSへアクセスすることになります。
trackersは1つのデータベースを共有する形で簡単にスケールすることもできますが、これではサーバ負荷が高く、データを取得するだけで様々なサーバを仲介することにもなるため、あまりスマートとはいえません。
また、ファイルサイズが大きくなればなるほど、MogileFSクライアントとなるウェブアプリケーションへの負荷も高まります。
そこでアプリケーションサーバの前に、プロキシキャッシュサーバであるPerlbalを置き、ファイルの代行取得、およびファイルのありか(URL)をキャッシュする方法を採用しました。
Perlbalとは?
PerlbalはPerlで書かれた、ウェブサーバやロードバランサの機能を持ったモジュールです。設定次第で様々な機能を持たせることができます。
- ウェブサーバ
- ロードバランサ
- リバースプロキシ
- プロキシキャッシュサーバ
moonlinxでは、リバースプロキシとプロキシキャッシュを設定して運用しています。
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を運用する際の注意点を説明します。