ソーシャルアプリでNoSQL(あるいはKVS) 〜実践NoSQL〜

  • 2010/07/23(金)
  • オプトさんの例のセミナー
  • GREEのCTOの人
  • ソーシャルアプリでNoSQL(KVS)の話
  • KVSの利用者は少ない? 2/3ぐらい
  • 副題 : 如何にして5キーに耐えるか
  • = Not Only SQL
    • 世にプロダクトはたくさんある
      • それぞれさまざまな特性がある(オンメモリ、分散、性能、実績などなど)
        • デファクトスタンダードがないので乱立?
  • それ (Drizzle) でできるよ
    • それでもいいんじゃないかと思ってます
  • NoSQL と言い出すまでの歴史
    • 1998 年ぐらいから言われ始めたらしい
    • 第一期 : RDBMS でいいよね期
      • 最初はポスギレが多かった
    • 第二期 : memcached も便利だよね期
      • まあセッションとかも使い始めたところ
    • 第三期 : やっぱりスケーラビリティだよね期
      • mixi などでの分散とか
      • sharding
        • JOIN できない><
        • トランザクションできない><
        • 複雑なSQL書いたら怒られた><
      • RDBMS の機能を余り使っていない
        • Relationa じゃないよね
    • 第四期 : 全部 RDBMS じゃなくてもいいよね期
      • たぶんいまここ
  • NoSQLのデータモデル
    • 1 : 1
      • ハッシュテーブル
      • 一番シンプル
        • kumofs / Flare / Voldemort とか
        • パフォーマンス / 安定性 / sharding / replication / Failover
        • サーバを追加すると自動で負荷が分散されたりする
    • メソッドとか
      • set / get / delete
      • add / replace / cas の違いとか
        • add -> INSERT
        • replace -> UPDATE
        • cas -> compare and swap (version 管理して意図しない上書きを抑制できる)
      • incr / decr -> increment / decrement
      • append /prepend
    • vector clock
      • consistency を確保するための仕組みらしい
        • 何かしらの指標によって、replication の失敗を発見して、回復しようとする仕組み?
    • consistency policy
    • serialized object
    • multi get problem
    • disk i/o -> tmpfs
      • sparse file problem
  • 実例
    • 複数のデータを一気にとるときに大変
      • 100パラメータ x 100ユーザ x 100アクセスとか
    • serialize する?
      • get は1回
      • 並列すると conflict -> CAS
        • 更新合戦になると大変 -> ある程度であきらめる
    • 値でのランキングとか
      • 要するに集計したい
      • 全データを dump する
        • あんまりすぎる
      • 適当なタイミングで RDBMS に flush
        • 一番無難
          • 集計系はリアルタイム性がなくても大丈夫だから
            • あとでやってみよう
    • だいたい in memory での運用
      • MMORPG とか
        • オンメモリでいろいろやって、レベルアップとかのタイミングでデータベースに flush するそうな
    • 1 : n
    • Redis
      • 1 : 1
      • List
      • Set (Hash)
      • 便利になるが、パフォーマンスリスクが高い
      • さらに table っぽく
    • Casandra
      • Keyspace.ColumnFamiry.Key.Column
      • 多重Hashのような
      • バイナリログ + メモリテーブルのような感じ
    • m : n
      • Key の prefix search がしたい!
        • 解決法?
          • Index Server
          • Ring w/ Sorted Key
          • Skip Graph ?
    • value で検索したい!
      • DataStore でできてるよ?
        • index をKVSに置いている
        • Power Play っぽい?
          • 各ノードから検索してマージして持ってくる
  • RDBMS との使い分けも考えてみるのがいいと思っているらしい
  • Casandra / Redis の好きじゃないところ
    • 自動分散ができない?
    • master/slaveにはできるがslaveに書き込めたりする
  • GREE では?
    • Flare(1:1)のものだけ
  • serializeに適切なフォーマットは?
    • GREEはPHPなので…
    • 多言語ならMessagePackとかいいんじゃないでしょうか
 
このエントリーを含むはてなブックマークはてなブックマーク - 「ソーシャルアプリでNoSQL(あるいはKVS) 〜実践NoSQL〜」に行ってきた この記事をクリップ!Livedoorクリップ - 「ソーシャルアプリでNoSQL(あるいはKVS) 〜実践NoSQL〜」に行ってきた Googleブックマークに追加 Digg This
Tags: , , , ,