Configuring Unicorn for Octopus

Octopus is a gem that makes it easy to setup database replication (primary/follower) & sharding in Rails.

When using Octopus with Unicorn, we need to make a couple configuration changes to ensure our additional DB connections are established before users start hitting our app.

First, we need to initialize the DB connections in our after_fork block.

after_fork do |server, worker|
  Octopus.config['production']['master'] = ActiveRecord::Base.connection.config
  ActiveRecord::Base.connection.initialize_shards(Octopus.config)
end

Then in our before_fork, we need to drop all connections.

before_fork do |server, worker|
  if defined?(ActiveRecord::Base)
    shards = ActiveRecord::Base.connection_proxy.instance_variable_get(:@shards)

    shards.each do |shard, connection_pool|
      connection_pool.disconnect!
    end

    ActiveRecord::Base.connection.disconnect!
  end
end

Look here for a full example of this being used.

That’s it! With those two minor changes, Unicorn will properly establish and close our additional DB connections.

##For more…