mongodb: case study for amn
DESCRIPTION
2011/11/15 に開催された「第7回 MongoDB 勉強会」で発表したプレゼンテーションです。TRANSCRIPT
![Page 1: MongoDB: Case Study for AMN](https://reader036.vdocuments.pub/reader036/viewer/2022062418/556a478fd8b42a4a1e8b4e95/html5/thumbnails/1.jpg)
MongoDB: Case Study for AMN小山哲志@アジャイルメディア・ネットワーク
@koyhoge
![Page 2: MongoDB: Case Study for AMN](https://reader036.vdocuments.pub/reader036/viewer/2022062418/556a478fd8b42a4a1e8b4e95/html5/thumbnails/2.jpg)
about me
‣小山哲志 - koyhoge‣アジャイルメディア・ネットワーク社員‣合同会社ほげ技研 代表社員‣PHPユーザ会スタッフ‣日本UNIXユーザ会幹事‣その他いろいろ
![Page 3: MongoDB: Case Study for AMN](https://reader036.vdocuments.pub/reader036/viewer/2022062418/556a478fd8b42a4a1e8b4e95/html5/thumbnails/3.jpg)
about AMN
‣アジャイルメディア・ネットワーク株式会社‣http://agilemedia.jp/‣2007年2月設立‣ソーシャルメディアマーケティング / キャンペーン、イベント運営等‣広告配信もやってます。今日はその話。
![Page 4: MongoDB: Case Study for AMN](https://reader036.vdocuments.pub/reader036/viewer/2022062418/556a478fd8b42a4a1e8b4e95/html5/thumbnails/4.jpg)
![Page 5: MongoDB: Case Study for AMN](https://reader036.vdocuments.pub/reader036/viewer/2022062418/556a478fd8b42a4a1e8b4e95/html5/thumbnails/5.jpg)
AMNパートナーブロガー
‣2007年に6ブログからスタート‣2011年11月現在で91ブログ‣他に Tweet アドネットワークが 16媒体
![Page 6: MongoDB: Case Study for AMN](https://reader036.vdocuments.pub/reader036/viewer/2022062418/556a478fd8b42a4a1e8b4e95/html5/thumbnails/6.jpg)
配信規模
‣ブログアドネットワーク‣月間 2000万 imps (公式)‣Tweetアドネットワーク‣月間 2500万 imps (公式)‣通常は 20~120 req/s、ピーク時で 300 req/s くらい
![Page 7: MongoDB: Case Study for AMN](https://reader036.vdocuments.pub/reader036/viewer/2022062418/556a478fd8b42a4a1e8b4e95/html5/thumbnails/7.jpg)
サーバ構成
‣フロントWebサーバ2台‣Apache + PHP 5.3 + memcached‣フレームワークなし‣静的ファイル配信用Webサーバ1台‣nginx‣DBサーバ2台(マスター/レプリケーション)‣PostgreSQL 9.0
![Page 8: MongoDB: Case Study for AMN](https://reader036.vdocuments.pub/reader036/viewer/2022062418/556a478fd8b42a4a1e8b4e95/html5/thumbnails/8.jpg)
Log! Log! Log!
‣広告配信なので表示数の記録はたいへん重要‣以前は配信ログも PostgreSQL に記録していた‣AM 4:00 に集計バッチ処理が走る‣2011年4月のサーバ構成変更時にログDBもマスター/レプリケーションにしたところ、負荷に負け始める
![Page 9: MongoDB: Case Study for AMN](https://reader036.vdocuments.pub/reader036/viewer/2022062418/556a478fd8b42a4a1e8b4e95/html5/thumbnails/9.jpg)
PostgreSQLとの闘い
‣パラメータチューニング‣起動直後は安定して処理をさばく‣数分~数十分後(不定)に処理に負け始め、接続数不足に陥る‣cronで5分おきに再起動を仕掛ける回避策‣そうして逃げてる間に抜本的な解決策を探る
![Page 10: MongoDB: Case Study for AMN](https://reader036.vdocuments.pub/reader036/viewer/2022062418/556a478fd8b42a4a1e8b4e95/html5/thumbnails/10.jpg)
Key Value Store
‣シンプルなデータを大量に保存するので、KVS 向きだった‣ただし集計用に group by 機能が欲しい‣まずは AWS SimpleDB を試してみる‣すいません、クラウドサービス使いたかったんですw
![Page 11: MongoDB: Case Study for AMN](https://reader036.vdocuments.pub/reader036/viewer/2022062418/556a478fd8b42a4a1e8b4e95/html5/thumbnails/11.jpg)
Amazon SimpleDB
‣http://aws.amazon.com/jp/simpledb/‣AWSサービス群のひとつ‣PHP用の公式 AWS SDK があるのでそれを使う‣使い方はすごく簡単‣SQLのような select 構文が使える
![Page 12: MongoDB: Case Study for AMN](https://reader036.vdocuments.pub/reader036/viewer/2022062418/556a478fd8b42a4a1e8b4e95/html5/thumbnails/12.jpg)
SimpleDBの結果?
‣インサートが遅かった‣バッチ挿入も試したが少しましな程度‣複数台に分散してインサートすると良い?‣ということでキュー (Queue) に入れることにしてみる
![Page 13: MongoDB: Case Study for AMN](https://reader036.vdocuments.pub/reader036/viewer/2022062418/556a478fd8b42a4a1e8b4e95/html5/thumbnails/13.jpg)
Amazon SQS + SDB
‣Simple Queue Service‣REST APIでキュー/デキューできる‣処理の流れ‣WebサーバからSQSにデータを突っ込む‣SQSから取り出してSDBに入れるワーカーをEC2でつくる‣ワーカーを増やせばスケールするんじゃね?
![Page 14: MongoDB: Case Study for AMN](https://reader036.vdocuments.pub/reader036/viewer/2022062418/556a478fd8b42a4a1e8b4e95/html5/thumbnails/14.jpg)
SQS+SDB?
‣インサート速度は申し分なし‣PHPで書いたワーカーも無事に動作した‣本番サービスにテスト的に追加‣PostgreSQL と同時に SQS にもログ保存‣一日運用したコストが$130‣かなりお高いです...
![Page 15: MongoDB: Case Study for AMN](https://reader036.vdocuments.pub/reader036/viewer/2022062418/556a478fd8b42a4a1e8b4e95/html5/thumbnails/15.jpg)
いよいよMongoDB‣SaaS な KVS は諦め、ソフトウェアを探す‣MongoDB良さそうだったので、開発用の仮想マシンサーバ上にテスト環境を構築‣ReplSet 3 x Sharding 3 = 9台‣バージョンは当時の安定版 1.8.1‣Mongo用のPHPドライバも無事動作‣インサートすごく速い‣負荷めちゃ軽い
![Page 16: MongoDB: Case Study for AMN](https://reader036.vdocuments.pub/reader036/viewer/2022062418/556a478fd8b42a4a1e8b4e95/html5/thumbnails/16.jpg)
MongoDBをEC2で
‣AWS EC2上にMongoDBのテストベッド構築‣Microインスタンス3台で ReplSet‣ただしそれぞれのリージョンは分ける‣東京A, 東京B, シンガポールA‣Shardingもやろうとしたけどうまく動かなかった‣ストレージは EBS 1TB
![Page 17: MongoDB: Case Study for AMN](https://reader036.vdocuments.pub/reader036/viewer/2022062418/556a478fd8b42a4a1e8b4e95/html5/thumbnails/17.jpg)
EC2テストベッド続き
‣データ入力部分が出来たところで、本番データを流し始める‣Microインスタンスでも問題なく処理可能‣その環境をターゲットにバッチ処理部分の開発を進める
![Page 18: MongoDB: Case Study for AMN](https://reader036.vdocuments.pub/reader036/viewer/2022062418/556a478fd8b42a4a1e8b4e95/html5/thumbnails/18.jpg)
EC2 Smallの限界?
‣ある程度バッチ処理の開発ができてきた‣Mongoに対しても、日時の集計処理を走らせるようにcron設定‣翌日集計は完了していたが、ReplSetの Primary が東京A → 東京B に変わっていた。‣さらに翌日には、Primary が東京Aに戻っていた。
![Page 19: MongoDB: Case Study for AMN](https://reader036.vdocuments.pub/reader036/viewer/2022062418/556a478fd8b42a4a1e8b4e95/html5/thumbnails/19.jpg)
Primaryピンポン‣バッチ処理が走る‣groupを呼び出す比較的重い処理が複数‣Primaryが過負荷になってSecondaryの要求に応えなくなる‣S「Primary落ちてるんじゃね?」‣S「わーい投票投票」‣S(東京B)「俺近いし次プライマリーやるわ」‣P(東京A)「仕事をしていたらいつの間にかプライマリーではなくなっていた...」
![Page 20: MongoDB: Case Study for AMN](https://reader036.vdocuments.pub/reader036/viewer/2022062418/556a478fd8b42a4a1e8b4e95/html5/thumbnails/20.jpg)
本番環境はLargeに
‣御存知の通りMongoDBは 32bit Linux では実用にならない。‣EC2 Small インスタンスでは 64bit Linux は使えない。‣自動的に Large 3台構成に‣配置は Micro の時と同じ‣Large だとさすがにピンポンは起きませんでしたw
![Page 21: MongoDB: Case Study for AMN](https://reader036.vdocuments.pub/reader036/viewer/2022062418/556a478fd8b42a4a1e8b4e95/html5/thumbnails/21.jpg)
ある日のプライマリーさん
![Page 22: MongoDB: Case Study for AMN](https://reader036.vdocuments.pub/reader036/viewer/2022062418/556a478fd8b42a4a1e8b4e95/html5/thumbnails/22.jpg)
知見
‣Shardingなしでも十分速い‣大規模障害対策として、AWS 東京+シンガポールは使える‣シンガポールのSecondaryを見ても、ほとんど遅れなく同期している
‣JSスキーにとってはMongoかわいい
![Page 23: MongoDB: Case Study for AMN](https://reader036.vdocuments.pub/reader036/viewer/2022062418/556a478fd8b42a4a1e8b4e95/html5/thumbnails/23.jpg)
EC2使用料
‣Large x 3‣CloudWatch (Monitoring)‣Reserved Instances‣月額 $800 くらい
![Page 24: MongoDB: Case Study for AMN](https://reader036.vdocuments.pub/reader036/viewer/2022062418/556a478fd8b42a4a1e8b4e95/html5/thumbnails/24.jpg)
まとめ
‣MongoDB のおかげで急激なトラフィックにも恐れること無く、枕を高くして眠ることができます。‣doryokujinさんいつもありがとうございます。‣Fluent 使いたいです!‣Aggregation Mongo 使いたいです!!
![Page 25: MongoDB: Case Study for AMN](https://reader036.vdocuments.pub/reader036/viewer/2022062418/556a478fd8b42a4a1e8b4e95/html5/thumbnails/25.jpg)
提供アジャイルメディア・ネットワーク株式会社