7

Ho un'applicazione Rails con un database Postgres in AWS RDS con architettura multi-az. L'architettura HA utilizzata da RDS è master/slave e fornisce il servizio con un singolo endpoint che punta al master corrente.Rails Riconnessione Postgres su failover per RDS

Ogni volta che si verifica un failover del database, Active Record continuerà a provare a connettersi allo stesso server, invece di riprovare la connessione per prelevare il nuovo IP per il master.

C'è un modo per creare un salvataggio "globale" per l'errore ActiveRecord::StatementInvalid: PG::ConnectionBad: PQsocket() can't get socket descriptor che esegue semplicemente ActiveRecord::Base.connection_pool.disconnect! che renderà la prossima query di lavoro?

risposta

2

Sono riuscito a effettuare la riconnessione di Active Record dopo l'evento di failover applicando una patch di scimmia a 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