お仕事で今、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 @ クックパッドさん
こちらは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さんが発表されたスライド。
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を実行 |
🎃 あとがき
規模が大きくなっていく過程で、DBをスケールさせるための試みを知ることができました。
前にバズってた時は上辺だけ見ていた気がしましたが、今回じっくり読み込んだおかげでやっと少し内容に追いつけました! あとでソースコード読んでみます^^
🐠 変更来歴
(01-01 23:05)『Mobageを支えるRubyの技術 ~ 複数DB編 ~』を追加