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勉強会資料

5,847 views
5,792 views

Published on

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

0 Comments
7 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
5,847
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
50
Comments
0
Likes
7
Embeds 0
No embeds

No notes for slide

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

×