ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

「MongoDBアンチパターン」を聞いてきた!

2014-11-12 01:01:58 | AI・BigData
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以上かかったら危険信号


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする