DB Tech Showcase 東京2014つづき、
月間10億PVから学んだMongoDBアンチパターン
を聞いてきたので、その内容をメモメモ
月間10億PVから学んだMongoDBアンチパターン
ZenClerk(ぜんくらーく)0から10億PV
・ベストタイミングオファー
パラメータ→機械学習
難しい点
・リアルタイム
・ビッグデータ
マウスの移動まで
月間10億PV
秒間400PV
同時接続数5万
月間10TB保存
フロントエンド
あんぎゅらーJS
ROR
MySQL
めむきゃしゅD
AWS
ばっくえんど
Node.JS
Mongo
Socket.io
Redis
AWS 22台
i2.2Xlarge 8台
m1.large
m3.large 12台
r3.large 2台
~1000万PV→mongoDB
スケールしない
~1億
replica set
書き込み、メモリ乗り切るか
シャーディング
→3つのレプリカセット
ここまでアプリケーションの変更ほとんどなし
(一部クエリを最適化)
使った理由
・スキーマレス
・トランザクション不要(最低限のアトミック処理)
・柔軟なクエリ
・容易なスケールアウト
・node.jsとの相性のよさ→socket.ioを使う→JSON
本当の理由
・導入の容易さ→ホスティングサービス
・学習の容易さ(エンジニア以外にとっても)
ベストプラクティス
→むずかしい
・ドキュメントを埋め込む
読み込み重視:書き込み遅くなる
・ドキュメントを埋め込まない(RDBの正規化に近い)
・書き込みスケールする:読み込み2回
・ハイブリッド
スキーマレスはスキーマ定義が不要という意味ではない
RDBMSよりも選択肢が多く難しい
アンチパターン
インデックスへん
・インデックスの張りすぎ
メモリの使いかたがあまり賢くない
→実際にはおそくなる:メモリに載らなくなれば
プラガブルストレージエンジン
InnoDB,rocksDBに変えられる
・文字列のインデックス
インデックス
RDBMSとほとんど同じ
B-Tree
メモリ効率悪い
→時間はメモリ効率よい
→できるだけObjectIdを使う。
クエリへん
・フィールドを指定しないクエリ
coverd indexを有効利用する
・コールドデータへのクエリ
ホットデータへのアクセスは高速
コールドデータのアクセスは遅い
・集計
要約データ5分、1時間、1日など
ホットデータを意識したアクセス
・プライマリに偏った
レプリカセット
クエリを分散させることができる
プログラマが、セカンダリに投げるかどうか判断する
最新のデータ出なくても良いなら、読み込みをセカンダリへ
アップデートへん
・updateと&incを使って
・upsert:true
肥大化するドキュメント
MongoDBの苦手分野
フィールドが肥大化するアップデートが遅い
データの移動
Redis(れでぃす)と組み合わせて使う
すべてをMongoでやろうとしない
あーきてくちゃ
・1つのDBに詰め込む
わけたほうがいい
メモリが多く使える
document-level locking
3つの監視
・リアルタイム監視
MongoHQ
・見返すための監視
MMSダッシュボード
・遅いクエリの監視
explain(true)
100ms以上かかったら危険信号
月間10億PVから学んだMongoDBアンチパターン
を聞いてきたので、その内容をメモメモ
月間10億PVから学んだMongoDBアンチパターン
ZenClerk(ぜんくらーく)0から10億PV
・ベストタイミングオファー
パラメータ→機械学習
難しい点
・リアルタイム
・ビッグデータ
マウスの移動まで
月間10億PV
秒間400PV
同時接続数5万
月間10TB保存
フロントエンド
あんぎゅらーJS
ROR
MySQL
めむきゃしゅD
AWS
ばっくえんど
Node.JS
Mongo
Socket.io
Redis
AWS 22台
i2.2Xlarge 8台
m1.large
m3.large 12台
r3.large 2台
~1000万PV→mongoDB
スケールしない
~1億
replica set
書き込み、メモリ乗り切るか
シャーディング
→3つのレプリカセット
ここまでアプリケーションの変更ほとんどなし
(一部クエリを最適化)
使った理由
・スキーマレス
・トランザクション不要(最低限のアトミック処理)
・柔軟なクエリ
・容易なスケールアウト
・node.jsとの相性のよさ→socket.ioを使う→JSON
本当の理由
・導入の容易さ→ホスティングサービス
・学習の容易さ(エンジニア以外にとっても)
ベストプラクティス
→むずかしい
・ドキュメントを埋め込む
読み込み重視:書き込み遅くなる
・ドキュメントを埋め込まない(RDBの正規化に近い)
・書き込みスケールする:読み込み2回
・ハイブリッド
スキーマレスはスキーマ定義が不要という意味ではない
RDBMSよりも選択肢が多く難しい
アンチパターン
インデックスへん
・インデックスの張りすぎ
メモリの使いかたがあまり賢くない
→実際にはおそくなる:メモリに載らなくなれば
プラガブルストレージエンジン
InnoDB,rocksDBに変えられる
・文字列のインデックス
インデックス
RDBMSとほとんど同じ
B-Tree
メモリ効率悪い
→時間はメモリ効率よい
→できるだけObjectIdを使う。
クエリへん
・フィールドを指定しないクエリ
coverd indexを有効利用する
・コールドデータへのクエリ
ホットデータへのアクセスは高速
コールドデータのアクセスは遅い
・集計
要約データ5分、1時間、1日など
ホットデータを意識したアクセス
・プライマリに偏った
レプリカセット
クエリを分散させることができる
プログラマが、セカンダリに投げるかどうか判断する
最新のデータ出なくても良いなら、読み込みをセカンダリへ
アップデートへん
・updateと&incを使って
・upsert:true
肥大化するドキュメント
MongoDBの苦手分野
フィールドが肥大化するアップデートが遅い
データの移動
Redis(れでぃす)と組み合わせて使う
すべてをMongoでやろうとしない
あーきてくちゃ
・1つのDBに詰め込む
わけたほうがいい
メモリが多く使える
document-level locking
3つの監視
・リアルタイム監視
MongoHQ
・見返すための監視
MMSダッシュボード
・遅いクエリの監視
explain(true)
100ms以上かかったら危険信号