Ruby on RailsでMySQL Clusterの使えるようにするプラグインを作ってみた

似たようなプラグインもいくつかあったけど、どれもしっくり来なかったから自分で作った。
その名も「Mysql Cluster Adapter」。
 
eth0jp's activerecord-mysql_cluster_adapter at master - GitHub
http://github.com/eth0jp/activerecord-mysql_cluster_adapter
 

MySQL Cluster Adapterの機能

複数Writableに対応

ただReadOnly機能がないだけだけど。
※マルチマスターレプリケーション対応ではない。
 

クラスタリング・自動復旧

リクエストが来た時にランダムで使うノードを選択する。
もし選択したノードが死んでいたら再接続を試みて、接続出来なかったら次のノードを選択する。
全てのノードが死んでたら500エラー。
 

トランザクション

トランザクションを有効にするために、1つのリクエストでは必ず同じノードに接続するようにする。
そのため、リクエストが送られてからノードが死んだ場合は500エラーをレスポンスする事になる。
 

ユーザビリティ

プラグインを使う人が意識せずに使える。
config/database.ymlが書き方が違うだけで、プログラム側は通常のMySQLアダプタと同じ。
 

設定ファイル

config/database.yml
production:
  adapter: mysql_cluster
  nodes:
    - database: clusterdb
      host: 192.168.1.10
      username: root
      password: pass
      encoding: utf8
    - database: clusterdb
      host: 192.168.1.20
      username: root
      password: pass
      encoding: utf8

development:
  adapter: mysql_cluster
  nodes:
    - database: clusterdb_dev
      host: 192.168.1.10
      username: root
      password: pass
      encoding: utf8
    - database: clusterdb_dev
      host: 192.168.1.20
      username: root
      password: pass
      encoding: utf8

 

インストール

./script/plugin install git://github.com/eth0jp/activerecord-mysql_cluster_adapter.git

 

動作確認バージョン

Ruby 1.8.5
ActiveRecord 2.3.5
 

参考URL

ActiveRecord

ActiveRecordのDBコネクションの接続切れと再接続について。reconnectオプションは危険だなーとかも - odeの開発メモ日記
http://d.hatena.ne.jp/ode/20100809/1281336400
 
データベースに接続できない場合の流れを追ってみた - remind::me
http://d.hatena.ne.jp/kenshoster/20090127/1233041004
 

似たようなプラグイン

acts_as_readonlyable

マスタースレーブ構成を想定したプラグイン
モデルごとにMaster/Slaveを決める。

class Fruit < ActiveRecord::Base
  acts_as_readonlyable :read_only
end

 
Revolution On Rails: [PLUGIN RELEASE] ActsAsReadonlyable
http://revolutiononrails.blogspot.com/2007/04/plugin-release-actsasreadonlyable.html
 
dbのマスタースレーブに対応するためにacts_as_readonlyableを使ってみる - odeの開発メモ日記
http://d.hatena.ne.jp/ode/20090109/1231496360
 

mysql_replication_adapter

マスタースレーブ構成を想定したプラグイン
SQLごとにMaster/Slaveを決める。

MyModel.find(:all, :use_slave => true)

 
Mysql Replication Adapter | Engineering Rapleaf
http://blog.rapleaf.com/dev/2007/08/12/mysql-replication-adapter/
 
findchris's mysql_replication_adapter at master - GitHub
http://github.com/findchris/mysql_replication_adapter
 

magic_multi_connections

最近のバージョンのRailsでは動かないみたい。
 
Magic Multi-Connections
http://magicmodels.rubyforge.org/magic_multi_connections/