お仕事で今、Railsアプリで複数DATABASEのサービスを開発していて、色々と悩むことが増えてきたので、勉強を兼ねてネットにあったドキュメントを収集していくつか読み込んでみました。俺得記事です。あともし良い資料とかあれば是非コメント下さい!
クックパッドにおける最近のActiveRecord運用事情
クックパッドにおける最近のActiveRecord運用事情 - クックパッド開発者ブログ
マイグレーションは使っていない
1,500以上のモデルがあり、複数人が作業しているため、互いの作業をブロックしないためにもマイングレーションでの運用は行っていない。
スキーマ管理ツール: Ridgepole
winebarrel/ridgepole - GitHub
スキーマ管理ツール。テーブル定義ファイルにカラムを書き足すと、実際のDBのテーブル定義と比較して、
差分があればその分だけALTER TABLEを行ってくれるそうです。
複数 DB、R/W splitting: switch_point
eagletmt/switch_point - GitHub
クックパッドでは、複数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 @ クックパッドさん
こちらは2014年の11月に開催された『Rails複数DB Casual Talk』でのクックパッドの@eagletmtさんの発表スライド。Rails 3.2 => 4.0にアップデートした時の複数DBの課題や、現在の運用上の課題などが中心に書かれています。
ソーシャルゲームで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 | |
あとがき
規模が大きくなっていく過程で、DBをスケールさせるための試みを知ることが出来ました。 前にバズってた時は上辺だけ見ていた気がしましたが、今回じっくり読み込んだおかげでやっと少し内容に追いつけました!あとでソースコード読んでみます^^