第5回 MongoDB 勉強会 in Tokyo 〜真夏の大Mongo祭り〜 に行ってきた

7/30(Sat)に開催されたMongoDB 勉強会 in Tokyo 〜真夏の大Mongo祭り〜に参加しました。

MongoDB勉強会自体は以前からUSTの配信を見ていたのですが、今回は予定が空いていたので参加することができました。

MongoDBについてはNode.jsからちょろっと使う程度で運用系についてあまり把握できていなかったので、今回の勉強会でReplica SetやShardingの運用でのはまりどころを聞けたてありがたかったです。
また、@bibrostさんのビジネス視点の話は、一瞬ビジネス系の別の勉強会に迷い込んだかと思いましたが、非常に考えさせられました。

あと、合間合間で詳細な解説をはさむ@doryokujin△。

懇親会では、Fusion-IOの@hasegawさんによるioDriveの熱い発表と、@understeerさんによるioDrive+InfiniBand+DRBDの発表を聞いてて、「ioDriveがこんなに速いと、Node.jsみたいな非同期I/Oとかいらなくなりそう」などと話してました。


最後に、
素晴らしい会場を提供してくださった、フューチャーアーキテクトさん++。
レッドブルヘルシアを提供してくださったスポンサーのHCCさん++。
発表者のみなさん++。
MongoDB勉強会の参加者のみなさん++。
素晴らしい運営をして下さったMongoDB運営スタッフのみなさん++。

メモ

あとは、適当にとったメモも貼っておきます。あとで発表資料読みなおし&USTの録画で補完。

前半 - Mongo事例祭り

Play with Mongoid!

@doryokujinさんから質問

    • Q. フィールドにNIL指定するとどうなるの?
    • A.フィールドにnilを指定すると、nilの値が入るわけではなくフィールド自体が無くなる
    • Q.Validationないの?
    • A. Validationは自力
    • Active::Model::Validationが使える
      • uniquenessは同一ドキュメント内でしか保証されない
    • Quoraのように編集の履歴を取りたい場合にはVersiningが良いかも?
      • Gitじゃ厳しい
      • Mongoid Hack
      • Facebookの情報を取って保存する
YiiフレームワークとMongoDBを使ったFacebookアプリ開発
  • @aoyagikouheiさん
  • PHPとMongoDB
    • PHPネイティブドライバ
    • フレームワークの対応状況
      • だいたい対応してる
      • 注目度No.1
      • ActiveRecord
      • 埋め込みドキュメント
      • GridFS
    • キャッシュ
      • ダイナミックコンテンツを使うとユーザ名だけ変えるとかできる
    • ロギング
ココロもつながるオンラインゲーム – アットゲームズ – のMongoDB導入事例
  • @nsegaさん
  • 資料→http://www.slideshare.net/n-sega/mongodb-8733880
  • アットゲームズ
  • MongoDBを導入した経緯
    • 既存機能拡張
      • あしあととゲストブックを統合したい
    • 新機能
      • ユーザページであいさつや、コメントなど簡単にフィードバックしたい
  • MySQLだと遅かった
  • データの分析
    • 更新頻度が高い
    • 整合性はそこまで求められない
  • スケールアップよりスケールアウトしたい
    • NoSQL
    • MongoDBのコミュニティが活発
    • MongoDBかっこいい
  • システム構成
    • 3台
      • Sharding + ReplicaSet
  • 自動ShardingをOff
  • Shard keyはuser id % 100(0-99)
    • 偏った場合は1/100の単位で偏りを補正できる
  • MongoDB用DataAccessクラスを自作
  • 重いクエリをチューニング
    • 重いクエリはexplainでチェックし、インデックスを設定
      • db.footprints
      • ensureIndex()
    • ハマりどころ
      • 明示的な型指定
        • 思ったとおりに取得、更新ができない
        • PHPの暗黙の型変換で想定外の型に・・・
    • 更新処理はデフォルトだとDBからの応答を待たない
      • ドライバのパラメータで応答を待つように指定しよう
  • 導入後の問題
    • Mongodプロセスの異常終了
      • Out of Memory
      • 大量のコレクションをAcceptしていた
  • 自動フェイルオーバーしない
    • @doryokujinさん: フェイルオーバー時のMASTER昇格は投票で過半数を得たノードが選ばれるため、3台以上で構成しないといけない
  • スロークエリ設定で助かった
  • Shardingの偏りについて
    • printShardingSizes()で確認
  • これからの課題
    • 自動フェイルオーバー、バックアップ、リストアの再懸賞
  • MongoDBの運用方法の横展開
  • Sharding環境での集計はMapReduce
  • RDBMSに似た機能があるおかげで、敷居が低い
  • ツール・ドキュメントや勉強会で情報が豊富
  • 自動機能は仕組みを理解して使わないと、運用で痛い目にあう
  • @doryokujinさん: 1.8のPrimary値はバックアップ目的でMasterになって欲しくないノードに0を設定するような使い方をする
  • ReplicaSetにする場合はけちらずに別のノードにしたほうがいい
  • 複数サーバのスロークエリの監視はtailするとか、ZABBIX Pluginとか
  • インデックスはInt < ObjectID < String

後半 - MongoとSQL

Not Only NoSQL! RDBの逆襲 – PostgreSQL

@choplinさん

ビジネス視点のMongoDB vs RDB 〜MongoDBの導入戦略〜
  • @bibrostさん
  • 利用事例
  • お話
    • モンゴ戦士の伝説
    • Death to False RDB!
  • ビジネス視点
    • プラス要素/マイナス要因 = 期待
    • プラス要因とマイナス要因をどのように評価するか
      • 短期的、中長期的
        • プラス:効率、品質、成長、ノウハウの蓄積
        • マイナス:学習コスト、ノウハウが少ない、メンテされなくなる、方向性が変わる
      • それぞれの要素の影響力はチームによって変わる
      • バックグラウンドによってプラス要因・マイナス要因は変わる
      • 課題(Issue)と機能(feature)
        • どのよううな課題があって、それを解決するための機能ができたのかを考えよう
        • 機能だけを見て決めない
      • 重要なのはビジョンと方向性
        • RDBとMongoDBは方向性が全く違うし、Mongoはまだまだ成熟していない
  • 自分の成長につながるプロダクト選択
  • MongoDBの導入戦略
    • Feature VS Featureにはほとんど意味なし
    • 適切な選択を
MongoDBとGridFSについて
  • @camelmasaさん
  • なぜGridFSを調べたのか
    • Livlisへのフィードバック
    • Lithium + MongoDBの新サービス
  • GridFSって何なのか?
    • MongoDBに巨大なファイルを格納するための仕様
    • ドライバ群
  • 環境構築
    • Configの設定方法は通常と変わらない
  • ReplicaSet, Shardingの挙動
    • ReplicaSetの挙動は通常と変わらない
  • DELETE
    • 同じファイル名で登録すると、削除する時に一緒に削除されてしまう-
  • 躓いたところ
    • ReplicaSetが大量の容量を使う
    • Shardingを確認する場合は、結構な量のファイルを入れないと確認できない
      • @doryokujin「2G以上にならないとShardingが始まらない」