在 Rails 中禁用连接池以使用 PgBouncer

dsm*_*rey 3 postgresql ruby-on-rails pgbouncer

我们有一个 Ruby on Rails 4.2.8 项目,可以访问大型 PostgreSQL 数据库。我们将使用 PgBouncer 添加一个新的连接池服务器。

由于 PgBouncer 将处理数据库连接池,我们是否需要关闭 Rails 自动连接池?我们的database.yml 中没有配置任何内容,因此我认为正在使用默认值(池)5。

  1. 添加 PgBouncer 是否意味着我们应该关闭 Rails 连接池?
  2. 如果是这样,它是如何工作的,我们是否只需在database.yml中将Pool设置为0?

谢谢

jva*_*ans 7

太长了;不要改变任何东西

Rails 中的池化与 PGBouncer 中的池化不同。Rails 连接池是该进程中任何线程可用的一组连接,通常只有 1 个。rails 池中的每个连接都将有一个到 postgres 数据库或 PGBouncer(如果它位于 postgres 前面)的连接。在大型 Rails 应用程序中,您将在每台服务器以及负载均衡器后面的多台服务器上运行多个 Rails 进程。像这样的东西:

池化架构

如果没有 PGBouncer,每个与 postgres 的连接都会创建一个新的 postgres 进程。在规模上,您需要限制运行的 postgres 进程的数量,这样就不会耗尽 CPU 和内存。PGBouncer 汇集所有进程和所有服务器上所有 Rails 池的连接,并在它们之间高效切换。

  • 有充分的理由禁用连接池,rails 5 不能很好地与 pgbouncer 事务池配合使用,并且 Rails 中的连接池使用的长期连接不能与 pgbouncer 会话池配合良好工作,因为在会话池中 1 个客户端连接映射到 1 个服务器连接。因此,如果不禁用 Rails 连接池来获取短暂的连接,则 Rails 中的线程数不能多于我的 postgres 数据库的连接数。 (3认同)