SlideShare a Scribd company logo
1 of 23
Download to read offline
MongoDB 2.2 の新機能



                  第3回 丸の内MongoDB勉強会
                         NRI OpenStandia
                               藤崎 祥見




1
第3回丸の内MongoDB勉強会


                   丸の内mongodb




2
MongoDB 2.2 リリースノート

• このスライドでは リリースノートをもとに、2012/08/29 にリリースされた
  MongoDB 2.2.0の新機能を解説します
• リリースノート
  http://docs.mongodb.org/manual/release-notes/2.2/
  http://jp.docs.mongodb.org/manual/release-notes/2.2/
• 丸の内MongoDB勉強会#3 MongoDB 2.2.0 新機能紹介
  https://github.com/syokenz/marunouchi-
  mongodb/tree/master/20120926/syokenz
  コマンドレベルでの手順があります




3
MongoDB 2.2の新機能:ダイジェスト

• 並列処理の強化(Concurrency Improvements)
     •   ロックの粒度がGlobalロックからDBロックになりました
     •   PageFaultアーキテクチャが改善されロック時間が減りました

• Aggregation Framework
     •   集計処理がコマンドで可能になりました

• Replica SetsのReadノードの選択
     •   一貫性レベルに応じて、どのノードからデータをReadするかを選択可能になりました

• Tagを使用したSharding(Improved Data Center Awareness)
     •   データ保存先のShardをTagで指定可能になりました

• TTL(Time To Live) Collections
     •   一定時間で削除されるCollectionを定義可能になりました

• その他の主な変更点
4
並列処理の強化:ロックレベル

• GlobalロックからDBレベルロックへ
                         Mongodインスタンス

                              LOCK
                                                  2.0.x


          Update
                         Mongodインスタンス
                     LOCK       利用可能
                                                  2.2.x



    ※Collection level lockingはJIRAにチケット登録あり。
     https://jira.mongodb.org/browse/SERVER-1240
5    ただし、Fix VersionはPlanning Bucket A (2012/10/24現在)
並列処理の強化:Page Faultアーキテクチャ

• ロック中にPage Faultが発生し、ロックが長引くことを避ける仕組み
          Document Aの
    1     Update        LOCK     メモリ上にデータが無い
                                 ので、ディスクアクセス
          Document Bの
          Insert
                                 しなきゃ
                                        PageFaultException
          ロックされてる…



          Document Aの   LOCK解除   ディスクからデータを
    2     Update
                                 ロードするからちょっと
          Document Bの            待ってね。その間ロック
          Insert                 を解除して他の処理を実
                                 行するね。
            ロックされてない!実行します



    3     Document Aの    LOCK    ディスクからデータをロ
          Update
                                 ードしておいたのでロッ
                                 ク時間は短くて済むね。
            Retry!
6
Aggregation Framework

• データに対して集計処理を行うコマンド集
            • これまでMap/Reduceで行っていたもので、よく使うものをコマンドに
            • SQLでいう、GROUP BY機能に似たもの


    $match     ・・・条件で絞り込みを実施(SQLのWHERE)
    $project   ・・・集計処理を行うフィールドの選択/除外、リネーム(SQLのAS)、計算結果のInsertを実施
    $unwind ・・・指定された配列の展開を実施
    $group     ・・・$sum, $avgなどを使い集計処理を実施
                                              $projectと$unwindについて
    $sort      ・・・指定されたsortキーによるソートを実施        は、次ページ以降で説明
    $skip      ・・・指定された数字分スキップして次の処理へ渡す
    $limit     ・・・指定された数字分の結果を次の処理へ渡す




7
Aggregation Framework
                        SQL版
                           SELECT name as „_id‟, AVG(score) as „average‟ FROM scores
                           WHERE year = „junior‟
• Pipeline処理               GROUP BY = name

       • フィルタを通した結果を次の処理に渡す

    input
                           db.scores.aggregate(
                             { $match : { "year" : "junior" } },
        $match               { $project : { "name" : 1, "score" : 1 } },
                             { $group : { "_id" : "$name",
                                            "average" : { "$avg" : "$score" } } }
                           );
       $project
                           {
                             "result" : [
                             { "_id" : "quiz",
        $group                 "average" : 65.41666666666667
                              } ],
                             "ok" : 1
            result         };
8
Aggregation Framework

