今日も適当ダイアリー

PHP や Javascript や Symfony、BEAR.Sunday などのWeb周りのことを中心に。それ以外のことも気まぐれに投稿します。

MongoDB の歴史(MongoDB 2.0 まで) #mongodbjp

つい先日の9月12日、MongoDB 2.0 が正式にリリースされました。
2.0 から始める MongoDB」 という記事を書くにあたって、MongoDB 2.0までの遷移を調べていたのですが思いのほか濃い内容になってしまい、せっかくなのでここで皆さまに共有します。

~2008年

Githubのレポジトリを見ると、ファーストコミットは2007年10月20日のこと。"first commit" というメッセージと共に30ファイル、計約2000行のコードがコミットされています。いつから開発が始まったかは定かではありませんが、2007年後半からプロジェクトがスタートしたと推測できます。
(正確な情報をご存じの方がいましたら、教えてください。)
GitHub: mongodb/mongo - first commit

Gitリポジトリのタグから察すると、2007年10月に最初のコミットが行われた後、2008年の6~7月には ver.0.0系、2008年下半期には ver.0.1系(rcのタグしかないのですが)を開発しており、MongoDB の基本的な機能を実装していたものと思われます。

2009年

2009年に入ると、ver.0.2系が2009年2月に、ver.0.9.0が 2009年4月にリリースされており、ver.1.0 に向けての最終調整に入る事になります。
2009年の半ばくらいから、ちらほらと日本でもブログなどの記事として MongoDB が登場するようになってきます。
また、この頃になると、プロジェクト管理ツールとして JIRA が導入されたようです。
MongoDB Core Server (JIRA)

2009年 下半期
7月8月9月10月11月12月
(07: ver.0.9.6)
(29: ver.0.9.7)
14: (ver.0.9.8)
18: (ver.0.9.9)
24: (ver.0.9.10)
27: ver.1.0.0
(14: ver.1.1.0) (01: ver.1.1.1)
(16: ver.1.1.2)
22: ver.1.0.1
(10: ver.1.1.3) (04: ver.1.1.4)
10: ver.1.2.0
30: ver.1.2.1
(31: ver.1.3.0)


表では、日付(JIRA 上のリリース日なので、ずれている場合があるかも)とバージョン番号を載せています。また、安定版は太字に、開発版はカッコ付きで表記してあります。
なお、MongoDBのバージョン番号は少し特殊で、0.2 ずつ上がります。マイナーバージョンが偶数のものが安定版(1.0, 1.2, 1.4 …)、奇数のものが次のリリースへの開発版(1.1 は 1.2 の開発版, 1.3 は 1.4 の開発版…)となります。(少しでも見やすいように、バージョン0.2ずつ交互に色分けして表示してあります。)

バージョン 1.0

2009年8月27日にバージョン1.0.0として、初めての正式なGAリリースが行われます。

プロダクション環境でシングルマスター、マスター/スレーブ、レプリカ・ペアをする準備が整っています。人々が望むもっとたくさんの機能があり、動作します。1.0 は非常に安定しており、コードベースは18ヶ月以上、プロダクションで使われています。

1.0 GA Released : MongoDB blog から翻訳

バージョン1.0.0のリリース後、9月~12月にかけて、1.1系が開発されます。その後、12月10日に、バージョン1.2.0がリリースされます。

バージョン 1.2

リリースノートを要約すると次のようになります。

新機能

  • コレクション毎への追加のインデックス
  • より高速なインデックス生成
  • Map/Reduce
  • JavasScript 関数の保存
  • 設定可能な fsync 時間
  • いくつかの小さな機能や fix

アップグレードの注意点

1.0からのアップグレード時には、DBの更新が必要です。
master/slave
レプリケーションにおいて、小さな変更が行われました。master/slave 設定が行われている ver.1.1.2以下 からのバージョンアップの際は、slaveからアップデートする必要があります。
mongoimport
mongoimportjson が削除され、mongoimport に置き換わりました。mongoimportでは、json/csv/tsv からインポートを行えます。
フィールドフィルタ
フィールドフィルタの動作が若干変更されました。以前は、フィールドフィルタを使うと、これらのフィールドを持つオブジェクトのみが返されていましたが、フィールドフィルタは(フィールドを持つか持たないか、に関わらず)出力時にのみに用いられます。以前の動作が必要な場合は、$exists を使用できます。
1.2.x Release Notes - MongoDB から抜粋翻訳

