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