odeの開発メモ日記

プログラマーやってます。今までの道のり ポケコンbasic→C(DirectX5 ネットやろうぜ)→Perl(ちょろっと)→Java→C#→Ruby→Android(Java)

mysqlでのdbのマスタースレーブに対応するのは厳しいねぇ。

先にいうと、あることはあるけど
メンテされてなくて最新のrailsでは動きませんでし。
そのうち使えるようになるだろうと信じてのメモ書きです。
急いで使うなら自分で作るか、改良する必要になります。


magic multi connections

findする際にモデルの頭に接続名を指定する形。

Master::User.find(:first)
Slave1::User.find(:first)
Slave2::User.find(:first)

複数のDBコネクションを自由に選択できる柔軟性があるが、単純なマスタースレーブ構成にするにはスレーブをまとめるための一工夫が必要になる。

メジャーなのがこれっぽいが、rails2.1で動かなかった。。
ので使えない。

http://magicmodels.rubyforge.org/magic_multi_connections/



mysql replication adapter

findの引数にスレーブ使うよとオプションを渡すスタイル

マスタースレーブ構成に一番適したスタイルだと思う。

User.find(:first, :use_slave => true)

rails2系では使えないっぽいがバグトラッカーに
rails2系で使えるようにしたパッチがありました。
http://rubyforge.org/tracker/index.php?func=detail&aid=20068&group_id=4116&atid=15778

一応動作したのですが、本番環境で1日おきに例外が。。

ActiveRecord::ConnectionAdapters::CannotWriteToSlave (You attempted to perform a write operation inside a slave-balanced read block.):
[FATAL]     /vendor/plugins/mysql_replication_adapter/lib/active_record/connection_adapters/mysql_replication_adapter.rb:91:in `ensure_master'

恐らくdbが切断されたときの再接続で失敗する時があるくさい。
開発環境でdb接続を強制切断して何回か試してたまに再現できました。

というわけで使えない。



acts_as_readonlyable

更新系はマスターに
読み取り系はスレーブにしてくれるやつ。

けどスレーブはデータ反映まで遅延するから
データを更新したあとに確認させるのに使えない。。

日本最大規模のrailsを使ったサイトのクックパッドでは
このライブラリを改良して使ってるとのこと。