MongoDBでゆるふわDB体験

第7回 GridFS─大容量のファイルをMongoDBに保存する仕組み

この記事を読むのに必要な時間:およそ 3 分

GridFSの概要

MongoDBに保存できるドキュメントのサイズは,16Mバイトまでという制限があります。一般的なテキストデータを保存するには十分なサイズですが,巨大なテキストデータや動画などのバイナリデータを保存する用途では,16Mバイトを超える場合が出てきます。MongoDBに16Mバイト以上のファイルを保存したい場合,GridFSというインターフェースを使用します。GridFSを使用することにより,データを複数に分割※1して保存することが可能となります。

今回はMongoDBでサイズの大きなファイルを扱う仕組みである,GridFSについて説明します。

図1 GridFSの概要図

図1 GridFSの概要図

※1)
分割したデータはチャンクと呼ばれ,バイナリデータとしてドキュメントに保存されます。

ファイルをデータベースで管理するメリット

ところで,ファイルをデータベースで管理することでどのようなメリットがあるのでしょうか。

多くのシステムでは,画像/音声/動画などサイズの大きなバイナリファイルは,OSのファイルシステムを使って保存されています。ファイルシステムを使用すると慣れ親しんだインターフェースでファイルにアクセスできます。しかし場合によってはファイルをデータベースに保存し,管理した方が効率的なことがあります。以下にデータベースでファイルを管理するメリットを整理してみました。

メタデータの管理がしやすい

ファイルだけではなく,ファイルに関連するメタデータも一緒に管理する場合が多くあります。たとえば,ファイルサイズや作成者,作成日時などです。動画ファイルなら再生回数を管理するケースも考えられます。データベースではファイルと関連したメタデータの管理がしやすく,拡張性があります。また,メタデータを含めたバックアップも容易です。

ファイルシステムの作成数制限を受けない

OS全体でファイル数やディレクトリ数の作成数には制限があります。たとえば,ext3の場合,ディレクトリ内のサブディレクトリやファイルの数は32,000という制限が設定されています。

簡単にGridFSを使ってみる

MongoDBでGridFSを使うのに特別な設定・使用方法は必要ありません。レプリカセット・シャーディングで使用することも可能です。さっそくGridFSを使ってファイルをMongoDBに保存してみましょう。

今回は,MongoDBに標準で用意されているコマンドラインツールであるmongofilesを使用します。コマンドのオプションや詳細は次ページで説明します。

まず,1MB.fileというファイル名で保存するファイルを作成します。下の例ではファイルサイズ1MBで作成しています。

$ dd if=/dev/zero of=1MB.file bs=1M count=1

mongofiles※2を使用して,gridtestというデータベースに先ほど作成した1MB.fileを保存します。

$ mongofiles -v -d gridtest put 1MB.file
Wed Feb 20 15:23:27 creating new connection to:127.0.0.1:27017
Wed Feb 20 15:23:27 BackgroundJob starting: ConnectBG
Wed Feb 20 15:23:27 connected connection!
connected to: 127.0.0.1
added file: { _id: ObjectId('51246bdfa3264162c8e99716'), filename: "1MB.file", chunkSize: 262144, uploadDate: new Date(1361341409698), md5: "b6d81b360a5672d80c27430f39153e2c", length: 1048576 }
done!

上記のように表示されますと保存成功です。

※2)
mongofilesはMongoDBをインストールしたディレクトリのbin以下にあります。

コレクション構造について

Mongo ShellからGridFSのコレクションを確認してみましょう。MongoDBに接続し,gridtestデータベースを選択します。

$ mongo
> use gridtest
コレクションを確認します。
> show collections
fs.chunks
fs.files
system.indexes

インデックスの他に,fs.chunksとfs.filesというコレクションができています。それぞれの役割は以下のようになっています。

fs.chunks

GridFSでは,ファイルをチャンクとして一定サイズに分割して,fs.chunksコレクションに保存します。分割するファイルサイズはデフォルトでは256KBです。

fs.files

fs.filesコレクションには,ファイル名,アップロード日時,MD5ハッシュ情報,ファイルサイズなどのメタデータが保存されています。任意のメタデータを追加することも可能です。

保存されているメタデータに関しては公式ドキュメントにより詳しい情報があります。

次のページでは,GridFSの操作方法としてmongofilesとrubyドライバの2つを説明します。

著者プロフィール

藤崎祥見(ふじさきしょうけん)

野村総合研究所 OpenStandia所属。オープンソースのR&Dとセミナー講師を担当。

Debian,Ubuntu,Liferayのコミュニティで活動した後,MongoDBの翻訳に関わり,丸の内MongoDB勉強会を始める。

実家がお寺で,住職の資格を所持する坊主系エンジニア。

Twitter:@syokenz


渡部徹太郎(わたなべてつたろう)

野村総合研究所 OpenStandia所属。オープンソースを使ったSIやサポートの業務に従事。

藤崎と共同で丸の内MongoDB勉強会を始める。

趣味は自宅サーバ。好きなものはLinuxとRuby。

Twitter:@fetarodc


林田敦(はやしだあつし)

野村総合研究所 OpenStandia所属。オープンソースを使ったSIや製品開発業務に従事。

丸の内MongoDB勉強会では広報兼雑用係を務める。

趣味はレザークラフト,ダイビング,スキー,キャンプ,ジェットスキー,カメラ等々。作って滑って撮って潜れるエンジニア。

Facebook:Atsushi Hayashida

コメント

コメントの記入