我有带有以下配置的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
我试着分享一点我所知道的,如果有什么不清楚的地方,或者如果提到不正确的地方,我可以随意询问。