MogileFSで構築する高速スケーラブルな分散ファイルシステム

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

 本連載「オープンソースソフトウェアでクリエイターを支援するmoonlinx」の第1回「ウェブメディア「moonlinx」を支えるオープンソースソフトウェア」ではmoonlinxの概要およびシステム構成を、第2回の「openSUSEの管理ツール「YaST」で作業を効率化:moonlinxを支えるOSS」では使用OSであるopenSUSEについて簡単に説明しました。

 今回は、moonlinxで取り扱うメディアファイル(画像、音楽、動画)の保管方法について説明したいと思います。

分散ファイルシステム「MogileFS」

 moonlinxでは、各種メディアファイルの保管に、オープンソースの分散ファイルシステム「MogileFS」を利用しています。

 分散ファイルシステムを用いることにより、ファイルシステムを構成するノード群の一部がダウンしても、データを失うことなくシステムとして機能し続け、かつ自動レプリケーションによるバックアップにより信頼性の高い環境を実現しています。

 日本ではまだ採用実績が多いとはいえないMogileFSですが、アメリカの最大手ブログサイトのひとつ「LiveJournal.com」や、ソーシャルニュースサイト「Digg」などで採用されており、その有用性は折り紙つきです。

moonlinxのシステム構成。今回はMogileFSを取り上げる(画像をクリックすると拡大します) moonlinxのシステム構成。今回はMogileFSを取り上げる(画像をクリックすると拡大します)

MogileFSとは

 MogileFSはmemcachedで有名なDanga Interactiveで開発されたオープンソースの分散ファイルシステムです。Perlで実装されており、CPAN経由でのインストールも可能です。

MogileFSには以下のような特長があります。

  • 特殊カーネル不要
  • プロトコルはHTTPを利用
  • RAID、SAN、NFS一切不要
  • ファイルシステム依存なし
  • 自動レプリケーション
  • 簡単にディスク追加が可能
  • 自動フェイルオーバー

 SANで使用されるような特殊なハードウェアやプロトコルは不要ですし、iSCSIのように利用するために、カーネルをリビルドする必要もないため、さまざまな環境で容易に利用できるというのが大きなメリットです。

 また、ディスク共有型ではなくサーバ単位の冗長化ですので、単純にノードを追加していくだけでストレージの拡張が行えます。加えて、MogileFSは複数のサーバ間で同一のファイルを自動でレプリケートするため、ノードのうちのどれかがダウンしたとしても、ファイルにアクセスできなくなることがありません。

 moonlinxでMogileFSを採用した理由として、ユーザーがアップロードするメディアファイルを大量に管理する際、どうしてもストレージの扱いが煩雑になってしまう背景が過去にありました。

 高性能なストレージ装置を利用した環境が構築できれば最適なのかもしれませんが、そこにばかりコストをかけられないという事情もあります。また、何か問題があった場合にできる限り自分たちで解決したいと考えていたこともあり、最終的にはオープンソースソフトウェアであるMogileFSに落ち着きました。

 ここでMogileFSを構成する各種コンポーネントについて説明します。

MogileFSを構成するコンポーネント群(画像をクリックすると拡大します) MogileFSを構成するコンポーネント群(画像をクリックすると拡大します)

MogileFSのコンポーネント群

 MogleFSは3つのコンポーネントとデータベースから構成されています。

  • trackers(mogilefsd)
  • storage nodes(mogstored)
  • client(Perl、Ruby、PHPなど)
  • tracker's database(MySQL)

trackers(mogilefsd)

  • clientとstorage nodeの間を取り持つ
  • clientからリクエストを受け取ったり、DBでstorageの状態を管理する

storage nodes(mogstored)

  • ファイル実体を保存するhttpサーバ
  • WebDAVに近い振る舞い

client(Perl、Ruby、PHPなど)

  • クライアントインターフェース
  • 公式にはPerlのみ
  • moonlinxではrubyクライアントを利用しています

tracker's database(MySQL)

  • ファイルのノード情報、storage nodesの情報を保持する
ストアの動き(画像をクリックすると拡大します) ストアの動き(画像をクリックすると拡大します)

 trackersにメディアファイルを任意のキーと共にストアすると、Storage nodeのいずれかに所定の数分保存されます。この値(デバイス、レプリカの数)は設定ファイルでデフォルト値を決められるほか、ストアのタイミングでも指定することができます。ただし、キーの値は一意である必要があります。

参照時の動き(画像をクリックすると拡大します) 参照時の動き(画像をクリックすると拡大します)

 trackersにストアした際、付与したキーを問い合わせることによって実ファイルがStorage nodeのどこにあるかを返してくれます。この際の返値は、「http://exampledomain/path/to/file」の形式で、レプリカがある分だけ全て返す仕様になっています。

 以上が、MogileFSの基本的な構成です。次回はMogileFSの「更なる」高速化と効率化について解説します。

  • コメント(3件)
#1 hryksbt   2012-11-05 12:36:51
MogileFSについてご紹介頂きありがとうございます。
一点質問なのですが、自動レプリケーションでもって冗長性が保たれるとの事ですが、ノードを追加して容量拡張する様な事もMogileFSでは可能なのでしょうか。
でなければ大容量を取り扱う場合、どうしても高価で大容量ななストレージが必要なのかと考えてみたりしています。
お忙しいところかと思いますが、ご回答お待ちしております。
#2 通りすがり   2012-11-19 16:51:08
実際にmogilefsを使用していますができますよん。
細かく設定しないとほぼ均等にレプリケーションされますので
容量が異なるサーバーが混在する場合は注意ください。

1TBのサーバーが6台だった場合は2TB程度を分散保存でき、
保存可能な総容量=t(TB)×n(SV台数) / r(レプリケーション数)
という計算式が成り立ちます。

この記事は3年前ですが最近のバージョンではMemcached対応や、
PostgreSQL対応など機能も強化され、
使い勝手も良くなっていますので是非お試しあれ。
#3 通りすがり   2012-11-19 16:52:18
上のコメントですが、レプリケーションポリシー数3の場合です。
失礼しました。
  • 新着記事
  • 特集
  • ブログ