teespring-labs / active_record_replica Goto Github PK
View Code? Open in Web Editor NEWRedirect ActiveRecord (Rails) reads to replica databases while ensuring all writes go to the primary database.
License: Apache License 2.0
Redirect ActiveRecord (Rails) reads to replica databases while ensuring all writes go to the primary database.
License: Apache License 2.0
I have a big code base in which every query read/writes is executed against Master DB. Now I want (On some specific areas) to read only from Slave DB. This gem seems very useful for my case but by defaults it reads from slave and writes in master. I want this default behavior turn off and force a read against slave on specific active record query.
may be something like
ActiveRecordSlave.read_from_slave do
@users = User.count
end
Is this possible?
Hi,
Is it possible to connect to slaves via
slave:
adapter: mysql2
url: <%= ENV['DATABASE_SLAVE_URL'] %>
Im seeing this error NoMethodError: undefined method []' for nil:NilClass active_record_slave-1.3.0/lib/active_record_slave/active_record_slave.rb:20:in
install!'
Hi,
After I added AR Slave gem to my project and database.yml it fails due to this gem now requiring DB connection during RAILS_ENV=production bundle exec rake assets:precompile
.
It wasn't required before.
Any ideas?
Rails: 4.2.11.1
Puma: 3.6.2
Active_record_slave: 1.5.0
I think Thread.current.thread_variable_get(:active_record_slave) fail in puma cluster.
I set ActiveRecordSlave.read_from_master! in an initializer but 'reads' go to slave instead by default
To keep things DRY, what do you think about defaulting to the master's database configuration unless specified in the slave configuration. For the example in your README:
production:
database: production
username: username
password: password
encoding: utf8
adapter: mysql
host: master1
pool: 50
slave:
database: production
username: username
password: password
encoding: utf8
adapter: mysql
host: slave1
pool: 50
Typically with slave databases, most of the settings are actually the exact same as the master, except for host (usually).
Wouldn't it be nice to write this instead:
production:
database: production
username: username
password: password
encoding: utf8
adapter: mysql
host: master1
pool: 50
slave:
host: slave1
And have the slave configuration just inherit from the master configuration?
Let me know what you think and I'll look at doing a PR.
Thanks!
Provide at least:
$ ruby -v
ruby 2.5.3p105 (2018-10-18 revision 65156) [x86_64-darwin18]
Active Record Slave Version.
1.4.0
Application/framework names and versions (e.g. Rails, Sinatra, Puma, etc.).
Rails
Full Stack Trace, if an exception is being raised.
Traceback (most recent call last):
43: from bin/rails:4:in `<main>'
42: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/activesupport-4.2.11/lib/active_support/dependencies.rb:274:in `require'
41: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/activesupport-4.2.11/lib/active_support/dependencies.rb:240:in `load_dependency'
40: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/activesupport-4.2.11/lib/active_support/dependencies.rb:274:in `block in require'
39: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:29:in `require'
38: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:20:in `require_with_bootsnap_lfi'
37: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/loaded_features_index.rb:65:in `register'
36: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:21:in `block in require_with_bootsnap_lfi'
35: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:21:in `require'
34: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/railties-4.2.11/lib/rails/commands.rb:17:in `<main>'
33: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/railties-4.2.11/lib/rails/commands/commands_tasks.rb:39:in `run_command!'
32: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/railties-4.2.11/lib/rails/commands/commands_tasks.rb:67:in `console'
31: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/railties-4.2.11/lib/rails/commands/commands_tasks.rb:142:in `require_application_and_environment!'
30: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/railties-4.2.11/lib/rails/application.rb:328:in `require_environment!'
29: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/activesupport-4.2.11/lib/active_support/dependencies.rb:274:in `require'
28: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/activesupport-4.2.11/lib/active_support/dependencies.rb:240:in `load_dependency'
27: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/activesupport-4.2.11/lib/active_support/dependencies.rb:274:in `block in require'
26: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/skylight-core-3.1.2/lib/skylight/core/probes.rb:119:in `require'
25: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:29:in `require'
24: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:20:in `require_with_bootsnap_lfi'
23: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/loaded_features_index.rb:65:in `register'
22: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:21:in `block in require_with_bootsnap_lfi'
21: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:21:in `require'
20: from /Users/me/Development/cntral/config/environment.rb:5:in `<main>'
19: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/railties-4.2.11/lib/rails/railtie.rb:194:in `method_missing'
18: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/railties-4.2.11/lib/rails/railtie.rb:194:in `public_send'
17: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/railties-4.2.11/lib/rails/application.rb:352:in `initialize!'
16: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/railties-4.2.11/lib/rails/initializable.rb:54:in `run_initializers'
15: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/2.5.0/tsort.rb:205:in `tsort_each'
14: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/2.5.0/tsort.rb:226:in `tsort_each'
13: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/2.5.0/tsort.rb:347:in `each_strongly_connected_component'
12: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/2.5.0/tsort.rb:347:in `call'
11: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/2.5.0/tsort.rb:347:in `each'
10: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/2.5.0/tsort.rb:349:in `block in each_strongly_connected_component'
9: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/2.5.0/tsort.rb:431:in `each_strongly_connected_component_from'
8: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/2.5.0/tsort.rb:350:in `block (2 levels) in each_strongly_connected_component'
7: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/2.5.0/tsort.rb:228:in `block in tsort_each'
6: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/railties-4.2.11/lib/rails/initializable.rb:55:in `block in run_initializers'
5: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/railties-4.2.11/lib/rails/initializable.rb:30:in `run'
4: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/railties-4.2.11/lib/rails/initializable.rb:30:in `instance_exec'
3: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/active_record_slave-1.4.0/lib/active_record_slave/railtie.rb:21:in `block in <class:Railtie>'
2: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/active_record_slave-1.4.0/lib/active_record_slave/active_record_slave.rb:24:in `install!'
1: from /Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/activerecord-4.2.11/lib/active_record/connection_handling.rb:50:in `establish_connection'
/Users/me/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/activerecord-4.2.11/lib/active_record/connection_adapters/connection_specification.rb:171:in `spec': database configuration does not specify adapter (ActiveRecord::AdapterNotSpecified)
The current state of Active Record Slave (e.g. whether we should be reading from master or the slave) is transferred from one thread to another when a new thread is created. For example, in a multi-threaded Rails server where only one thread runs the initializer code, all the child threads should behave as the initializer specifies.
I found this limitation in Sidekiq, and I suspect #19 is related, however the behaviour can be seen in a plain irb session. Specifically, the Active Record Slave state is thread local:
[1] pry(main)> ActiveRecordSlave.read_from_master!
=> :master
[2] pry(main)> puts "In main thread: #{Thread.current.thread_variable_get(:active_record_slave).inspect}"
In main thread: :master
=> nil
[3] pry(main)> Thread.new { puts "In child thread: #{Thread.current.thread_variable_get(:active_record_slave).inspect}" }.join
In child thread: nil
As this is a fairly fundamental design decision, I don't know if there's going to be a solution here… Do you have any suggestions for how we can use Active Record Slave with e.g. Puma and Sidekiq?
Using this gem alongside with https://github.com/zdennis/activerecord-import/
When calling
Model.import(some_data)
Got the following error
ActiveRecord::StatementInvalid: PG::ReadOnlySqlTransaction: ERROR: cannot execute INSERT in a read-only transaction
Current workaround is to wrap the command with ActiveRecordSlave.read_from_master
but ideally should just work out of the box
Ruby Version:
Active Record Slave Version: 1.4.0
Rails: 5.2
Puma 3.12.0
The following command should create the database.
bundle exec rake db:create
Instead it errors out. It looks to be that the initializer is being called before the database is created.
Joshs-MacBook-Pro-3:my-proj jchappelle$ RAILS_ENV=test bundle exec rake db:create --trace > slave_error.txt
** Invoke db:create (first_time)
** Invoke db:load_config (first_time)
** Invoke environment (first_time)
** Execute environment
rake aborted!
ActiveRecord::NoDatabaseError: FATAL: database "my-proj_test" does not exist
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activerecord-5.2.0/lib/active_record/connection_adapters/postgresql_adapter.rb:688:in `rescue in connect'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activerecord-5.2.0/lib/active_record/connection_adapters/postgresql_adapter.rb:684:in `connect'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activerecord-5.2.0/lib/active_record/connection_adapters/postgresql_adapter.rb:215:in `initialize'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activerecord-5.2.0/lib/active_record/connection_adapters/postgresql_adapter.rb:40:in `new'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activerecord-5.2.0/lib/active_record/connection_adapters/postgresql_adapter.rb:40:in `postgresql_connection'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activerecord-5.2.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:809:in `new_connection'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activerecord-5.2.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:853:in `checkout_new_connection'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activerecord-5.2.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:832:in `try_to_checkout_new_connection'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activerecord-5.2.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:793:in `acquire_connection'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activerecord-5.2.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:521:in `checkout'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activerecord-5.2.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:380:in `connection'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activerecord-5.2.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:1008:in `retrieve_connection'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activerecord-5.2.0/lib/active_record/connection_handling.rb:118:in `retrieve_connection'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activerecord-5.2.0/lib/active_record/connection_handling.rb:90:in `connection'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/active_record_slave-1.4.0/lib/active_record_slave/active_record_slave.rb:17:in `install!'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/active_record_slave-1.4.0/lib/active_record_slave/railtie.rb:21:in `block in <class:Railtie>'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/railties-5.2.0/lib/rails/initializable.rb:32:in `instance_exec'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/railties-5.2.0/lib/rails/initializable.rb:32:in `run'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/railties-5.2.0/lib/rails/initializable.rb:61:in `block in run_initializers'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/2.4.0/tsort.rb:228:in `block in tsort_each'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/2.4.0/tsort.rb:350:in `block (2 levels) in each_strongly_connected_component'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/2.4.0/tsort.rb:431:in `each_strongly_connected_component_from'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/2.4.0/tsort.rb:349:in `block in each_strongly_connected_component'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/2.4.0/tsort.rb:347:in `each'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/2.4.0/tsort.rb:347:in `call'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/2.4.0/tsort.rb:347:in `each_strongly_connected_component'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/2.4.0/tsort.rb:226:in `tsort_each'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/2.4.0/tsort.rb:205:in `tsort_each'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/railties-5.2.0/lib/rails/initializable.rb:60:in `run_initializers'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/railties-5.2.0/lib/rails/application.rb:361:in `initialize!'
/Users/jchappelle/Code/my-proj/config/environment.rb:5:in `<main>'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bootsnap-1.3.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:21:in `require'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bootsnap-1.3.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:21:in `block in require_with_bootsnap_lfi'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bootsnap-1.3.1/lib/bootsnap/load_path_cache/loaded_features_index.rb:65:in `register'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bootsnap-1.3.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:20:in `require_with_bootsnap_lfi'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bootsnap-1.3.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:29:in `require'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activesupport-5.2.0/lib/active_support/dependencies.rb:283:in `block in require'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activesupport-5.2.0/lib/active_support/dependencies.rb:249:in `load_dependency'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activesupport-5.2.0/lib/active_support/dependencies.rb:283:in `require'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/railties-5.2.0/lib/rails/application.rb:337:in `require_environment!'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/railties-5.2.0/lib/rails/application.rb:520:in `block in run_tasks_blocks'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/task.rb:271:in `block in execute'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/task.rb:271:in `each'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/task.rb:271:in `execute'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/task.rb:213:in `block in invoke_with_call_chain'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/2.4.0/monitor.rb:214:in `mon_synchronize'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/task.rb:193:in `invoke_with_call_chain'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/task.rb:237:in `block in invoke_prerequisites'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/task.rb:235:in `each'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/task.rb:235:in `invoke_prerequisites'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/task.rb:212:in `block in invoke_with_call_chain'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/2.4.0/monitor.rb:214:in `mon_synchronize'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/task.rb:193:in `invoke_with_call_chain'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/task.rb:237:in `block in invoke_prerequisites'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/task.rb:235:in `each'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/task.rb:235:in `invoke_prerequisites'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/task.rb:212:in `block in invoke_with_call_chain'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/2.4.0/monitor.rb:214:in `mon_synchronize'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/task.rb:193:in `invoke_with_call_chain'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/task.rb:182:in `invoke'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/application.rb:160:in `invoke_task'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/application.rb:116:in `block (2 levels) in top_level'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/application.rb:116:in `each'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/application.rb:116:in `block in top_level'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/application.rb:125:in `run_with_threads'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/application.rb:110:in `top_level'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/application.rb:83:in `block in run'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/application.rb:186:in `standard_exception_handling'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/lib/rake/application.rb:80:in `run'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/rake-12.3.1/exe/rake:27:in `<top (required)>'
/Users/jchappelle/.rbenv/versions/2.4.2/bin/rake:23:in `load'
/Users/jchappelle/.rbenv/versions/2.4.2/bin/rake:23:in `<top (required)>'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bundler-1.16.1/lib/bundler/cli/exec.rb:75:in `load'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bundler-1.16.1/lib/bundler/cli/exec.rb:75:in `kernel_load'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bundler-1.16.1/lib/bundler/cli/exec.rb:28:in `run'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bundler-1.16.1/lib/bundler/cli.rb:424:in `exec'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bundler-1.16.1/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bundler-1.16.1/lib/bundler/vendor/thor/lib/thor/invocation.rb:126:in `invoke_command'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bundler-1.16.1/lib/bundler/vendor/thor/lib/thor.rb:387:in `dispatch'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bundler-1.16.1/lib/bundler/cli.rb:27:in `dispatch'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bundler-1.16.1/lib/bundler/vendor/thor/lib/thor/base.rb:466:in `start'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bundler-1.16.1/lib/bundler/cli.rb:18:in `start'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bundler-1.16.1/exe/bundle:30:in `block in <top (required)>'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bundler-1.16.1/lib/bundler/friendly_errors.rb:122:in `with_friendly_errors'
/Users/jchappelle/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bundler-1.16.1/exe/bundle:22:in `<top (required)>'
/Users/jchappelle/.rbenv/versions/2.4.2/bin/bundle:23:in `load'
/Users/jchappelle/.rbenv/versions/2.4.2/bin/bundle:23:in `<main>'
The Master/Slave terminology used by this gem is unnecessarily harsh, as well as insensitive to the human suffering brought about by slavery throughout the world (past and present). I think we can do better. 🙂
Would you be open to renaming the gem using different, less brutal terms? Perhaps Primary/Replica, or Primary/Reader, etc.?
I'm happy to submit a PR and help in any other way.
Here's a fork exploring the idea: https://github.com/jbarrieault/active_record_reader
Not having been the one to invent the verbiage is not a good reason to perpetuate it.
The readme refers to the slave database in plural form in many places, but looking at the code and example it seems it only supports one slave.
Does this currently support multiple slaves?
Hi,
Using this with https://github.com/afair/postgresql_cursor makes it hit master.
@reidmorrison, any idea for a fix?
Hello,
I'm seeing errors like the following occasionally:
ActiveRecord::StatementInvalid: Mysql2::Error: The MySQL server is running with the --read-only option so it cannot execute this statement: INSERT INTO ...
When calling update_attributes
on a Rails 3 app the following is raised when running an environment without a slave defined:
/root/.rbenv/versions/2.2.7/lib/ruby/gems/2.2.0/gems/active_record_slave-1.3.0/lib/active_record_slave/active_record_slave.rb:20:in `install!': undefined method `[]' for nil:NilClass (NoMethodError)
from /root/.rbenv/versions/2.2.7/lib/ruby/gems/2.2.0/gems/active_record_slave-1.3.0/lib/active_record_slave/railtie.rb:21:in `block in <class:Railtie>'
Consider there is a model like this:
class DifferentStorage::Base < ActiveRecord::Base
establish_connection(YAML.load(File.read('config/database.yml')))["different_storage_#{Rails.env}"])
self.abstract_class = true
end
I expect that read queries for that model will be executed against different database (not master or slave). As well as for all child models.
Read queries for that model are executed on slave database, which does not contain these models.
Update/delete queries are executed against right database, which constains these models.
Do you have a plan to support models which are stored in different database?
Hello, everyone,
Sorry for not following the format but this is a simple question that doesn't really fit into it.
Basically, what happens if one of the slave databases is unreachable for any reason? It will surely not fallback to another slave since you can only have one slave per instance, but would it fallback to master?
I think this information should be added to README.md
.
LMK, thank you
Sorry if I created an issue for something that might not be one.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.