Rails複数データベース関連の資料まとめ


お仕事で今、Railsアプリケーションで複数DATABASEのサービスを開発していて、いろいろと悩むことが増えてきたので、勉強を兼ねてネットにあったドキュメントを収集していくつか読み込んでみました。俺得記事です。あともしよい資料とかあればぜひコメントください!


🎳 クックパッドにおける最近のActive Record運用事情

クックパッドにおける最近のActiveRecord運用事情 - クックパッド開発者ブログ

マイグレーションは使っていない

1,500以上のモデルがあり、複数人が作業しているため、互いの作業をブロックしないためにもマイングレーションでの運用は行っていない。

スキーマ管理ツール: Ridgepole

winebarrel/ridgepole - GitHub

スキーマ管理ツール。テーブル定義ファイルにカラムを書き足すと、実際のDBのテーブル定義と比較して、
差分があればそのぶんだけALTER TABLEを行ってくれるそうです。

複数DB、R/W splitting: switch_point

eagletmt/switch_point

クックパッドでは、複数DBで書き込みはマスタ、読み込みはスレーブに振り分けている(R/W Splitting)そうです。
この運用をサポートしてくれるライブラリとして、switch_pointを使っているそうです。

コネクションプーリングの切断: activerecord-refresh_connection

sonots/activerecord-refresh_connection

複数スレーブに負荷分散したり、MHAでフェイルオーバーーするときに、Active Recordのコネクションプーリングは相性が悪いそうです。その対策として、DeNAのそのっつさんが作られた『sonots/activerecord-refresh_connection
』を使っているそうです。

ちなみに、Active Recordのコネクションプーリングの解説はそのっつさんのブログに詳しく書かれています。

[Ruby] 例えば、ActiveRecord の connection_pool を止める - sonots:blog

😼 複数DBとRails @ クックパッドさん

複数DBとRails // Speaker Deck

こちらは2014年の11月に開催された『Rails複数DB Casual Talk』でのクックパッドの@eagletmtさんの発表スライド。Rails 3.2 => 4.0にアップデートした時の複数DBの課題や、現在の運用上の課題などが中心に書かれています。

🐹 Mobageを支えるRubyの技術 ~ 複数DB編 ~ @ DeNAさん

Mobage を支える Ruby の技術 ~ 複数DB編 ~

同じく『Rails複数DB Casual Talk』でDeNAの@sonotsさんが発表されたスライド。

sonots/resolver_replace

RubyのDNS resolver(名前解決)の部分を行うためのgem。独自のDNSキャッシュを行うしくみ等がある場合に用いるといいそうです。確かこのあたりの話はポッドキャストの『Admin Bar #3』でお話されてた気がします。

activerecord-refresh_connectionやswitch_pointが実際に活用されていたり、さらなるインフラ要件などの話など内容が充実していました!

🗻 ソーシャルゲームでDB水平分散 @ ドリコムさん

ソーシャルゲームでDB水平分散 #mdb_casual // Speaker Deck

こちらも開催された『Rails複数DB Casual Talk』でのドリコムの@gussanさんの発表スライド。ソシャゲの場合は、大量のアクセスが来ることを前提としているので、複数DBにアクセスを分散させるためのしくみとして、『drecom/activerecord-turntable』を使っているそうです。

drecom/activerecord-turntable

この『drecom/activerecord-turntable』というGemは、ID単位でアクセスするDBを振り分けているそうです。シャーディングと呼ばれる手法だそうです。ただしシャーディングを行う場合は、機能制限やDB系のプラグインが使えなくなることがあるようです。そのため、シャーディングが必要なほどのアクセスがある場合は、アプリケーション全体を組み直す必要があるようです。

drecom/barrage

この『drecom/barrage』は、DB単位でIDを採番すると衝突が発生するため、クラスタ単位でユニークな採番ができるようにするためのライブラリだそうです。

😀 octopus: データベースのシャーディングGem

tchandy/octopus

Rails用のシャーディングのGemの中ではおそらく一番手位有名なライブラリ。

使い方としてはこんな感じだそうな。

# slave_oneを指定して、SQLを実行
User.where(:name => "Thiago").limit(3).using(:slave_one)

# ブロックでslave_twoを指定して、SQLを実行
Octopus.using(:slave_two) do
User.create(:name => "Mike")
end

🎃 あとがき

規模が大きくなっていく過程で、DBをスケールさせるための試みを知ることができました。
前にバズってた時は上辺だけ見ていた気がしましたが、今回じっくり読み込んだおかげでやっと少し内容に追いつけました! あとでソースコード読んでみます^^

🐠 変更来歴

(01-01 23:05)『Mobageを支えるRubyの技術 ~ 複数DB編 ~』を追加

🖥 VULTRおすすめ

VULTR」はVPSサーバのサービスです。日本にリージョンがあり、最安は512MBで2.5ドル/月($0.004/時間)で借りることができます。4GBメモリでも月20ドルです。 最近はVULTRのヘビーユーザーになので、「ここ」から会員登録してもらえるとサービス開発が捗ります!

📚 おすすめの書籍