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

  • 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 Disqus