狠狠撸

狠狠撸Share a Scribd company logo
MongoDB 2.2 の新機能



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




1
第3回丸の内惭辞苍驳辞顿叠勉强会


                   丸の内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 key(レンジ)による書き込み先の制御
     ?   uid=1~100は東京データセンターのノード、uid=101~200はNewYorkデータセンター
         のノード、という設定が可能

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




15
罢补驳を利用した厂丑补谤诲颈苍驳
                                                   赤矢印はレプ
? 大陸間をまたいだHA構成                                     リケーション

     Primary   Secondary
                           TokyoDC    NewYorkDC     ParisDC




                            Shard 1      Shard 2    Shard 3




16
罢补驳を利用した厂丑补谤诲颈苍驳
                                                                                赤矢印はレプ
? 大陸間をまたいだ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

惭辞苍驳辞顿叠2.2の新机能

  • 1. MongoDB 2.2 の新機能 第3回 丸の内MongoDB勉強会 NRI OpenStandia 藤崎 祥見 1
  • 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 key(レンジ)による書き込み先の制御 ? uid=1~100は東京データセンターのノード、uid=101~200はNewYorkデータセンター のノード、という設定が可能 ? 2.2の目玉機能の一つで、前述のRead設定とあわせて “Data Center Awareness”と表現されている ? Awareness(アウェアネス):ある問題に対する、人々の知識の程度、危機?問 題意識の高さ、といった意味 15
  • 16. 罢补驳を利用した厂丑补谤诲颈苍驳 赤矢印はレプ ? 大陸間をまたいだHA構成 リケーション Primary Secondary TokyoDC NewYorkDC ParisDC Shard 1 Shard 2 Shard 3 16
  • 17. 罢补驳を利用した厂丑补谤诲颈苍驳 赤矢印はレプ ? 大陸間をまたいだ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