活用シーンの拡がる「MongoDB」って?(1) MongoDBの仕組みを知る

活用シーンの拡がる「MongoDB」って?(1) MongoDBの仕組みを知る

皆さんは「MongoDB」をご存知でしょうか? IoTなどの分野でも、最近注目を集めている「SQL以外のデータベース=NoSQL(Not only SQL)」の分野で、国内で普及率No.1のデータベースです。 これから数回に分けてMongoDBの特徴をご紹介していきたいと思います。

MongoDBとは?

MongoDB は2007年に 10gen 社 (現 MongoDB Inc.) によって開発された、オープンソースの ドキュメント指向型NoSQL です。
※NoSQLってなんだっけ?という方はこちらの コラム もご覧ください。

クロスプラットフォーム対応で、Windows / Linux / MacOS / Solaris に対応 しています。MongoDB 社は、2013年には約150億円の資金調達に成功し、現在も開発が進められています。
MongoDB自体はオープンソースですが、サブスクリプションと管理ツールをMongoDB Inc.が販売しており、有償ながら 開発元から直接サポート を受けることができます。

冒頭でも触れましたが、MongoDB とは、NoSQLの中でも特に広く普及しているデータベース・システム です。
MongoDB は、SNSやクラウド用アプリのバックエンドとして使われているだけでなく、電子商取引(eコマース)やオンラインバンキング、投資向けアプリなどに使われているほか、Internet of Things (IoT) 分野 でのデータの管理・集計・分析に用いられたり、ブロックチェーン の分野にも採用されています。

導入事例が多く、あちらこちらで使われている

MongoDB は世界的企業にも採用されていて、その活躍のフィールドも多岐にわたっています。

最近だと MongoDB.com には以下のような記事(英語です)も掲載されています。

<註釈・抜粋>
今年のMongoDB Worldカンファレンスにおいて、フランスのAXA (大手保険会社 )の開発者、Guillaume Chervet氏 と Vincent Gillot氏が、同社の推進する Connected Home (スマートホーム) プロジェクト について解説した。
このプロジェクトは、MongoDBとnode.jsをベースに開発されており、次のような点について説明している。

  • 開発を通して段階的にスキーマデザインを改善し、顧客データ、センサーデータそして様々なメッセージ情報を効率良く最適化した方法。
  • 家庭内に設置されている複数のセンサーからミリ秒毎にデータを収集し、そのデータ処理を通してアラートなどを発行する仕組 み。
  • この センサーデータの分析 と レポーティング を MongoDB のAggregation Engine を活用して実現 している点。
  • アプリケーションのコードが、V3.2への移行を通して非常にシンプルになったこと。特にDocument Vaildation機能でIoTイベントのスキーマ構造を統一できたことや、$lookup機能を使って複数のコレクションのデータをJOINしてより高度な分析ができるようになったことが要因。

また日本国内でも、MongoDB の日本法人が設立されていないにもかかわらず、利用者は非常に多く、導入事例も多数登場 しています。

例えば、MongoDBのエラーコードをGoogleで検索すると、日本国内での事例や対策例が日本語で多数表示されます。
このようにMongoDB は NoSQLであることの長所 を十二分に生かして、従来のRDB (リレーショナルデータベース) しか選択肢のなかった世界に、ビッグデータを扱うことに重点を置き、RDB が比較的苦手とする部分を補う形で採用 されています。

MongoDBの特徴とは?

このように、ビッグデータ分析のみならず、幅広い分野のデータベースとして採用されている MongoDB。

では実際に、MongoDBとはどのような機能を持つデータベースなのでしょうか?
MongoDBの特徴をいくつかご紹介していきます。

1. スケールアウトが簡単にできる

MongoDB はCAP定理による分断耐性 と BASE特性による結果整合性 を保つことで、物理的にサーバやネットワークが異なっても、データベースを稼働させ続けることができる よう設計されています。

これにより、取り扱うデータ量の増加によってサーバの能力が不足した時に、安価なIAサーバを台数を追加して処理能力を向上させる「スケールアウト」 によって簡単に 機能拡張 することができます。

2. 大量のデータを迅速に取り扱うことを想定している

データを 「キー」 と 「値(バリュー)」 のシンプルな問い合わせの処理をすることで、大量のデータを迅速に処理 することができます。
このデータ処理の方法や構造により、NoSQL は、キー・バリュー・ストア(KVS)型 ・ カラム指向型 ・ ドキュメント指向型 ・ グラフ型 に分類されます。

