Rails RDS 故障转移时 Postgres 重新连接

Rails Postgres reconnection on failover for RDS

我有一个 Rails 应用程序,它在具有多 az 架构的 AWS RDS 下带有 Postgres 数据库。 RDS 使用的 HA 架构是 master/slave 并且它们提供的服务具有指向当前主节点的单个端点。

每当发生数据库故障转移时,Active Record 将继续尝试连接到同一台服务器,而不是重试连接以便为主服务器获取新 IP。

有没有办法为 ActiveRecord::StatementInvalid: PG::ConnectionBad: PQsocket() can't get socket descriptor 错误创建 "global" 救援,只需运行 ActiveRecord::Base.connection_pool.disconnect! 即可使下一个查询正常工作?

通过对 postgres_adapter 应用猴子补丁,我能够在故障转移事件后重新连接 Active Record。

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