ドリコムライブラリ大公開
  gussan@Drecom Co., Ltd.
        #megurorails




                            Copyright © Drecom Co., Ltd.
提供




     Copyright © Drecom Co., Ltd.
自己紹介

• @gussan          ※顔出しNG

• ソーシャルゲーム基盤開発本部
• アーキテクト
• ミドルウェア選定・ライブラリ開発等

               Copyright © Drecom Co., Ltd.
※大公開と言いつつ、
 本日紹介するのは、
 一つになります。。


        Copyright © Drecom Co., Ltd.
activerecord-turntable
http://github.com/drecom/activerecord-turntable

                本日公開!



                                     Copyright © Drecom Co., Ltd.
アジェンダ
• 概要
• 機能説明
• デモ
• Edgeの話
• 終わりに
             Copyright © Drecom Co., Ltd.
activerecord-turntable
         概要


                 Copyright © Drecom Co., Ltd.
activerecord-turntable
http://github.com/drecom/activerecord-turntable



  • ActiveRecord Sharding Plugin
  • Railsアプリをスケールさせる
  • 長いので ターンテーブル と呼びます

                                    Copyright © Drecom Co., Ltd.
Shardingって何よ
• 水平分散
• 例) ブログサービスならブログ毎にDB
 を分ける            App
     blog_id=1         blog_id=3

        DB1      DB2       DB3


                        Copyright © Drecom Co., Ltd.
既存のSharding
• Spider for MySQL
 • ソーシャルゲームとの相性
 • Railsとの相性
 • 今はかなり改善されているはず
• Octopus, DataFabric, db_charmer
 • DBアクセスするコード殆どに手を入れなけれ
   ばいけない

                          Copyright © Drecom Co., Ltd.
既存Shardingの痛み

• DBアクセスするコード全てに何かしら
 対応が必要

• => 対応漏れが発生しやすい
• => 対応に時間がかかる

                   Copyright © Drecom Co., Ltd.
activerecord-turntable

• Sharding導入時の痛みを軽減
 • アプリケーションコードに入り込ま
  ない

 • Shardingを意識しなくても8割方動
  く


                   Copyright © Drecom Co., Ltd.
何をやるのか

• 分散定義に従って、クエリ情報から
 キーを元にModelが接続するShardを
 Clusterから自動的に選択することによ
 り、Shardingを実現するplugin



                 Copyright © Drecom Co., Ltd.
図解
ActiveRecord::Base      Turntable

     AR::Base           AR::Base
          Query                Query
  ConnectionPool            Proxy

   Connection        CP      CP        CP
                     Conn   Conn       Conn



       DB            DB      DB        DB

                                   Copyright © Drecom Co., Ltd.
サーバ構成例

Master    App     Sequencer


                    Cluster
Shard1   Shard2   Shard3




                      Copyright © Drecom Co., Ltd.
用語
• Shard = データが保存されるノード
• Cluster = 同じデータを保存するShard
 の塊

• Sequencer = 採番DB
• Master = 通常のdatabase.ymlで指定
 するDB。schema情報が取得される。

                       Copyright © Drecom Co., Ltd.
activerecord-turntable
         機能


                 Copyright © Drecom Co., Ltd.
機能
• 分散定義
• 自動クエリ分散
• 採番機能
• DB分散トランザクション
• Migration, Rake task拡張など
                         Copyright © Drecom Co., Ltd.
機能
• 分散定義
• 自動クエリ分散
• 採番機能
• DB分散トランザクション
• Migration, Rake task拡張など
                         Copyright © Drecom Co., Ltd.
分散定義
class User < ActiveRecord::Base
  turntable :user_cluster, :id
end

               +
 分散設定ファイル turntable.yml
 接続設定ファイル database.yml



                           Copyright © Drecom Co., Ltd.
分散定義

• mysqlのpartitioning
• どの値をキーにして、どの値ならば、
 どのDBに保存するかを設定として書く

• 分散アルゴリズムはpluggable

                       Copyright © Drecom Co., Ltd.
