16

我有点像“意外的 dba”,所以在这里为一个真正的菜鸟问题道歉。我在pool_mode = transaction模式下使用 pgbouncer。昨天我开始在我的 php 日志中收到错误:

不允许更多连接 (max_client_conn)

我有max_client_conn = 150 来匹配我的 postgresql.conf 中的max_connections

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

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

谢谢

4

2 回答 2

22

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

max_client_conn允许的最大客户端连接数。

default_pool_size每个用户/数据库对允许的服务器连接数。

所以 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 [database] 部分中为每个数据库单独设置的。

所以 - 使用小设置来了解配置如何相互影响 - 这是“如何确定 pgbouncer 的 max_client_conn”最好的

于 2017-09-13T14:41:37.877 回答
4

像几乎每个人一样,然后您将池大小设置为高。不要让你的 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/

于 2019-05-21T15:06:21.817 回答