多くの改善が行われていますが、MapReduce 機能により、サーバー側で柔軟に解析や集計させることが出来るようになった事は見逃せないでしょう。

蛇足ですが、1.2で正式に取り込まれた機能で気になったものを少しだけピックアップします。

Add --version option
実は、ver.1.1.1 まで --version オプションが無かったそうな。これまでは、起動しない限りはバージョン情報を見ることが出来ませんでした。

JSON PrettyPrinter
読みやすい形で JSON を整形してくれる機能は、ver.1.1.4 で追加されました。
mongoコンソールは javascript で何でもできるので非常に重宝しているのですが、この機能がないと、大きなドキュメントは見る気になりませんね。。。

2010年

さて、年が改まって2010年を見ていきます。NoSQLが一気に有名になりバズワード化したのもこの年だったと思いますが、MongoDBはより使いやすく進化していきます。

2010年 上半期
1月2月3月4月5月6月
(20: ver.1.3.1)
27: ver.1.2.2
23: ver.1.2.3
(11: ver.1.3.2)
01: ver.1.2.4
(02: ver.1.3.3)
(17: ver.1.3.4)
(22: ver.1.3.5)
25: ver.1.4.0
07: ver.1.2.5
(09: ver.1.5.0)
14: ver.1.4.1
27: ver.1.4.2
(03: ver.1.5.1)
24: ver.1.4.3
(27: ver.1.5.2)
(17: ver.1.5.3)
29: ver.1.4.4
バージョン 1.4

2010年3月には ver.1.4 がリリースされました。

1.2 から 1.4 へのアップグレードは、mongod をシャットダウンし、新しいバイナリを起動するだけです。

コアサーバーの強化

  • 並列処理の向上
  • インデックス時のメモリーの改善
  • バックグラウンドでのインデックス生成
  • 正規表現のより良い検出

レプリケーション & シャーディング

  • スレーブ再起動時のよりより処理
  • スナップショットからの高速な新しいスレーブ
  • 設定可能なスレーブディレイ
  • マスターでのレプリケーション処理クロックの非対称化
  • $inc レプリケーションの fix

デプロイ & プロダクション

  • プロファイリングのための "slow threshold" 設定
  • 生ファイルのバックアップのための fsync + lock
  • DB ごとのディレクトリ分割のオプション
  • http でのサーバーステータス取得
  • REST インターフェース
  • DB コマンドでのログトーテート
  • serverStatus コマンドの強化
  • 新ツール mongostat

クエリ言語強化

  • 正規表現での $all
  • $not
  • 配列要素の部分マッチ $elemMatch
  • 配列のアップデートのための$ オペレータ
  • $addToSet
  • $unset
  • マッチしたオブジェクトの $pull サポート
  • 配列インデックスでの $set

Geo

  • 2D の地理空間検索
  • Geo $center, $box 検索
1.4 Release Notes - MongoDB から抜粋翻訳

ver.1.4 は MongoDB 全体に渡って、様々な機能強化や改善が行われました。かゆい所に手が届かない事が以前はありましたが、このバージョンできちんと手が届くプロダクトに進化していると言えるでしょう。
GeoIndex(地理空間へのIndex)への対応も特筆に値するユニークな機能でしょう。
また、ver.1.6 で正式にリリースされるシャーディングの布石としての機能がこのバージョンで追加されているのも、見逃せません。

2010年 下半期
7月8月9月10月11月12月
(02: ver.1.5.4)
(16: ver.1.5.5)
(24: ver.1.5.6)
(30: ver.1.5.7)
(03: ver.1.5.8)
05: ver.1.6.0
17: ver.1.6.1
31: ver.1.4.5
01: ver.1.6.2
(04: ver.1.7.0)
23: ver.1.6.3
(28: ver.1.7.1)
26: ver.1.6.4
(29: ver.1.7.2)
(16: ver.1.7.3)
20: ver.1.6.5
(21: ver.1.7.4)


2010年8月には、ver.1.6.0 がリリースされます。

新機能

  • シャーディング
  • レプリカセット

改善

  • $or クエリー
  • 並列処理の向上
  • $slice オペレータ
  • コレクション毎に64個のインデックスが可能に(これまでは40個でした)
  • 64-bit integer がシェルで NumberLog を使って表されるように
  • findAndModify での Upsert をサポート
  • ドキュメントのディスクロケーションを表示する $showDiskLoc オプション
  • IPv6 と UNIX ドメインソケットのサポート
  • Windows サービスの向上