機能
• 分散定義
• 自動クエリ分散
• 採番機能
• DB分散トランザクション
• Migration, Rake task拡張など
                         Copyright © Drecom Co., Ltd.
自動クエリ分散
# on Octopus
User.using(:xxx).where(id: 10)
# on db_charmer
User.shard_for(10).where(id: 10)
# on turntable
User.where(id: 10)




                             Copyright © Drecom Co., Ltd.
自動クエリ分散

• 分散定義に従い、クエリを必要な
 shardに振り分けて結果をmerge

• 内部的にはconnection_poolを置き換
 えてクエリを盗み見

• 対応できないクエリもある
                     Copyright © Drecom Co., Ltd.
機能
• 分散定義
• 自動クエリ分散
• 採番機能
• DB分散トランザクション
• Migration, Rake task拡張など
                             Copyright © Drecom Co., Ltd.
採番機能

class User < ActiveRecord::Base
  turntable :user_cluster, :id
  sequencer
end




                           Copyright © Drecom Co., Ltd.
採番機能
# on Octopus
Octopus.using(:shard1) do
  User.create(name: "hoge")
end
# on db_charmer
User.shard_for(10).create(name: "hoge")
# on turntable
User.create(name: "hoge")


                                Copyright © Drecom Co., Ltd.
採番機能

• ARは一意なサロゲートキーが前提
• 分散環境下で一意なIDを振る仕組み
• 採番方法自体はpluggable
• mysql上に採番テーブルを作っている

                 Copyright © Drecom Co., Ltd.
機能
• 分散定義
• 自動クエリ分散
• 採番機能
• 分散トランザクション
• Migration, Rake task拡張など
                             Copyright © Drecom Co., Ltd.
分散トランザクション

User.shards_transaction([user1, user2]) do
  ....
  user1.save!
  user2.save!
end




                                Copyright © Drecom Co., Ltd.
分散トランザクション
• 複数のDBを同時に操作する
• 例) User間でアイテムの受け渡し等
• XAトランザクションではなく通常の
 transactionをネストしているだけ

• 操作するobjをまとめて渡す
                   Copyright © Drecom Co., Ltd.
機能
• 分散定義
• 自動クエリ分散
• 採番機能
• 分散トランザクション
• Migration, Rake task拡張など

                             Copyright © Drecom Co., Ltd.
Migration & Rake tasks

• Migration毎にどのshardを操作するか
 を指定できる。

• db:create, db:dropなどが全ての
 shardにも同時実行される

• その他, README参照
                        Copyright © Drecom Co., Ltd.
できないこと

• has_many :throughやhabtmで制限あり
 例) Friend関係など

• DBをまたがったJOIN、ORDER BYなど。
• できないことは設計とロジックで吸収

                          Copyright © Drecom Co., Ltd.
デモ



     Copyright © Drecom Co., Ltd.
内部構造
• connection_poolをproxyオブジェクトに
 置き換え

• ARel or SQLを受け取ったら値をbind
• SQLをparseして対象shardにクエリ送信
• 結果をmergeして返す
                       Copyright © Drecom Co., Ltd.
Edgeのお話



          Copyright © Drecom Co., Ltd.
AR Edgeのお話

• ActiveRecord::Model
 • 継承でもmixinでもARが使える
 • AR::Baseの中身はAR::Coreへ
• IdentityMapなくなった

                      Copyright © Drecom Co., Ltd.
turntableの将来

• turntableはRails 4.0にも対応予定
• 参照分散等、多様な構成に対応
• 拡張容易にしたい

                        Copyright © Drecom Co., Ltd.
最後に

• activerecord-turntableを使うこと
 で、ActiveRecord上で楽にSharding
 を実現することができます。

• 他のORMで実装して頂ける方緩募

                         Copyright © Drecom Co., Ltd.
合わせて読みたい




http://www.slideshare.net/drecom/ss-11667563



                                  Copyright © Drecom Co., Ltd.
ご清聴ありがとうございました。

           activerecord-turntable
http://github.com/drecom/activerecord-turntable



   エンジニア大募集中


                                    Copyright © Drecom Co., Ltd.

activerecord-turntable