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.
Tachy with MongoDB            株式会社サイバーエージェント            アメーバ事業本部 宍戸展志
MongoDB勉強会第二回 MongoDB勉強会• 自己紹介       • 宍戸展志(ししど ひろむね) 25歳       • Twitter @joe_hrmn• 所属       • 株式会社 サイバーエージェント       • Ta...
MongoDB勉強会第二回 MongoDB勉強会アジェンダ• Tachyについて• システム構成• MongoDBの使いどころ• 苦労した話• これから                 3
MongoDB勉強会第二回 MongoDB勉強会Tachy• 実名制SNS       • タイムライン形式で情報を表示       • ひとこと、写真投稿、予定機能 etc       • 『閲覧権限』の設定あり• 使っている技術要素    ...
MongoDB勉強会第二回 MongoDB勉強会                 5
MongoDB勉強会第二回 MongoDB勉強会                 \(^o^)/                       /                    6
MongoDB勉強会第二回 MongoDB勉強会       を使った理由MongoDBを使った理由• 使ってみたかった       • 社内ではpicoで利用実績あり•   データ分散の処理は大変•   データアクセスが高速(と聞いて)•  ...
MongoDB勉強会第二回 MongoDB勉強会システム構成                        【Web App】                                】           【ActiveMQ】     ...
MongoDB勉強会第二回 MongoDB勉強会MongoDB• Ver 1.6.5• ReplicaSet + Sharding                 webApp                                  ...
MongoDB勉強会第二回 MongoDB勉強会Collections• Entry• Timeline• Room                 Etc…                        10
MongoDB勉強会第二回 MongoDB勉強会Entry                 11
MongoDB勉強会第二回 MongoDB勉強会operation@Entry• 発言の取得   – db.Entry.find({entryId : 123, deleteFlag:0});• コメントの取得   – db.Entry.fin...
MongoDB勉強会第二回 MongoDB勉強会Timeline                 13
MongoDB勉強会第二回 MongoDB勉強会operation@Timeline• ユーザーのタイムラインの取得   – db.Timeline.find({userId:1, registDate > xxx});   →この部分には複合...
MongoDB勉強会第二回 MongoDB勉強会Room                        Embedオブジェクトとして                        Listを内部に保持                 Ex) d...
MongoDB勉強会第二回 MongoDB勉強会 > db.Room.findOne({roomId:603}); {     "_id" : ObjectId("4d9e772074978c29974fba92"),     "roomId"...
MongoDB勉強会第二回 MongoDB勉強会operation@Room• Room情報の取得   – db.Room.find({roomId:123});• Roomに含まれているか   – db.Room.find({members:...
MongoDB勉強会第二回 MongoDB勉強会テストしてみました• 環境   – App (Apache / Tomcat)      • Intel(R) Xeon(R) CPU X3430 @ 2.40GHz (4core)      •...
MongoDB勉強会第二回 MongoDB勉強会タイムラインの作成が重い・・・• 変遷   – timelineDao.save(timeline, WriteConcern.SAFE);           – 1件ずつinsert     ...
MongoDB勉強会第二回 MongoDB勉強会タイムラインの作成が重い・・・• 変遷   – timelineDao.save(timeline, WriteConcern.SAFE);           – 1件ずつinsert     ...
MongoDB勉強会第二回 MongoDB勉強会タイムラインの作成が重い・・・• 変遷   – timelineDao.save(timeline, WriteConcern.SAFE);           – 1件ずつinsert     ...
MongoDB勉強会第二回 MongoDB勉強会タイムラインの取得も重い・・・• TimelineにはentryIdしかentry情報が無い       • 結局EntryCollectionに取得件数分find()する必要がある       ...
MongoDB勉強会第二回 MongoDB勉強会タイムラインの取得も重い・・・• TimelineにはentryIdしかentry情報が無い       • 結局EntryCollectionに取得件数分find()する必要がある       ...
MongoDB勉強会第二回 MongoDB勉強会【Error】 Switching Master      】• 接続先がmongosプロセス1つの時、mongoインスタンス  作成時に渡すIPがListだと発生 ■before List<Se...
MongoDB勉強会第二回 MongoDB勉強会       ・・・じゃないslaveOk・・・じゃない• mongosを通すとslaveに参照クエリが投げられない• ReplicaSet単体で動かしているときは問題なし• 書き込みチェック(W...
MongoDB勉強会第二回 MongoDB勉強会その他いろいろ• Out of semaphores to get db connection        • MongoOptionsの下記の値を調整connectionPerHost * t...
MongoDB勉強会第二回 MongoDB勉強会良かったこと• Index重要• mongostatが役に立った       • Sar, vmstat, iostat• RDBのノウハウの流用が可能       • explain      ...
MongoDB勉強会第二回 MongoDB勉強会今後• より複雑なクエリでの性能検証  > db.Entry.find({  ... userId:26,  ... replyUserId:{$nin:[0,26]},  ... entryTy...
MongoDB勉強会第二回 MongoDB勉強会今後• バックアップ、リストア• Collection設計• もっと多くのデータで                 29
Upcoming SlideShare
Loading in …5
×

MongoDB勉強会資料

6,054 views

Published on

第二回MongoDB勉強会の発表資料です

  • Be the first to comment

MongoDB勉強会資料

  1. 1. Tachy with MongoDB 株式会社サイバーエージェント アメーバ事業本部 宍戸展志
  2. 2. MongoDB勉強会第二回 MongoDB勉強会• 自己紹介 • 宍戸展志(ししど ひろむね) 25歳 • Twitter @joe_hrmn• 所属 • 株式会社 サイバーエージェント • Tachy(プレリリース中)担当 アプリケーションエンジニア• その他 • サッカー大好き • Piggに似てる 2
  3. 3. MongoDB勉強会第二回 MongoDB勉強会アジェンダ• Tachyについて• システム構成• MongoDBの使いどころ• 苦労した話• これから 3
  4. 4. MongoDB勉強会第二回 MongoDB勉強会Tachy• 実名制SNS • タイムライン形式で情報を表示 • ひとこと、写真投稿、予定機能 etc • 『閲覧権限』の設定あり• 使っている技術要素 • MongoDB » Morphia http://code.google.com/p/morphia/ • MySQL • ActiveMQ ( 5.3.2 ) 4
  5. 5. MongoDB勉強会第二回 MongoDB勉強会 5
  6. 6. MongoDB勉強会第二回 MongoDB勉強会 \(^o^)/ / 6
  7. 7. MongoDB勉強会第二回 MongoDB勉強会 を使った理由MongoDBを使った理由• 使ってみたかった • 社内ではpicoで利用実績あり• データ分散の処理は大変• データアクセスが高速(と聞いて)• 自動でfailover• ドキュメント形式の柔軟性 7
  8. 8. MongoDB勉強会第二回 MongoDB勉強会システム構成 【Web App】 】 【ActiveMQ】 】 【mongoDB】 】 】 【MySQL】 8
  9. 9. MongoDB勉強会第二回 MongoDB勉強会MongoDB• Ver 1.6.5• ReplicaSet + Sharding webApp MQ API• JavaDriver 【client】 • 2.4• morphia mongoc mongos • 0.99 mongod mongod mongod 9
  10. 10. MongoDB勉強会第二回 MongoDB勉強会Collections• Entry• Timeline• Room Etc… 10
  11. 11. MongoDB勉強会第二回 MongoDB勉強会Entry 11
  12. 12. MongoDB勉強会第二回 MongoDB勉強会operation@Entry• 発言の取得 – db.Entry.find({entryId : 123, deleteFlag:0});• コメントの取得 – db.Entry.find({replyEntryId:1234, deleteFlag:0}).sort({registDate:-1});• データのinsert(1件ずつ)• 削除(→deleteFlagのupdate) 12
  13. 13. MongoDB勉強会第二回 MongoDB勉強会Timeline 13
  14. 14. MongoDB勉強会第二回 MongoDB勉強会operation@Timeline• ユーザーのタイムラインの取得 – db.Timeline.find({userId:1, registDate > xxx}); →この部分には複合indexを定義 db.Timeline.ensureIndex({userId:1, registDate:-1});• Insert(1件ずつ) – 1Entryに対して、100人に配る場合は100回ループを回す形 – 後々ボトルネックになるので変更 14
  15. 15. MongoDB勉強会第二回 MongoDB勉強会Room Embedオブジェクトとして Listを内部に保持 Ex) db.Room.findOne({members:26}); 15
  16. 16. MongoDB勉強会第二回 MongoDB勉強会 > db.Room.findOne({roomId:603}); { "_id" : ObjectId("4d9e772074978c29974fba92"), "roomId" : NumberLong(603), "userId" : NumberLong(238), "text" : "限定ヒトコト(グループ5)", "registDate" : "Fri Apr 08 2011 11:46:56 GMT+0900 (JST)", "editDate" : "Fri Apr 08 2011 11:46:56 GMT+0900 (JST)", "emaFlag" : 0, "deleteFlag" : 0, "members" : [ NumberLong(239), NumberLong(274), NumberLong(238) ] } 16
  17. 17. MongoDB勉強会第二回 MongoDB勉強会operation@Room• Room情報の取得 – db.Room.find({roomId:123});• Roomに含まれているか – db.Room.find({members:123});• Insert – 1件ずつ• Update – メンバーの追加 17
  18. 18. MongoDB勉強会第二回 MongoDB勉強会テストしてみました• 環境 – App (Apache / Tomcat) • Intel(R) Xeon(R) CPU X3430 @ 2.40GHz (4core) • 12G RAM – MongoDB • Xfs • Intel(R) Xeon(R) CPU X3430 @ 2.40GHz (4core) • 16G RAM – ActiveMQ • Intel(R) Xeon(R) CPU L5410 @ 2.33GHz (4core) • 12G RAM 18
  19. 19. MongoDB勉強会第二回 MongoDB勉強会タイムラインの作成が重い・・・• 変遷 – timelineDao.save(timeline, WriteConcern.SAFE); – 1件ずつinsert » Reciever側の負荷が高騰 19
  20. 20. MongoDB勉強会第二回 MongoDB勉強会タイムラインの作成が重い・・・• 変遷 – timelineDao.save(timeline, WriteConcern.SAFE); – 1件ずつinsert » Reciever側の負荷が高騰 – timelineDao.getCollection().insert(timelineList, WriteConcern.SAFE); – Bulk insertに変更 » Thread dumpなどで見ているとまだ詰まってる 20
  21. 21. MongoDB勉強会第二回 MongoDB勉強会タイムラインの作成が重い・・・• 変遷 – timelineDao.save(timeline, WriteConcern.SAFE); – 1件ずつinsert » Reciever側の負荷が高騰 – timelineDao.getCollection().insert(timelineList, WriteConcern.SAFE); – Bulk insertに変更 » Thread dumpなどで見ているとまだ詰まってる – timelineDao.getCollection().insert(timelineList); – 書き込みチェックなしに 21
  22. 22. MongoDB勉強会第二回 MongoDB勉強会タイムラインの取得も重い・・・• TimelineにはentryIdしかentry情報が無い • 結局EntryCollectionに取得件数分find()する必要がある » CSが頻発• 変遷 – db.Entry.find({entryId:12345}); » 必要な数だけ 22
  23. 23. MongoDB勉強会第二回 MongoDB勉強会タイムラインの取得も重い・・・• TimelineにはentryIdしかentry情報が無い • 結局EntryCollectionに取得件数分find()する必要がある » CSが頻発• 変遷 – db.Entry.find({entryId:12345}); » 必要な数だけ – entryIdListを事前に作成して db.Entry.find({entryId:{$in : entryIdList}}).sort({registDate:-1}); 23
  24. 24. MongoDB勉強会第二回 MongoDB勉強会【Error】 Switching Master 】• 接続先がmongosプロセス1つの時、mongoインスタンス 作成時に渡すIPがListだと発生 ■before List<ServerAddress> replSets = new ArrayList<ServerAddress>(); for(String server : serverList) replSets.add(new ServerAddress(server, port)); mongo = new Mongo(replSets, option.createMongoOptions()); ■after ServerAddress addr = new ServerAddress(mongos, port); mongo = new Mongo(addr, option.createMongoOptions()); 24
  25. 25. MongoDB勉強会第二回 MongoDB勉強会 ・・・じゃないslaveOk・・・じゃない• mongosを通すとslaveに参照クエリが投げられない• ReplicaSet単体で動かしているときは問題なし• 書き込みチェック(WriteConcern.SAFE など)は内部 的に書き込み後、findOneを発行 • Collectionのlock回数を少しでも減らしたい • 参照は別サーバーに向いて欲しい » 調査中…(´・ω・`) 25
  26. 26. MongoDB勉強会第二回 MongoDB勉強会その他いろいろ• Out of semaphores to get db connection • MongoOptionsの下記の値を調整connectionPerHost * threadsAllowedToBlockForConnectionMultiplier >= maxthreads• Too Many Open Files• Test中にnic死亡• Xfsの設定はmongo推奨に合わせるのがよさそう 26
  27. 27. MongoDB勉強会第二回 MongoDB勉強会良かったこと• Index重要• mongostatが役に立った • Sar, vmstat, iostat• RDBのノウハウの流用が可能 • explain 27
  28. 28. MongoDB勉強会第二回 MongoDB勉強会今後• より複雑なクエリでの性能検証 > db.Entry.find({ ... userId:26, ... replyUserId:{$nin:[0,26]}, ... entryType:{$in:["ENTRY","PHOTO"]}, ... deleteFlag:0, ... $where:"this.replyEntryId <= this.parentEntryId"}).limit(50).sort({registDate:-1}).explain(); { "cursor" : "BtreeCursor userId", "nscanned" : 176, "nscannedObjects" : 176, "n" : 18, "scanAndOrder" : true, "millis" : 2, "indexBounds" : { "userId" : [ [ 26, 26 ] ] } } 28
  29. 29. MongoDB勉強会第二回 MongoDB勉強会今後• バックアップ、リストア• Collection設計• もっと多くのデータで 29

×