【问题标题】:What's the difference between ORM/query builder library connection pool size and pgbouncer connection pool size?ORM/查询构建器库连接池大小和 pgbouncer 连接池大小有什么区别?
【发布时间】:2020-11-25 12:09:12
【问题描述】:

我对 pgbouncer 池大小配置和 ORM(如 sequelize.js)、查询构建器(如 knex.js)库池大小配置感到困惑。这样的架构:

应用程序代码 => pgbouncer => postgresql

pgbouncer.ini:

;; ...
;; Default pool size.  20 is good number when transaction pooling
;; is in use, in session pooling it needs to be the number of
;; max clients you want to handle at any moment
;default_pool_size = 20
;; ...

sequelize 连接池配置:

const sequelize = new Sequelize(/* ... */, {
  // ...
  pool: {
    max: 5,
    min: 0,
    acquire: 30000,
    idle: 10000
  }
});

knex.js 连接池配置:

var knex = require('knex')({
  client: 'mysql',
  connection: {
    host : '127.0.0.1',
    user : 'your_database_user',
    password : 'your_database_password',
    database : 'myapp_test'
  },
  pool: { min: 0, max: 7 }
});

如果我同时使用 sequelize.js 连接池配置和 pgbouncer 连接池大小配置会发生什么?数据库服务器使用哪种配置?我应该只使用其中之一吗?谢谢。

【问题讨论】:

    标签: postgresql orm sequelize.js knex.js pgbouncer


    【解决方案1】:

    将连接池以菊花链方式连接在一起很少有意义。因此,除了内置的之外,使用 pgbouncer 可能没有意义。数据库服务器不知道您的连接池,除非池管理器向数据库发送自己的显式命令,并且它有自己使用的配置文件 (postgresql.conf)。

    【讨论】:

      【解决方案2】:

      如果您有例如 3 个运行 knex 或 sequelize 的应用程序进程,那么您应该将 pgbouncer poolsize 设置为单个 knex / sequelize 池使用的 3 倍。

      那么你还需要确保 postgres 服务器也配置了足够的连接来处理 pgbouncer 连接。

      尽管正如@jjanes 所说。没有理由将 pgbouncer 与 knex / sequelize 一起使用,因为它们已经提供了池化。我想 pgbouncer 应该与不支持池的框架一起使用。例如,如果 PHP 或 cgi stript 在每次页面加载时重新初始化并调用数据库。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-13
        • 2015-12-19
        • 2018-02-18
        • 1970-01-01
        • 1970-01-01
        • 2019-03-10
        • 2021-11-09
        • 2012-07-06
        相关资源
        最近更新 更多