「ソーシャルアプリでNoSQL(あるいはKVS) 〜実践NoSQL〜」に出席してきました

KVSについて興味を持って調べているのですが、他社でどのようなKVSが、どう利用されているのか、どう評価されているのかが聞きたかったので、グリーCTOの藤本さんが講師を務めたセミナー、「ソーシャルアプリでNoSQL(あるいはKVS) 〜実践NoSQL〜」に出席してきました。

データ集計をどうやってやるかとか、Consistencyな更新(cas操作を使う)とか、シリアライズ形式のこととか、気になっていた部分のお話をたくさん聞けたので、とてもためになるセミナーでした。

忘れないうちに気になったところを簡単にメモしておきます。
*スライドの流れ通りではないです

1:1型(key : value)KVS

  • いわゆるKVS。単純な実装なので安定感がある。利用実績も豊富
  • kumofs, Flare, voldemote, Tokyo Tyrant, etc..たくさんのソリューションがある
  • グリーでは足あと帳という機能で1:1型のKVSを利用している(多分Flare?)
一つのKeyに対応するデータを複数格納したい場合
  1. Keyを分けて複数に格納する
    • getのクエリが多くなりがちなので、multi-getで取ってくる
    • set時にトランザクション処理ができないのが問題
      • 例)ユーザーAのHPとMPを同時に更新したいのに、HPだけ更新が成功しMPは失敗するようなことがあり得る
  2. Valueシリアライズした階層データ(PHPArrayとかRubyPerlのHash)を格納する
    • 藤本さん的にはどんどんシリアライズして使っちゃう(キーを分けて持つより良い)
    • シリアライズのフォーマットは、グリーではシンプルにPHPのserializeを使ってる
    • 多言語間でやり取りするならJSON、MessagePack。MessagePackはいいんじゃないか
casについて
  • memcachedがサポートしているデータ操作の一つ
  • compare and swap の略、比較してから交換する。
  • データ取得後更新する時に、他のプロセスから値が更新されていないかどうかを知るための仕組み
集計どうしよう問題

基本的に1:1型のKVSではKeyでの検索もValueでの検索も出来ない。でも集計が必要なときは以下のような方法

  1. 全データDumpする
    • これはイケテないから無しだと思う(藤本さん)
  2. 適当なタイミングでRDBMSにFlush
    • こっちの方が無難だと思う(藤本さん)

1:n型(key : value)KVS

  • 1つのKeyに対し複数のValueを持つタイプのKVS。
  • Redis, MongoDB, CouchDB, Cassandra, GAE/DataStore, HBaseとか
  • 複雑な実装。パフォーマンスなどいろいろ問題
Redis
  • Valueのデータ型としてListをサポート。
    • push / pop などの操作ができる
  • しかし、、実装がいけてない気がする
    • パーティションの機能がない
    • マスター/スレーブの設定が面倒
    • スレーブに書き込めちゃう
Cassandra
  • もっとテーブルっぽい
  • Writeの性能を上げることに血道を上げている印象
    • スゴイけど、それSSDでよくない?

その他メモ

  • プレゼンツール
  • 5キー問題に如何にして耐えるか(携帯ブラウザのリロードボタン)
  • ベクタークロック
  • KVSからのデータの検索
    • Keyで検索
    • Valueで検索
    • Like的な何か
  • index server
  • ring / sorted keys
  • skip graph
  • MongoDBの実装は結構PowerPlayな感じ・・

補遺

  • カウンターとかキューのようなデータ構造が、casを使えば実装できます。cas操作についてはこのページが分かりやすいです
  • 懇親会でちょっと藤本さんとお話させていただきました。新しい技術は導入いろいろ難しいですよねと言ったら、「実績は作ればいいんですよ!」と言われてプレッシャー。。