3. データの読み書きが早い

NoSQL は、格納した「キー」と「値(バリュー)」に対して、複雑なクエリ処理はあまり行わずに、大量のデータを 迅速にDB内に書き込む速度 と、データを読み出す速度 を上げることに注力をしています。

またMongoDBは、DB 側で行う各種処理は全てメモリ上で実施 します。特に書込の場合は、プライマリへのレコードの書込クエリが、プライマリサーバのメモリ上 に展開されている、特別なログファイル に書き込まれたタイミングで、先にクライアントへ ack を返し、その後に レコードをHDD上にフラッシュ することもできるため、高速な書込を実現しています。

データの読出しに関しても、MongoDBは RDB並みに高性能なクエリ言語 を持っています。
また、MongoDBはNoSQLでありながら、かなり 柔軟にインデックスを張る ことができます。クエリ言語やインデックスの詳細については次回以降で触れますが、階層構造のデータにもインデックスを張ることもでき、RDBにも引けを取らないくらいデータの抽出が簡単に行えます。

4. JSON形式でデータを格納できる

MongoDB はRDBとは異なり、レコードをテーブル (表形式) に格納するのではなく、「ドキュメント」 と呼ばれる JSON形式 のレコードをバイナリエンコードにした BSONで管理 し、それらドキュメントの塊を 「コレクション」 として格納します。<図1>
(少々煩雑になるので、ここではBSONをJSONとして表記します)

<図1>JSON形式 のレコードであるドキュメントを、コレクションとして格納

RDBでいうところの”テーブル” が、MongoDBでいう “コレクション” を指し、コレクションの中に複数の”ドキュメント”を格納します。

<図2>コレクションの中に複数の”ドキュメント”を格納
JSONは「キー」と「値」のペアを格納しますが、この「値」について、MongoDBは図1 のように、JSON形式で表現できるデータであれば基本的に何でも格納します。
ですので 「配列データ」 や 「階層構造のデータ」「JSONそのもの」 も格納できます。

JSONは、xml よりも簡単に 階層構造のデータを記述 でき、データ自身も軽いため、PCやServer間の通信では広く使われています。
階層構造のデータや、ログデータをはじめとする半構造化データは、RDB では取り扱いが難しいため、これまでMySQLやPostgreSQLで占めていた部分をMongoDBに置き換えていく 場面も見受けられるようになり、現在 Webアプリケーションやオンラインゲームのバックエンドでの利用 が多くなっています。

特に IoTデバイス である センサーデータの通信 には HTTPプロトコルを経由して、「REST API」もしくは「CSV」で渡されることが多いため、センサーから渡されるデータをREST API=JSON形式データ として、そのままドキュメントとして格納できる MongoDBは、IoT 向けアプリケーションのバックエンドにも最適 であると言えます。

5. Webアプリケーションとの親和性が高い

MongoDBは以下のプログラミング言語向けにドライバを用意しており、昨今の Webプログラミングとの親和性は高い といえます。

MongoDB のプログラミング言語向けドライバ
C / C++ / C# / Java / Node.js / Perl / PHP / Python / Ruby / Motor / Scala
(この他にもMongoDBコミュニティ有志によって公開されているドライバは存在します)。

6. スキーマを持たない

MongoDBは、コレクションに対して RDBMS のような 固定的なスキーマは持ちません。その代わり、アプリケーションは 自身の構造やデータ型に合った自然な形でデータを格納することができます。

ただし、アプリケーション側 で、どのコレクションにどのような内容のドキュメントを格納したのか管理が必要です。
投入したドキュメントのデータ型が異なっていたり、データ内容がアプリケーションにそぐわないものだったとしても、MongoDB側ではエラーと表示せずにそのまま格納してしまうので注意が必要です。

※この部分について、MongoDB の現行 version3.2 以上であれば、アプリケーション側から格納する JSON ドキュメントに対して、簡単なスキーマのチェック機能が盛り込まれました。

いかがでしたでしょうか?今回は以上です。
次回は、MongoDBの特徴の目玉である「レプリケーション」 と 「シャーディング」 などを中心にご紹介したいと思います。

記事は、予告なく変更または削除される場合があります。
記載された情報は、執筆・公開された時点のものであり、予告なく変更されている場合があります。
また、社名、製品名、サービス名などは、各社の商標または登録商標の場合があります。