1.6 Release Notes - MongoDB から抜粋翻訳

ver.1.6 ではシャーディングが production-ready として正式に追加されました。また、レプリケーション機能においてもレプリカセットがリリースされ、より幅広いニーズに応えられるようになりました。
この、シャーディングとレプリケーションにより、水平スケール、バックアップ、フェイルオーバーなどの巨大なデータや安定性に必要不可欠な機能が一通り出そろったといえるでしょう。

また、この頃になると、日本でも MongoDB の情報が様々なところで見られるようになってきます。MongoDB JP が立ち上がったのも11月。その翌月に「第1回 MongoDB JP & CouchDB JP 合同勉強会」が開催されるなど、ユーザー数も急激に増加していたと思います。

2011年

2011年 上半期
1月2月3月4月5月6月
(26: ver.1.7.5) (14: ver.1.7.6)
(23: ver.1.8.0-rc0)
(04: ver.1.8.0-rc1)
(09: ver.1.8.0-rc2)
16: ver.1.8.0
06: ver.1.8.1 (02: ver.1.9.0) 17: ver.1.8.2


2011年3月には ver.1.8 がリリースされました。

新機能

  • ジャーナリング
  • Sparse, Cavered インデックス
  • インクリメンタル Map/Reduce サポート
1.8 Release Notes - MongoDB から抜粋翻訳

大きな機能としては、write-ahead(書き込み前に)ログを取ることで、素早いクラッシュリカバリと耐久性を助けるジャーナリング機能や、特定の検索を高速化する Sparse, Cavered インデックス、より柔軟な Map/Reduce をサポートするオプションの追加、などが挙げられます。
特に、ジャーナリングのサポートは、耐久性、信頼性の向上に寄与する機能で、プロダクトで使用する際には心強い機能です。
リリースノートには小さくしか記載されていないのですが、個人的には、Geoインデックスが球体対応し、ほぼ正確な地球上の距離を使用してのソートなどが可能になったことも見逃せない向上点です。

2011年 下半期
7月8月9月10月11月12月
(26: ver.1.9.1) (15: ver.1.9.2)
22: ver.1.8.3
(25: ver.2.0.0-rc0)
(02: ver.2.0.0-rc1)
(07: ver.2.0.0-rc2)
12: ver.2.0.0
*29: ver.2.0.1
*04: ver.1.8.4
(04: *ver.2.1.0)
(01: *ver.2.1.1)
(29: *ver.2.1.2)
 


9月14日以降のリリース(*)については、目標であり正式なものではありません。

現時点での最新版である MongoDB 2.0.0 がリリースされたのは12日でした。

新機能

  • Compact コマンド
  • Concurrency の改善
  • デフォルトスタックサイズ
  • Indexの強化
  • セキュリティ
    • Sharding 認証機能
  • Replica Sets
    • Priority
    • Data-center awareness
    • w : "majority"
    • マイノリティの復帰の際の再設定
    • Primary が secondary を見つけられない場合、ステップダウン不可能に
    • Extended shutdown on the primary to minimize interruption
    • メンテナンスモード
  • Geospatial Features
    • マルチロケーションドキュメント
    • ポリゴンサーチャー
  • Journaling の強化
  • バルクインサートのための新しい ContinueOnError オプション
  • Regex オプション: s
  • システムスキーマの変更(field changes)
2.0 リリースノート - MongoDB から抜粋

さすが、メジャーバージョンアップだけあって、様々な機能が追加されています。
ここでは、それぞれの機能を紹介しませんが、主に、開発・運用のしやすさに対する機能(クエリやコマンド、セキュリティ機能など)追加とその改善、そして、信頼性やスケーラビリティなどのための機能追加やその改善などが特に注力されているように思います。
レプリカセットの機能として、クラウドでの利用をサポートするために、データセンターやロケーションに対しての柔軟なオプションが設定できるようになったことも大きな進化です。

最後に

こうやって一気に歴史を追ってみると、MongoDB の設計思想である柔軟性パワースピード、そして簡単に使えることをきちんと追求していることが垣間見れた気がします。
(設計思想については「2.0 からはじめる MongoDB - 第0回 #mongodbjp : 今日も適当ダイアリー」で取り上げています)

きっと今後も MongoDB はより柔軟に、よりパワフルに、より高速に、より簡単になっていくでしょう。そんな MongoDB にこれからも目が離せませんよ!

関連記事もどうぞ