7

Mam aplikację Rails z bazą Postgres pod AWS RDS z architekturą multi-az. Architektura HA używana przez RDS to master/slave i zapewniają one usługę z jednym punktem końcowym, który wskazuje bieżący wzorzec.Rails Ponowne połączenie PostgreSQL po przełączeniu awaryjnym dla RDS

Ilekroć nastąpi przełączenie awaryjne bazy danych, Active Record będzie nadal próbował połączyć się z tym samym serwerem, zamiast ponawiać próbę połączenia w celu pobrania nowego adresu IP dla wzorca.

Czy istnieje sposób na utworzenie "globalnego" systemu ratunkowego dla błędu ActiveRecord::StatementInvalid: PG::ConnectionBad: PQsocket() can't get socket descriptor, który po prostu uruchamia ActiveRecord::Base.connection_pool.disconnect!, który spowoduje, że następne zapytanie zadziała?

Odpowiedz

2

Udało mi się przywrócić aktywny rekord po zdarzeniu awaryjnym, stosując łatkę małpy do postgres_adapter.

lib/core_ext/active_record/postgresql_adapter.rb:

require 'active_record/connection_adapters/postgresql_adapter' 

class ActiveRecord::ConnectionAdapters::PostgreSQLAdapter 
    private 
    def exec_no_cache(sql, name, binds) 
    log(sql, name, binds) { @connection.async_exec(sql, []) } 
    rescue ActiveRecord::StatementInvalid => e 
    if e.to_s.include?('PG::ConnectionBad') 
     ActiveRecord::Base.connection_pool.disconnect! 
    end 
    raise e 
    end 
end