Prevent pinning writes in non-primary DCs
This commit is contained in:
@@ -42,6 +42,7 @@ env:
|
|||||||
MYSQL_SOLID_CACHE_HOST: fizzy-solidcache-db-01.sc-chi-int.37signals.com
|
MYSQL_SOLID_CACHE_HOST: fizzy-solidcache-db-01.sc-chi-int.37signals.com
|
||||||
df_iad:
|
df_iad:
|
||||||
MYSQL_SOLID_CACHE_HOST: fizzy-solidcache-db-101.df-iad-int.37signals.com
|
MYSQL_SOLID_CACHE_HOST: fizzy-solidcache-db-101.df-iad-int.37signals.com
|
||||||
|
PRIMARY_DATACENTER: true
|
||||||
df_ams:
|
df_ams:
|
||||||
MYSQL_SOLID_CACHE_HOST: fizzy-solidcache-db-401.df-ams-int.37signals.com
|
MYSQL_SOLID_CACHE_HOST: fizzy-solidcache-db-401.df-ams-int.37signals.com
|
||||||
|
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ env:
|
|||||||
MYSQL_SOLID_CACHE_HOST: fizzy-staging-solidcache-db-01.sc-chi-int.37signals.com
|
MYSQL_SOLID_CACHE_HOST: fizzy-staging-solidcache-db-01.sc-chi-int.37signals.com
|
||||||
df_iad:
|
df_iad:
|
||||||
MYSQL_SOLID_CACHE_HOST: fizzy-staging-solidcache-db-101.df-iad-int.37signals.com
|
MYSQL_SOLID_CACHE_HOST: fizzy-staging-solidcache-db-101.df-iad-int.37signals.com
|
||||||
|
PRIMARY_DATACENTER: true
|
||||||
df_ams:
|
df_ams:
|
||||||
MYSQL_SOLID_CACHE_HOST: fizzy-staging-solidcache-db-401.df-ams-int.37signals.com
|
MYSQL_SOLID_CACHE_HOST: fizzy-staging-solidcache-db-401.df-ams-int.37signals.com
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
|
require "deployment"
|
||||||
|
|
||||||
Rails.application.configure do
|
Rails.application.configure do
|
||||||
config.active_record.database_selector = { delay: 1.second }
|
config.active_record.database_selector = { delay: 1.second }
|
||||||
config.active_record.database_resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver
|
config.active_record.database_resolver = Deployment::DatabaseResolver
|
||||||
config.active_record.database_resolver_context = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session
|
config.active_record.database_resolver_context = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
require_relative "deployment/database_resolver.rb"
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
module Deployment
|
||||||
|
class DatabaseResolver < ActiveRecord::Middleware::DatabaseSelector::Resolver
|
||||||
|
def self.in_primary_datacenter?
|
||||||
|
ENV["PRIMARY_DATACENTER"].present? || Rails.env.local?
|
||||||
|
end
|
||||||
|
|
||||||
|
def reading_request?(request)
|
||||||
|
# Disables writes (and so primary-DB stickiness) in non-primary datacenters
|
||||||
|
super || !DatabaseResolver.in_primary_datacenter?
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
def read_from_primary?
|
||||||
|
# Only the primary datacenter can read from the primary database, non-primary DCs have local DB replicas
|
||||||
|
super && DatabaseResolver.in_primary_datacenter?
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
Reference in New Issue
Block a user