pgbouncer.ini和postgresql.conf的参数是否正确



我有带有以下配置的pgbouncer.ini文件

[databases]
test_db = host=localhost port=5432 dbname=test_db 
[pgbouncer]
logfile = /var/log/postgresql/pgbouncer.log
pidfile = /var/run/postgresql/pgbouncer.pid
listen_addr = 0.0.0.0
listen_port = 5433
unix_socket_dir = /var/run/postgresql 
auth_type = md5
auth_file = /etc/pgbouncer/userlist.txt
admin_users = postgres
#pool_mode = transaction
pool_mode = session
server_reset_query = RESET ALL; 
ignore_startup_parameters = extra_float_digits
max_client_conn = 25000
autodb_idle_timeout = 3600
default_pool_size = 250
max_db_connections = 250
max_user_connections = 250

我在postgresql.conf文件中有

max_connections = 2000

它对演出有不良影响吗?因为我的postgresql.conf中的max_connections?或者它没有任何意义,并且已经由pgbouncer处理了连接?

还有一个问题。在pgpupper配置中,listen_addr=0.0.0.0正确吗?或者应该是listen_addr=*?

将PgBouncer上的default_pool_size设置为等于此服务器上可用的CPU核数更好吗?

是否将所有default_pool_size、max_db_connections和max_user_connections设置为相同的值?

因此,使用pgbouncer的想法是在PG本身无法承受更高数量的max_connections时对连接进行池化。注意:请不要像那样将max_connections设置为2000之类的数字。

让我们从一个例子开始,如果你的连接限制为20,然后你的应用程序或组织希望在给定的时间有1000个连接,这就是pooler的作用所在,在这种特定的情况下,你希望这20个连接汇集来自应用程序的1000个连接。

为了了解它的实际工作原理,让我们后退一步,了解当你没有连接池,只依赖PG配置设置来获得最大连接时会发生什么,在我们的情况下是20。

因此,当连接来自客户端\应用程序等时,postgresql的主进程(PID,即父ID(会为其生成一个子进程。因此,每个新连接都会在主postgres进程下产生一个子进程,如下所示:

PID USER      PR NI VIRT RES  SHR S %CPU %MEM TIME+  COMMAND             
24379 postgres  20 0 346m 148m 122m R 61.7  7.4 0:46.36 postgres: sysbench sysbench ::1(40120) 
24381 postgres  20 0 346m 143m 119m R 62.7  7.1 0:46.14 postgres: sysbench sysbench ::1(40124) 
24380 postgres  20 0 338m 137m 121m R 57.7  6.8 0:46.04 postgres: sysbench sysbench ::1(40122) 
24382 postgres  20 0 338m 129m 115m R 57.4  6.5 0:46.09 postgres: sysbench sysbench ::1(40126)

因此,现在一旦发送了连接请求,它就会被POSTMATER进程接收,并在主父进程下创建OS级别的子进程。这个连接的寿命是"无限的",除非被应用程序关闭,或者您在postgresql中为空闲连接设置了超时。

现在出现的情况是,如果与给定计算的连接超过一定的限制,那么管理连接可能是一件非常昂贵的事情。这意味着n个连接在提供服务时具有给定的计算成本,并且在一段时间后,操作系统将无法处理具有巨大连接的情况,进而会导致不同计算级别(即内存、CPU、i/O(的争用。

如果您可以使用当前派生的子进程(后端((如果它们不做任何工作(,该怎么办。您将节省获取子进程(后端(的时间以及额外的成本(有时可能会有所不同(。这就是始终打开的连接池的作用所在,帮助服务不同的客户端请求,也称为池。

因此,现在基本上只有n个连接可用,但pooler可以管理n+i个连接来为客户端请求提供服务。

这是pg保镖帮助重用连接的地方。它可以配置3种池,即会话池、语句池和事务池。基本上,一旦连接完成,bouncer就会将连接返回到池,语句级工作或事务级工作等。只有在会话池期间,它才会保持连接,除非断开连接。

因此,基本上降低了PG conf文件级别的连接数量,并调整了bounder.ini中的所有设置

回答第二部分:

还有一个问题。在pgpupper配置中,listen_addr=0.0.0.0正确吗?或者应该是listen_addr=*

这取决于您是否有独立部署、服务器等。基本上,如果它在服务器本身上,并且您希望它允许来自任何地方的连接(传入(,则使用"*"如果您希望仅允许本地网络使用"127.0.0.0".

对于您的其他问题,请查看此链接:pgbouncer docs

我试着分享一点我所知道的,如果有什么不清楚的地方,或者如果提到不正确的地方,我可以随意询问。

最新更新