酒と泪とRubyとRailsと

Ruby on Rails と Objective-C は酒の肴です!

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

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


クックパッドにおける最近のActiveRecord運用事情

クックパッドにおける最近の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 でフェイルオーバーするときに、ActiveRecordのコネクションプーリングは相性が悪いそうです。その対策として、DeNAのそのっつさんが作られた『sonots/activerecord-refresh_connection 』を使っているそうです。

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

[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キャッシュを行う仕組み等がある場合に用いるといいそうです。確かこの辺りの話はPodcastの『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の中ではおそらく一番手位有名なライブラリ。

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

1
2
3
4
5
6
7
# 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編 ~』を追加

おすすめの書籍