Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

MongoDB2.2の新機能

6,559 views

Published on

丸の内MongoDB勉強会 #3で発表した「MongoDB2.2の新機能紹介」の内容をスライドにまとめました。https://github.com/syokenz/marunouchi-mongodb/tree/master/20120926

Published in: Career

MongoDB2.2の新機能

  1. 1. MongoDB 2.2 の新機能 第3回 丸の内MongoDB勉強会 NRI OpenStandia 藤崎 祥見1
  2. 2. 第3回丸の内MongoDB勉強会 丸の内mongodb2
  3. 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. 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. 5. 並列処理の強化:ロックレベル• GlobalロックからDBレベルロックへ Mongodインスタンス LOCK 2.0.x Update Mongodインスタンス LOCK 利用可能 2.2.x ※Collection level lockingはJIRAにチケット登録あり。 https://jira.mongodb.org/browse/SERVER-12405 ただし、Fix VersionはPlanning Bucket A (2012/10/24現在)
  6. 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. 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. 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. 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. 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. 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. 12. Readノードの選択:一貫性について• Strong Consistency ・強い一貫性 Read時に必ず最新のデータが返ってく ることが保証されている。 Client Application Driver Write Read Primary Secondary Secondary12
  13. 13. Readノードの選択:一貫性について• Eventual Consistency ・結果整合性 Read時にプライマリに対して行われた 最新の状態が反映されているかどうか は保証されないが、可用性と性能は向 上する。(例:DNS) Client Application Driver Write Read Read Primary Secondary Secondary13
  14. 14. Readノードの選択:設定の種類• 5つのレベルから設定可能 Strong Consistency • PRIMARY • PRIMARY PREFERRED • SECONDARY • SECONDARY PREFERRED Eventual Consistency • NEAREST • ドライバからReplicaSetsにpingをし、15ms以内で返ってきたサーバ群から1台選択 • 基本的に候補の複数台から1台選ぶので、偏ることはない • ドライバが一定間隔ごとにpingし、ステータスを更新しているRubyでの設定例14
  15. 15. Tagを利用したSharding• Tagベースでのレンジパーティション • Sharding key(レンジ)による書き込み先の制御 • uid=1~100は東京データセンターのノード、uid=101~200はNewYorkデータセンター のノード、という設定が可能• 2.2の目玉機能の一つで、前述のRead設定とあわせて “Data Center Awareness”と表現されている • Awareness(アウェアネス):ある問題に対する、人々の知識の程度、危機・問 題意識の高さ、といった意味15
  16. 16. Tagを利用したSharding 赤矢印はレプ• 大陸間をまたいだHA構成 リケーション Primary Secondary TokyoDC NewYorkDC ParisDC Shard 1 Shard 2 Shard 316
  17. 17. Tagを利用したSharding 赤矢印はレプ• 大陸間をまたいだHA構成 リケーション Primary Secondary TokyoDC NewYorkDC ParisDC Read (NEAREST) Uid 1 - 100 Uid 101 - 200Tokyoからアクセス 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 @Paris17 uid 10 @Tokyo uid 110 @NewYork
  18. 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. 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. 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. 21. その他の主な変更点• Windowsに関する修正 • Windows XPがサポート外になりました(起動しません!) • mongos.exeがWindows Serviceとしてサポートされました • Windowsでログローテートコマンドがサポートされました • 64bit版のWindows7,Windows Server 2008 R2 のバイナリは、並列処理に関するパ フォーマンスが向上しました • 以下の文字列がDatabase名で使用できなくなりました /¥. "*<>:|?21
  22. 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
  23. 23. Thank you23

×