In Rails, you can override the master database selection for splitting read-write queries between the master and replica databases. This approach is often used to distribute the database load and offload read operations to replicas, while keeping write operations on the master database.

To achieve this, you can use a gem like rack_rw or rack_readwritesplit that provides middleware to handle the routing of read and write queries to different database connections based on your custom logic.

Below are the general steps to set up read-write splitting using the rack_rw gem:

  1. Add Gem to Your Gemfile: Add the rack_rw gem to your Rails application's Gemfile and run bundle install.
# Gemfile gem 'rack_rw'
  1. Configure Database Connections: Update your config/database.yml file to include separate database configurations for the master and replica databases. For example:
# config/database.yml default: &default adapter: postgresql encoding: unicode pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> development: <<: *default database: my_app_development username: postgres password: password production: <<: *default database: my_app_production username: <%= ENV['DB_USERNAME'] %> password: <%= ENV['DB_PASSWORD'] %> host: <%= ENV['DB_HOST'] %> replica: <<: *default database: my_app_replica username: <%= ENV['DB_REPLICA_USERNAME'] %> password: <%= ENV['DB_REPLICA_PASSWORD'] %> host: <%= ENV['DB_REPLICA_HOST'] %>
  1. Set Up Rack Middleware: In your Rails application, create a new file (e.g., config/initializers/rack_rw.rb) and configure the rack_rw middleware to route read queries to the replica database.
# config/initializers/rack_rw.rb Rails.application.config.middleware.use Rack::Rw, replica: proc { |env| env['REQUEST_METHOD'] == 'GET' } # Change the condition as needed

In this example, the middleware is set up to route read queries (HTTP GET requests) to the replica database. You can customize the condition based on your specific needs. For instance, you may choose to route read queries to the replica only when certain parameters are present in the request.

  1. Load Balancing and Failover (Optional): If you have multiple replica databases or want to implement failover mechanisms, you may use additional gems or libraries like pgbouncer, pgpool-II, or HaProxy to handle load balancing and automatic failover.

Please note that setting up read-write splitting and database replication requires careful consideration and testing to ensure data consistency and reliability. Always make sure to have proper backups and test thoroughly before deploying to production. Additionally, consult the documentation and guidelines of your database system to set up replication and failover correctly.

Have questions or queries?
Get in Touch