O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

MongoDB2.2の新機能

6.570 visualizações

Publicada em

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

Publicada em: Carreiras
  • Seja o primeiro a comentar

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

×