如何确定 pgbouncer 的 max_client_conn

how to determine max_client_conn for pgbouncer

我有点像 "accidental dba",所以很抱歉在这里提出一个真正的菜鸟问题。我在 pool_mode = transaction 模式下使用 pgbouncer。昨天我的 php 日志开始出现错误:

no more connections allowed (max_client_conn)

max_client_conn = 150 匹配 max_connections 在我的 postgresql.conf.

所以我的第一个问题是,pgbouncer max_client_conn 应该设置为等于 postgresql max_connections,还是我完全误解了这种关系?

我在 pgbouncer 后面的单个 postgres 实例上有 20 个数据库,默认 default_pool_size = 20。那么 max_client_conn 应该是 400 吗? (pool_size * number_of_databases)?

谢谢

https://pgbouncer.github.io/config.html

max_client_conn Maximum number of client connections allowed.

default_pool_size How many server connections to allow per user/database pair.

所以 max_client_conn 应该比 postgres max_connections 大得多,否则你为什么要使用连接池?..

如果你有20个数据库,设置default_pool_size为20,你将允许pgbouncer打开400个连接到db,所以你需要调整posgtres.conf max_connections为400并设置pgbouncer max_client_conn 到 4000(每个实际数据库连接在池中平均有 10 个连接)

这个答案只是为了提供一个理解设置的例子,而不是一个字面上遵循的陈述。 (例如,我刚刚看到一个配置:

max_client_conn = 10000
default_pool_size = 100
max_db_connections = 100
max_user_connections = 100

对于具有两个数据库的集群和 max_connections 设置为 100)。这里的逻辑是不同的,还需要注意 max_db_connections 设置,实际上连接限制是在 pgbouncer [数据库] 部分中为每个数据库单独设置的。

所以 - 使用小设置来了解配置如何相互影响 - 这是 "how to determine max_client_conn for pgbouncer" 最好的

与几乎所有人一样,您将池大小设置得过高。 不要让你的 postgresql 服务器做连接池。如果你这样做,那么它会严重损害你的表现。

与 postgresql 的并发连接数的最佳设置是

connections = ((core_count * 2) + effective_spindle_count)

这意味着,如果您的数据库 运行 位于 2 核服务器上,那么 pgbouncer 的总池大小不应超过 5。Pgbouncer 在处理池方面比 postgresql 好得多,所以让它那样做。

因此,将我的 postgresql.conf 中的 max_connections 保留为默认值 100(没有理由更改,因为它是最大值。此外,这应该始终高于您的应用程序需要的一些日志记录,管理和备份进程也需要连接)

并在您的 pgbouncer.ini 文件中设置

max_db_connections=5
default_pool_size=5
max_client_conn=400

更多信息https://www.percona.com/blog/2018/06/27/scaling-postgresql-with-pgbouncer-you-may-need-a-connection-pooler-sooner-than-you-expect/