• $project
     • 基本はフィールドの選択を行う(projection(射影))
     db.article.insert(“title” : “mongo site” , "pageViews“ : 5);
     //計算結果をフィールドに追加
     db.article.aggregate(
       { $project : {
         “title” : 1,
         “doctoredPageViews “: { $add:["$pageViews", 10] }
       }}
     );
     //pageViewsフィールドをpage_viewsに変更
     db.article.aggregate(
       { $project : {
         “title” : 1,
         “page_views “: "$pageViews"
       }}
     );
9
Aggregation Framework

• $unwind
     • 配列を展開して次の処理に渡す

     db.article.insert({“title”:”mongo book”, “tags”:[“DB”, “Mongo”, “NoSQL”]});
     db.article.aggregate(
       { $project : { “_id” : 0, “title” : 1, “tags” : 1 } },
       { $unwind : “$tags” }
     );
     //配列tagsが展開されて次の処理に渡される
     { “result” : [
       { “title” : “mongo book”,
         “tags” : “DB”
       },
       { “title” : “mongo book”,
         “tags” : “Mongo”
       },
       ….
10
再掲
                      Aggregation Framework
                         SQL版
                            SELECT name as „_id‟, AVG(score) as „average‟ FROM scores
                            WHERE year = „junior‟
• Pipeline処理                GROUP BY = name

        • フィルタを通した結果を次の処理に渡す

     input
                            db.scores.aggregate(
                              { $match : { "year" : "junior" } },
         $match               { $project : { "name" : 1, "score" : 1 } },
                              { $group : { "_id" : "$name",
                                             "average" : { "$avg" : "$score" } } }
                            );
        $project
                            {
                              "result" : [
                              { "_id" : "quiz",
         $group                 "average" : 65.41666666666667
                               } ],
                              "ok" : 1
             result         };
11
Readノードの選択:一貫性について

• Strong Consistency

                 ・強い一貫性
                 Read時に必ず最新のデータが返ってく
                 ることが保証されている。

                               Client Application
                                    Driver

             Write         Read


                     Primary       Secondary        Secondary




12
Readノードの選択:一貫性について

• Eventual Consistency
                 ・結果整合性
                 Read時にプライマリに対して行われた
                 最新の状態が反映されているかどうか
                 は保証されないが、可用性と性能は向
                 上する。(例:DNS)
                               Client Application
                                    Driver

             Write                       Read            Read


                     Primary       Secondary        Secondary




13
Readノードの選択:設定の種類

• 5つのレベルから設定可能
                                     Strong Consistency
     • PRIMARY
     • PRIMARY PREFERRED
     • SECONDARY
     • SECONDARY PREFERRED
                                    Eventual Consistency
     • NEAREST
       •   ドライバからReplicaSetsにpingをし、15ms以内で返ってきたサーバ群から1台選択

       •   基本的に候補の複数台から1台選ぶので、偏ることはない
       •   ドライバが一定間隔ごとにpingし、ステータスを更新している

Rubyでの設定例

14
Tagを利用したSharding

• Tagベースでのレンジパーティション
     •   Sharding key(レンジ)による書き込み先の制御
     •   uid=1~100は東京データセンターのノード、uid=101~200はNewYorkデータセンター
         のノード、という設定が可能

• 2.2の目玉機能の一つで、前述のRead設定とあわせて
  “Data Center Awareness”と表現されている
     • Awareness(アウェアネス):ある問題に対する、人々の知識の程度、危機・問
       題意識の高さ、といった意味




15
Tagを利用したSharding
                                                   赤矢印はレプ
• 大陸間をまたいだHA構成                                     リケーション

     Primary   Secondary
                           TokyoDC    NewYorkDC     ParisDC




                            Shard 1      Shard 2    Shard 3




16
Tagを利用したSharding
                                                                                赤矢印はレプ
• 大陸間をまたいだHA構成                                                                  リケーション

                 Primary        Secondary
                                              TokyoDC         NewYorkDC          ParisDC
      Read
     (NEAREST)         Uid 1 - 100




                           Uid 101 - 200
Tokyoからアクセス

                       Uid 201 - 300



 特徴
 ・DR対策として、データは大陸をまた                             Shard 1          Shard 2           Shard 3
 いだDCにレプリケーションされる
                                                                Uid 101 - 200
 ・Insert/Update:レンジを設定すること
 でShardを指定できる                                  Uid 1 - 100                      Uid 201 - 300
 ・Read:一番近いDCから読み取る(低                                        Insert/Update
 レイテンシ)
                                                                                       uid 210 @Paris
17
                                            uid 10 @Tokyo
                                                                uid 110 @NewYork
TTL(Time To Live) Collections

• 期限付きコレクション
      • 一定時間が経過したら自動で削除される
       // eventsコレクションのデータを、statusフィールドを起点に30秒後に
       // 削除されるように設定
       db.events.ensureIndex( { “status”: 1 }, { expireAfterSeconds: 30 } )
       // statusにはdate-type informationを入れる。new Date()でOK
       // statusがdata-type以外、またはstatusが無いデータは消えない
       db.events.insert( { “name” : 1, “status” : new Date() } );
       db.events.insert( { “name” : 2, “status” : “String” } ); // data-typeじゃない
       db.events.insert( { “name” : 3, “no-status” : “blank” } ); // statusがない
       db.events.count();
       // => 3
       //30秒後
       db.events.count();
       // => 2
       // name = 1 のデータが消えている
     ※Capped collectionsでは使用できない制限あり
18
その他の主な変更点

• mongo shellの改善
     •    Unicodeのフルサポート
     •    Bashライクな機能追加(Ctrl-Rで履歴検索ほか、Ctrl-{A,E,B,F,N,P,H,D,U,K,Y,T,L}を
          サポート)
     •    複数行コマンドの履歴が1行になりました
     •    Server-Side Functions( db.system.js )をloadできるようになりました
     •    バルクインサート(配列形式の一括insert)をサポート
     •    Verbose mode が追加( set verbose true )

         個人的には、大改善!
         Shellの使いかってが大幅に改善されました




19
その他の主な変更点

• 2.0と2.2で互換性がないもの
     •   mongodump: 2.2 => 2.0 はNG
     •   認証付きshardingクラスタ

• mongodump,mongorestoreでindex定義を扱えるようになりました
• mongooplog コマンドが追加されました
     • mongooplogを使うとレプリケーション環境でpoint-in-time backupができます
• mongodumpがレプリケーション環境のSecondaryサーバから取得で
  きるようになりました
• mongodumpにTimestamp()が使えるようになりました
     •   クエリーの条件に使用できる



20
その他の主な変更点

• Windowsに関する修正
     •   Windows XPがサポート外になりました(起動しません!)
     •   mongos.exeがWindows Serviceとしてサポートされました
     •   Windowsでログローテートコマンドがサポートされました
     •   64bit版のWindows7,Windows Server 2008 R2 のバイナリは、並列処理に関するパ
         フォーマンスが向上しました
     •   以下の文字列がDatabase名で使用できなくなりました
          /¥. "*<>:|?




21
再掲
          MongoDB 2.2の新機能:ダイジェスト

• 並列処理の強化(Concurrency Improvements)
      •   ロックの粒度がGlobalロックからDBロックになりました
      •   PageFaultアーキテクチャが改善されロック時間が減りました

• Aggregation Framework
      •   集計処理がコマンドで可能になりました

• Replica SetsのReadノードの選択
      •   一貫性レベルに応じて、どのノードからデータをReadするかを選択可能になりました

• Tagを使用したSharding(Improved Data Center Awareness)
      •   データ保存先のShardをTagで指定可能になりました

• TTL(Time To Live) Collections
      •   一定時間で削除されるCollectionを定義可能になりました

• その他の主な変更点
22
Thank you




23

More Related Content

What's hot

これからLDAPを始めるなら 「389-ds」を使ってみよう
これからLDAPを始めるなら 「389-ds」を使ってみようこれからLDAPを始めるなら 「389-ds」を使ってみよう
これからLDAPを始めるなら 「389-ds」を使ってみようNobuyuki Sasaki
 
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)Iwana Chan
 
MySQLメインの人がPostgreSQLのベンチマークをしてみた話
MySQLメインの人がPostgreSQLのベンチマークをしてみた話MySQLメインの人がPostgreSQLのベンチマークをしてみた話
MySQLメインの人がPostgreSQLのベンチマークをしてみた話hiroi10
 
書くべきは手順書ではなくスクリプトです。定型業務をスクリプトで自動化して楽をしよう
書くべきは手順書ではなくスクリプトです。定型業務をスクリプトで自動化して楽をしよう書くべきは手順書ではなくスクリプトです。定型業務をスクリプトで自動化して楽をしよう
書くべきは手順書ではなくスクリプトです。定型業務をスクリプトで自動化して楽をしようNobuyuki Sasaki
 
[中国地方DB勉強会] 第22回 Webアプリ開発をデータベース側から変革していく - MySQL 8.0新機能
[中国地方DB勉強会] 第22回 Webアプリ開発をデータベース側から変革していく - MySQL 8.0新機能[中国地方DB勉強会] 第22回 Webアプリ開発をデータベース側から変革していく - MySQL 8.0新機能
[中国地方DB勉強会] 第22回 Webアプリ開発をデータベース側から変革していく - MySQL 8.0新機能Ryusuke Kajiyama
 
AmebaのMongoDB活用事例
AmebaのMongoDB活用事例AmebaのMongoDB活用事例
AmebaのMongoDB活用事例Akihiro Kuwano
 
MySQL 初めてのチューニング
MySQL 初めてのチューニングMySQL 初めてのチューニング
MySQL 初めてのチューニングCraft works
 
MySQL ガチBeginnerがやってみたことと反省したこと
MySQL ガチBeginnerがやってみたことと反省したことMySQL ガチBeginnerがやってみたことと反省したこと
MySQL ガチBeginnerがやってみたことと反省したことSatoshi Suzuki
 
Varnishのログの眺め方
Varnishのログの眺め方Varnishのログの眺め方
Varnishのログの眺め方Iwana Chan
 
DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!kwatch
 
My sql casual_in_fukuoka_vol1
My sql casual_in_fukuoka_vol1My sql casual_in_fukuoka_vol1
My sql casual_in_fukuoka_vol1Makoto Haruyama
 
Handlersocket etc. 20110906
Handlersocket etc. 20110906Handlersocket etc. 20110906
Handlersocket etc. 20110906akirahiguchi
 
C16 45分でわかるPostgreSQLの仕組み by 山田努
C16 45分でわかるPostgreSQLの仕組み by 山田努C16 45分でわかるPostgreSQLの仕組み by 山田努
C16 45分でわかるPostgreSQLの仕組み by 山田努Insight Technology, Inc.
 
OSC沖縄2014_JPUG資料
OSC沖縄2014_JPUG資料OSC沖縄2014_JPUG資料
OSC沖縄2014_JPUG資料kasaharatt
 
「今そこにある危機」を捉える ~ pg_stat_statements revisited
「今そこにある危機」を捉える ~ pg_stat_statements revisited「今そこにある危機」を捉える ~ pg_stat_statements revisited
「今そこにある危機」を捉える ~ pg_stat_statements revisitedUptime Technologies LLC (JP)
 
PostgreSQLの新バージョン -PostgreSQL9.4- のご紹介
PostgreSQLの新バージョン -PostgreSQL9.4- のご紹介PostgreSQLの新バージョン -PostgreSQL9.4- のご紹介
PostgreSQLの新バージョン -PostgreSQL9.4- のご紹介Insight Technology, Inc.
 
分割と整合性と戦う
分割と整合性と戦う分割と整合性と戦う
分割と整合性と戦うYugo Shimizu
 

What's hot (20)

これからLDAPを始めるなら 「389-ds」を使ってみよう
これからLDAPを始めるなら 「389-ds」を使ってみようこれからLDAPを始めるなら 「389-ds」を使ってみよう
これからLDAPを始めるなら 「389-ds」を使ってみよう
 
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
 
MySQLメインの人がPostgreSQLのベンチマークをしてみた話
MySQLメインの人がPostgreSQLのベンチマークをしてみた話MySQLメインの人がPostgreSQLのベンチマークをしてみた話
MySQLメインの人がPostgreSQLのベンチマークをしてみた話
 
書くべきは手順書ではなくスクリプトです。定型業務をスクリプトで自動化して楽をしよう
書くべきは手順書ではなくスクリプトです。定型業務をスクリプトで自動化して楽をしよう書くべきは手順書ではなくスクリプトです。定型業務をスクリプトで自動化して楽をしよう
書くべきは手順書ではなくスクリプトです。定型業務をスクリプトで自動化して楽をしよう
 
[中国地方DB勉強会] 第22回 Webアプリ開発をデータベース側から変革していく - MySQL 8.0新機能
[中国地方DB勉強会] 第22回 Webアプリ開発をデータベース側から変革していく - MySQL 8.0新機能[中国地方DB勉強会] 第22回 Webアプリ開発をデータベース側から変革していく - MySQL 8.0新機能
[中国地方DB勉強会] 第22回 Webアプリ開発をデータベース側から変革していく - MySQL 8.0新機能
 
AmebaのMongoDB活用事例
AmebaのMongoDB活用事例AmebaのMongoDB活用事例
AmebaのMongoDB活用事例
 
MySQL 初めてのチューニング
MySQL 初めてのチューニングMySQL 初めてのチューニング
MySQL 初めてのチューニング
 
MySQL ガチBeginnerがやってみたことと反省したこと
MySQL ガチBeginnerがやってみたことと反省したことMySQL ガチBeginnerがやってみたことと反省したこと
MySQL ガチBeginnerがやってみたことと反省したこと
 
Varnishのログの眺め方
Varnishのログの眺め方Varnishのログの眺め方
Varnishのログの眺め方
 
DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!
 
My sql casual_in_fukuoka_vol1
My sql casual_in_fukuoka_vol1My sql casual_in_fukuoka_vol1
My sql casual_in_fukuoka_vol1
 
Handlersocket etc. 20110906
Handlersocket etc. 20110906Handlersocket etc. 20110906
Handlersocket etc. 20110906
 
PostgreSQLバックアップの基本
PostgreSQLバックアップの基本PostgreSQLバックアップの基本
PostgreSQLバックアップの基本
 
C16 45分でわかるPostgreSQLの仕組み by 山田努
C16 45分でわかるPostgreSQLの仕組み by 山田努C16 45分でわかるPostgreSQLの仕組み by 山田努
C16 45分でわかるPostgreSQLの仕組み by 山田努
 
OSC沖縄2014_JPUG資料
OSC沖縄2014_JPUG資料OSC沖縄2014_JPUG資料
OSC沖縄2014_JPUG資料
 
Mysql casial01
Mysql casial01Mysql casial01
Mysql casial01
 
PostgreSQL Query Cache - "pqc"
PostgreSQL Query Cache - "pqc"PostgreSQL Query Cache - "pqc"
PostgreSQL Query Cache - "pqc"
 
「今そこにある危機」を捉える ~ pg_stat_statements revisited
「今そこにある危機」を捉える ~ pg_stat_statements revisited「今そこにある危機」を捉える ~ pg_stat_statements revisited
「今そこにある危機」を捉える ~ pg_stat_statements revisited
 
PostgreSQLの新バージョン -PostgreSQL9.4- のご紹介
PostgreSQLの新バージョン -PostgreSQL9.4- のご紹介PostgreSQLの新バージョン -PostgreSQL9.4- のご紹介
PostgreSQLの新バージョン -PostgreSQL9.4- のご紹介
 
分割と整合性と戦う
分割と整合性と戦う分割と整合性と戦う
分割と整合性と戦う
 

Similar to MongoDB2.2の新機能

Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようAkira Shimosako
 
既存システムへの新技術活用法 ~fluntd/MongoDB~
既存システムへの新技術活用法 ~fluntd/MongoDB~既存システムへの新技術活用法 ~fluntd/MongoDB~
既存システムへの新技術活用法 ~fluntd/MongoDB~じゅん なかざ
 
[豆ナイト]Java small object programming
[豆ナイト]Java small object programming[豆ナイト]Java small object programming
[豆ナイト]Java small object programmingYuichi Hasegawa
 
PHP開発者のためのNoSQL入門
PHP開発者のためのNoSQL入門PHP開発者のためのNoSQL入門
PHP開発者のためのNoSQL入門じゅん なかざ
 
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクトEWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクトKiyoshi Sawada
 
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクトEWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクトKiyoshi Sawada
 
[db tech showcase Tokyo 2017] E35: 12台でやってみた!DWHソフトウェアアプライアンス Db2 Warehouse ~...
[db tech showcase Tokyo 2017] E35: 12台でやってみた!DWHソフトウェアアプライアンス Db2 Warehouse ~...[db tech showcase Tokyo 2017] E35: 12台でやってみた!DWHソフトウェアアプライアンス Db2 Warehouse ~...
[db tech showcase Tokyo 2017] E35: 12台でやってみた!DWHソフトウェアアプライアンス Db2 Warehouse ~...Insight Technology, Inc.
 
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスするEWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスするKiyoshi Sawada
 
Spring Data in a Nutshell
Spring Data in a NutshellSpring Data in a Nutshell
Spring Data in a NutshellTsuyoshi Miyake
 
Hadoop基盤上のETL構築実践例 ~多様なデータをどう扱う?~
Hadoop基盤上のETL構築実践例 ~多様なデータをどう扱う?~Hadoop基盤上のETL構築実践例 ~多様なデータをどう扱う?~
Hadoop基盤上のETL構築実践例 ~多様なデータをどう扱う?~Sotaro Kimura
 
Springでdao 20070413
Springでdao 20070413Springでdao 20070413
Springでdao 20070413Funato Takashi
 
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回Naoyuki Yamada
 
20181031 springfest spring data geode
20181031 springfest spring data geode20181031 springfest spring data geode
20181031 springfest spring data geodeMasaki Yamakawa
 
[A33] [特濃jpoug statspack on pdb oracle database 12c] 20131115 補足・続報付き
[A33] [特濃jpoug statspack on pdb oracle database 12c] 20131115 補足・続報付き[A33] [特濃jpoug statspack on pdb oracle database 12c] 20131115 補足・続報付き
[A33] [特濃jpoug statspack on pdb oracle database 12c] 20131115 補足・続報付きInsight Technology, Inc.
 
はじめてのCouch db
はじめてのCouch dbはじめてのCouch db
はじめてのCouch dbEiji Kuroda
 
CodeIgniter入門
CodeIgniter入門CodeIgniter入門
CodeIgniter入門Sho A
 
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Next2Dで始めるゲーム開発  - Game Development Starting with Next2DNext2Dで始めるゲーム開発  - Game Development Starting with Next2D
Next2Dで始めるゲーム開発 - Game Development Starting with Next2DToshiyuki Ienaga
 
Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Masahiro Nagano
 
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスするEWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスするKiyoshi Sawada
 

Similar to MongoDB2.2の新機能 (20)

Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみよう
 
既存システムへの新技術活用法 ~fluntd/MongoDB~
既存システムへの新技術活用法 ~fluntd/MongoDB~既存システムへの新技術活用法 ~fluntd/MongoDB~
既存システムへの新技術活用法 ~fluntd/MongoDB~
 
[豆ナイト]Java small object programming
[豆ナイト]Java small object programming[豆ナイト]Java small object programming
[豆ナイト]Java small object programming
 
PHP開発者のためのNoSQL入門
PHP開発者のためのNoSQL入門PHP開発者のためのNoSQL入門
PHP開発者のためのNoSQL入門
 
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクトEWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
 
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクトEWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
 
[db tech showcase Tokyo 2017] E35: 12台でやってみた!DWHソフトウェアアプライアンス Db2 Warehouse ~...
[db tech showcase Tokyo 2017] E35: 12台でやってみた!DWHソフトウェアアプライアンス Db2 Warehouse ~...[db tech showcase Tokyo 2017] E35: 12台でやってみた!DWHソフトウェアアプライアンス Db2 Warehouse ~...
[db tech showcase Tokyo 2017] E35: 12台でやってみた!DWHソフトウェアアプライアンス Db2 Warehouse ~...
 
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスするEWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
 
Spring Data in a Nutshell
Spring Data in a NutshellSpring Data in a Nutshell
Spring Data in a Nutshell
 
Hadoop基盤上のETL構築実践例 ~多様なデータをどう扱う?~
Hadoop基盤上のETL構築実践例 ~多様なデータをどう扱う?~Hadoop基盤上のETL構築実践例 ~多様なデータをどう扱う?~
Hadoop基盤上のETL構築実践例 ~多様なデータをどう扱う?~
 
Springでdao 20070413
Springでdao 20070413Springでdao 20070413
Springでdao 20070413
 
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回
 
Grails 2.0.0.M1の話
Grails 2.0.0.M1の話 Grails 2.0.0.M1の話
Grails 2.0.0.M1の話
 
20181031 springfest spring data geode
20181031 springfest spring data geode20181031 springfest spring data geode
20181031 springfest spring data geode
 
[A33] [特濃jpoug statspack on pdb oracle database 12c] 20131115 補足・続報付き
[A33] [特濃jpoug statspack on pdb oracle database 12c] 20131115 補足・続報付き[A33] [特濃jpoug statspack on pdb oracle database 12c] 20131115 補足・続報付き
[A33] [特濃jpoug statspack on pdb oracle database 12c] 20131115 補足・続報付き
 
はじめてのCouch db
はじめてのCouch dbはじめてのCouch db
はじめてのCouch db
 
CodeIgniter入門
CodeIgniter入門CodeIgniter入門
CodeIgniter入門
 
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Next2Dで始めるゲーム開発  - Game Development Starting with Next2DNext2Dで始めるゲーム開発  - Game Development Starting with Next2D
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
 
Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14
 
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスするEWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
 

MongoDB2.2の新機能

  • 1. MongoDB 2.2 の新機能 第3回 丸の内MongoDB勉強会 NRI OpenStandia 藤崎 祥見 1
  • 2. 第3回丸の内MongoDB勉強会 丸の内mongodb 2
  • 3. MongoDB 2.2 リリースノート • このスライドでは リリースノートをもとに、2012/08/29 にリリースされた MongoDB 2.2.0の新機能を解説します • リリースノート http://docs.mongodb.org/manual/release-notes/2.2/ http://jp.docs.mongodb.org/manual/release-notes/2.2/ • 丸の内MongoDB勉強会#3 MongoDB 2.2.0 新機能紹介 https://github.com/syokenz/marunouchi- mongodb/tree/master/20120926/syokenz コマンドレベルでの手順があります 3
  • 4. MongoDB 2.2の新機能:ダイジェスト • 並列処理の強化(Concurrency Improvements) • ロックの粒度がGlobalロックからDBロックになりました • PageFaultアーキテクチャが改善されロック時間が減りました • Aggregation Framework • 集計処理がコマンドで可能になりました • Replica SetsのReadノードの選択 • 一貫性レベルに応じて、どのノードからデータをReadするかを選択可能になりました • Tagを使用したSharding(Improved Data Center Awareness) • データ保存先のShardをTagで指定可能になりました • TTL(Time To Live) Collections • 一定時間で削除されるCollectionを定義可能になりました • その他の主な変更点 4
  • 5. 並列処理の強化:ロックレベル • GlobalロックからDBレベルロックへ Mongodインスタンス LOCK 2.0.x Update Mongodインスタンス LOCK 利用可能 2.2.x ※Collection level lockingはJIRAにチケット登録あり。 https://jira.mongodb.org/browse/SERVER-1240 5 ただし、Fix VersionはPlanning Bucket A (2012/10/24現在)
  • 6. 並列処理の強化:Page Faultアーキテクチャ • ロック中にPage Faultが発生し、ロックが長引くことを避ける仕組み Document Aの 1 Update LOCK メモリ上にデータが無い ので、ディスクアクセス Document Bの Insert しなきゃ PageFaultException ロックされてる… Document Aの LOCK解除 ディスクからデータを 2 Update ロードするからちょっと Document Bの 待ってね。その間ロック Insert を解除して他の処理を実 行するね。 ロックされてない!実行します 3 Document Aの LOCK ディスクからデータをロ Update ードしておいたのでロッ ク時間は短くて済むね。 Retry! 6
  • 7. Aggregation Framework • データに対して集計処理を行うコマンド集 • これまでMap/Reduceで行っていたもので、よく使うものをコマンドに • SQLでいう、GROUP BY機能に似たもの $match ・・・条件で絞り込みを実施(SQLのWHERE) $project ・・・集計処理を行うフィールドの選択/除外、リネーム(SQLのAS)、計算結果のInsertを実施 $unwind ・・・指定された配列の展開を実施 $group ・・・$sum, $avgなどを使い集計処理を実施 $projectと$unwindについて $sort ・・・指定されたsortキーによるソートを実施 は、次ページ以降で説明 $skip ・・・指定された数字分スキップして次の処理へ渡す $limit ・・・指定された数字分の結果を次の処理へ渡す 7
  • 8. Aggregation Framework SQL版 SELECT name as „_id‟, AVG(score) as „average‟ FROM scores WHERE year = „junior‟ • Pipeline処理 GROUP BY = name • フィルタを通した結果を次の処理に渡す input db.scores.aggregate( { $match : { "year" : "junior" } }, $match { $project : { "name" : 1, "score" : 1 } }, { $group : { "_id" : "$name", "average" : { "$avg" : "$score" } } } ); $project { "result" : [ { "_id" : "quiz", $group "average" : 65.41666666666667 } ], "ok" : 1 result }; 8
  • 9. Aggregation Framework • $project • 基本はフィールドの選択を行う(projection(射影)) db.article.insert(“title” : “mongo site” , "pageViews“ : 5); //計算結果をフィールドに追加 db.article.aggregate( { $project : { “title” : 1, “doctoredPageViews “: { $add:["$pageViews", 10] } }} ); //pageViewsフィールドをpage_viewsに変更 db.article.aggregate( { $project : { “title” : 1, “page_views “: "$pageViews" }} ); 9
  • 10. Aggregation Framework • $unwind • 配列を展開して次の処理に渡す db.article.insert({“title”:”mongo book”, “tags”:[“DB”, “Mongo”, “NoSQL”]}); db.article.aggregate( { $project : { “_id” : 0, “title” : 1, “tags” : 1 } }, { $unwind : “$tags” } ); //配列tagsが展開されて次の処理に渡される { “result” : [ { “title” : “mongo book”, “tags” : “DB” }, { “title” : “mongo book”, “tags” : “Mongo” }, …. 10
  • 11. 再掲 Aggregation Framework SQL版 SELECT name as „_id‟, AVG(score) as „average‟ FROM scores WHERE year = „junior‟ • Pipeline処理 GROUP BY = name • フィルタを通した結果を次の処理に渡す input db.scores.aggregate( { $match : { "year" : "junior" } }, $match { $project : { "name" : 1, "score" : 1 } }, { $group : { "_id" : "$name", "average" : { "$avg" : "$score" } } } ); $project { "result" : [ { "_id" : "quiz", $group "average" : 65.41666666666667 } ], "ok" : 1 result }; 11
  • 12. Readノードの選択:一貫性について • Strong Consistency ・強い一貫性 Read時に必ず最新のデータが返ってく ることが保証されている。 Client Application Driver Write Read Primary Secondary Secondary 12
  • 13. Readノードの選択:一貫性について • Eventual Consistency ・結果整合性 Read時にプライマリに対して行われた 最新の状態が反映されているかどうか は保証されないが、可用性と性能は向 上する。(例:DNS) Client Application Driver Write Read Read Primary Secondary Secondary 13
  • 14. Readノードの選択:設定の種類 • 5つのレベルから設定可能 Strong Consistency • PRIMARY • PRIMARY PREFERRED • SECONDARY • SECONDARY PREFERRED Eventual Consistency • NEAREST • ドライバからReplicaSetsにpingをし、15ms以内で返ってきたサーバ群から1台選択 • 基本的に候補の複数台から1台選ぶので、偏ることはない • ドライバが一定間隔ごとにpingし、ステータスを更新している Rubyでの設定例 14
  • 15. Tagを利用したSharding • Tagベースでのレンジパーティション • Sharding key(レンジ)による書き込み先の制御 • uid=1~100は東京データセンターのノード、uid=101~200はNewYorkデータセンター のノード、という設定が可能 • 2.2の目玉機能の一つで、前述のRead設定とあわせて “Data Center Awareness”と表現されている • Awareness(アウェアネス):ある問題に対する、人々の知識の程度、危機・問 題意識の高さ、といった意味 15
  • 16. Tagを利用したSharding 赤矢印はレプ • 大陸間をまたいだHA構成 リケーション Primary Secondary TokyoDC NewYorkDC ParisDC Shard 1 Shard 2 Shard 3 16
  • 17. Tagを利用したSharding 赤矢印はレプ • 大陸間をまたいだHA構成 リケーション Primary Secondary TokyoDC NewYorkDC ParisDC Read (NEAREST) Uid 1 - 100 Uid 101 - 200 Tokyoからアクセス Uid 201 - 300 特徴 ・DR対策として、データは大陸をまた Shard 1 Shard 2 Shard 3 いだDCにレプリケーションされる Uid 101 - 200 ・Insert/Update:レンジを設定すること でShardを指定できる Uid 1 - 100 Uid 201 - 300 ・Read:一番近いDCから読み取る(低 Insert/Update レイテンシ) uid 210 @Paris 17 uid 10 @Tokyo uid 110 @NewYork
  • 18. TTL(Time To Live) Collections • 期限付きコレクション • 一定時間が経過したら自動で削除される // eventsコレクションのデータを、statusフィールドを起点に30秒後に // 削除されるように設定 db.events.ensureIndex( { “status”: 1 }, { expireAfterSeconds: 30 } ) // statusにはdate-type informationを入れる。new Date()でOK // statusがdata-type以外、またはstatusが無いデータは消えない db.events.insert( { “name” : 1, “status” : new Date() } ); db.events.insert( { “name” : 2, “status” : “String” } ); // data-typeじゃない db.events.insert( { “name” : 3, “no-status” : “blank” } ); // statusがない db.events.count(); // => 3 //30秒後 db.events.count(); // => 2 // name = 1 のデータが消えている ※Capped collectionsでは使用できない制限あり 18
  • 19. その他の主な変更点 • mongo shellの改善 • Unicodeのフルサポート • Bashライクな機能追加(Ctrl-Rで履歴検索ほか、Ctrl-{A,E,B,F,N,P,H,D,U,K,Y,T,L}を サポート) • 複数行コマンドの履歴が1行になりました • Server-Side Functions( db.system.js )をloadできるようになりました • バルクインサート(配列形式の一括insert)をサポート • Verbose mode が追加( set verbose true ) 個人的には、大改善! Shellの使いかってが大幅に改善されました 19
  • 20. その他の主な変更点 • 2.0と2.2で互換性がないもの • mongodump: 2.2 => 2.0 はNG • 認証付きshardingクラスタ • mongodump,mongorestoreでindex定義を扱えるようになりました • mongooplog コマンドが追加されました • mongooplogを使うとレプリケーション環境でpoint-in-time backupができます • mongodumpがレプリケーション環境のSecondaryサーバから取得で きるようになりました • mongodumpにTimestamp()が使えるようになりました • クエリーの条件に使用できる 20
  • 21. その他の主な変更点 • Windowsに関する修正 • Windows XPがサポート外になりました(起動しません!) • mongos.exeがWindows Serviceとしてサポートされました • Windowsでログローテートコマンドがサポートされました • 64bit版のWindows7,Windows Server 2008 R2 のバイナリは、並列処理に関するパ フォーマンスが向上しました • 以下の文字列がDatabase名で使用できなくなりました /¥. "*<>:|? 21
  • 22. 再掲 MongoDB 2.2の新機能:ダイジェスト • 並列処理の強化(Concurrency Improvements) • ロックの粒度がGlobalロックからDBロックになりました • PageFaultアーキテクチャが改善されロック時間が減りました • Aggregation Framework • 集計処理がコマンドで可能になりました • Replica SetsのReadノードの選択 • 一貫性レベルに応じて、どのノードからデータをReadするかを選択可能になりました • Tagを使用したSharding(Improved Data Center Awareness) • データ保存先のShardをTagで指定可能になりました • TTL(Time To Live) Collections • 一定時間で削除されるCollectionを定義可能になりました • その他の主な変更点 22