7

私はマルチアズアーキテクチャのAWS RDSでPostgresデータベースを持つRailsアプリケーションを持っています。 RDSで使用されるHAアーキテクチャはマスタ/スレーブであり、現在のマスタを指す単一のエンドポイントを持つサービスを提供します。Rails RDSのフェイルオーバ時のPostgres再接続

データベースのフェイルオーバーが発生すると、Active Recordは接続を再試行するのではなく、同じサーバーに接続しようとしますが、マスターの新しいIPを取得します。

ActiveRecord::Base.connection_pool.disconnect!を実行するだけでActiveRecord::StatementInvalid: PG::ConnectionBad: PQsocket() can't get socket descriptorエラーの「グローバル」レスキューを作成する方法はありますか?

答えて

2

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