ar-octopus

Railsは、標準では基本的にDBひとつの構成で動く作りになっている。

大規模サイトなどで、DBの負荷も高く、DBを分割しないといけなくなった場合に

Railsの標準構成では難しくなってくる。

そこで、ar-octopus を使う。

これは、更新系の処理はマスターに接続し、参照系の処理はスレイブを参照するように設定できる。

ホームページ

github

Rails 3とRails 2.3.*に対応

インストール

Gemfileに

gem 'ar-octopus', :require => 'octopus'

を追加して

bundle install

実行

使い方

コンフィグファイルを設定

コンフィグファイルの場所は

#config/shards.yml

で、基本的な設定内容は

octopus:
  environments:
    - development
    - production
  development:
    master:
      host: localhost
      adapter: mysql
      database: app_development
    slave:
      host: localhost
      adapter: mysql
      database: app_development
  production:
    master:
      host: localhost
      adapter: mysql
      database: app_production_master
    slave:
      host: localhost
      adapter: mysql
      database: app_production_slave

※詳しいshards.ymlファイルの設定方法はこちら

usingを使うと、データベースを切り替えることが出来る

以下の場合、Userのfindクエリーの接続先はslaveとなる

User.where(:name => "Thiago").limit(3).using(:slave)

ブロックにすることで、ブロック内でのクエリーを一括して指定することが出来る

Octopus.using(:slave) do
  User.create(:name => "Mike")
end

マイグレーションを実行するデータベースを指定する

class CreateUsersOnBothShards < ActiveRecord::Migration
  using(:master, :slave)

  def self.up
    User.create!(:name => "Both")
  end

  def self.down
    User.delete_all
  end
end

レプリケーションの場合

#config/shards.yml ファイルを以下のようにする

octopus:
  replicated: true
  production:
    slave1:
      adapter: mysql
      host: localhost
      database: octopus_shard2
    slave2:
      adapter: mysql
      host: localhost
      database: octopus_shard3
    slave3:
      adapter: mysql
      host: localhost
      database: octopus_shard4
    slave4:
      adapter: mysql
      host: localhost
      database: octopus_shard5

replicated: true を設定した場合、database.ymlに設定したものがマスターになる。