我在 Spring Boot (1.5.1.RELEASE) 中有一个使用 Postgres DB (9.1-901-1) 的项目。
当我在生产中运行这个应用程序时,它会在数据库中创建多达 100 个空闲连接。
所以我覆盖了默认配置来控制创建“N”个空闲连接。请检查以下配置:
datasource:
driverClassName: org.postgresql.Driver
url: jdbc:postgresql://localhost:5432/db_name
username: root
password: root
tomcat:
# default value is 100 but postgres' default is 100 as well. To prevent "PSQLException: FATAL: sorry, too many
# clients already", we decrease the max-active value here. Which should be sufficient, by the way
max-active: 10
max-idle: 10
min-idle: 5
max-wait: 30000
time-between-eviction-runs-millis: 5000
min-evictable-idle-time-millis: 60000
jmx-enabled: true
Run Code Online (Sandbox Code Playgroud)
现在它创建了 5 个与 DB 的空闲连接。
我正在通过执行以下查询来验证这一点。
select * …Run Code Online (Sandbox Code Playgroud) 我试图找到可用于 Postgres DB 的不同中间件。每个人都在推荐 PgBouncer 和 PgPool II。我可以使用的其他中间件列表是什么。
我们有一个 Ruby on Rails 4.2.8 项目,可以访问大型 PostgreSQL 数据库。我们将使用 PgBouncer 添加一个新的连接池服务器。
由于 PgBouncer 将处理数据库连接池,我们是否需要关闭 Rails 自动连接池?我们的database.yml 中没有配置任何内容,因此我认为正在使用默认值(池)5。
谢谢
最近在 DigitalOcean 有机会创建数据库。这有点像基于通常的 Droplet 的交钥匙解决方案,带有一堆附加的数据库功能。
这些附加功能之一 - 连接池。据我了解,这是一个 PgBouncer。
如果我以通常的方式(直接)将数据库连接到 Rails 5.2 应用程序,那么一切都很好。
但是如果我通过“连接池”使用连接,我会得到一个错误:
ActiveRecord::StatementInvalid: PG::DuplicatePstatement: 错误: 准备好的语句“a1”已经存在
当从数据库接收到任何数据时,就会发生这种情况。
请告诉我,如何使它全部工作?
我正在寻找更详细的指导/其他人在 Pgbouncer 的生产中使用 Npgsql 的经验。
基本上,我们使用 GKE 和 Google Cloud SQL 进行了以下设置:
现在 - 我已经使用本地连接池配置了 npgsql,就好像 pgbouncer 没有就位一样。我已将 pgbouncer 添加为我的 GKE 集群中的部署,因为 Google SQL 的最大连接限制非常低 - 并且为了能够在 Kubernetes 内水平扩展我的应用程序,我需要防止其不堪重负。
我的问题之一是当其中一个 pgbouncer pod 死亡时(由于节点故障或当我向上/向下扩展时),可靠性问题之一。
发生这种情况时 (1) 应用程序 pod 中客户端连接池中的所有现有打开连接不会立即关闭 (2) - 并且基本上会导致我的应用程序在尝试执行命令时出现异常。不理想!
据我所知(并查看 中的建议https://www.npgsql.org/doc/compatibility.html),我有三个选择。
接受它,并在我的应用程序中处理 SQL 命令的重试。可能,但似乎需要付出很大的努力,如果我弄错了,就会产生很多可能的错误。
打开 keepalives 并让 npgsql 本身在坏连接失败时相对较快地“失败”。我什至不确定这是否有效或者是否会导致进一步的问题。
完全关闭客户端连接池。这似乎是官方建议,但出于性能原因我不愿意这样做,对于 Npgsql 来说,必须为每个会话打开到 pgbouncer 的连接似乎非常浪费 - 并且与我使用其他 RDBMS(如 SQL)的所有经验背道而驰服务器。
我的这些选择之一是否走在正确的轨道上?或者我错过了什么?
我有一个专用的 PostgreSQL 服务器和一个 pgBouncer 服务器。所有连接都是通过 pgBouncer 建立的。我使用 Apache JMeter 和 PHP 测试了系统。结果很奇怪。500 个连接的吞吐量还不错,但当我使用更多连接进行测试时,吞吐量会下降。
[databases]
maindb = host=212.212.322.323 port=5432 user=myuser dbname=mydb pool_size=1000 pool_mode=transaction
[pgbouncer]
logfile = /var/log/postgresql/pgbouncer.log
pidfile = /var/run/postgresql/pgbouncer.pid
listen_addr = *
listen_port = 6432
auth_type = trust
auth_file = /etc/pgbouncer/userlist.txt
pool_mode = session
max_client_conn = 1000
default_pool_size = 20
Run Code Online (Sandbox Code Playgroud) 当我的网络用户突然飙升时,一些语句会无限期地开始排队,即使我设置的超时时间如下:
SET STATEMENT_TIMEOUT TO 5000; SELECT get_user_properties(12345);
Run Code Online (Sandbox Code Playgroud)
如果没有在函数体中设置,函数会忽略statement_timeout吗?
我正在使用postgresql 9.2和pg_bouncer与会话池.
Heroku最近减少了与生产数据库的可用连接数(从500到60).打开的连接消耗大量内存并导致问题,因此这似乎是朝着正确方向迈出的一步.
我的应用程序有超过100个并发进程,它们同时访问数据库.Heroku建议使用https://github.com/gregburek/heroku-buildpack-pgbouncer来解决此问题.
我无法找到关于如何做到这一点的适当指南.我能够安装并启用buildpack,但我不知道这些配置变量的作用以及它们如何工作.使用默认配置,我会遇到大量ActiveRecord::ConnectionTimeoutError错误.
有没有人有这方面的经验,如果可以请提供有关如何正确执行此操作以及如何配置需要配置的所有内容的分步指南?
在过去的几周里,我一直在调整和搞乱PostgreSQL,我将在下一个项目中使用它.
我的规格是:
我试过的事情:
Pgtune
PgBouncer&Pgpool(连接池和负载平衡)
调整php-fpm和nginx(worker_processes,worker_connections,pm.max_children等)
Linux文件句柄限制和套接字调整.
我正在测试它通过使用ApacheBench调用网页来插入.这是实用的吗?
ab -n 17500 -c 1750 -r http://example.com/insert.php
Run Code Online (Sandbox Code Playgroud)
到目前为止,我只能同时处理1700-2000连接而不丢弃任何事务(通常在nginx错误日志中过早关闭连接或资源暂时不可用或抱歉, PostgreSQL 已经返回太多客户端).
我为php-fpm尝试了TCP/IP和unix socket,而TCP/IP似乎比unix socket更具可扩展性.
PHP可以使用连接池吗?因为我从Web服务器调用数据库的方式仍然相同(对pgpool或pgbouncer进行了大量的单独连接).
我的目标是同时处理至少10,000个事务.决定因素是什么?它是web服务器与db(php-fpm)或PostgreSQL本身之间的瓶颈吗?通常,大公司(PHP Web应用程序)如何处理这样的卷?
我试图让 pgbouncer 在我的独立 postgresql 服务器上工作,但是当我尝试使用 pgbouncer 端口连接到数据库时,出现超时错误。
PostgreSQL: 9.1.8
pgBouncer:1.4.2
操作系统:Ubuntu 12.04.2 LTS (GNU/Linux 3.8.4-x86_64-linode31 x86_64)
这是我的 conf 文件:
[databases]
postgres = host=127.0.0.1 port=5432 dbname=postgres
mydb = host=127.0.0.1 port=5432 dbname=mydb
[pgbouncer]
logfile = /home/username/pg_log/pgbouncer.log
pidfile = /tmp/pgbouncer.pid
listen_addr = xxx.xxx.xxx.xxx
listen_port = 6432
unix_socket_dir = /var/run/postgresql
auth_type = md5
auth_file = /etc/pgbouncer/userlist.txt
admin_users = postgres
stats_users = stats, root
user = postgres
pool_mode = session
server_reset_query = DISCARD ALL
max_client_conn = 1000
default_pool_size = 20
log_connections = 1
log_disconnections = …Run Code Online (Sandbox Code Playgroud) 我尝试使用 pgBouncer 来消除短暂的网络断开连接。我做了一个测试,我有 Clinet->pgBouncer->Postgresql。当从客户端建立连接时,我断开网络电缆,如果我以比大约 15 秒更快的速度重新连接它,它仍然可以工作。如果没有,我就完全断开连接,并且 pgBouncer 记录:
db/user@server.address.com:5432 关闭,因为:服务器连接崩溃?db/user@127.0.0.1:49837 关闭,因为:服务器连接崩溃?db/user@127.0.0.1:49837 池错误:服务器连接崩溃?
我如何控制超时?
PS:在我的pglib客户端,连接字符串超时设置为 60 秒。
卢卡斯
据我了解,您可以在 Postgresql 中使用准备好的语句或连接池(使用 pgPool/pgBouncer 等工具),但同时只能从其中之一中受益(至少使用 .NET 的 Npgsql 驱动程序,加上库作者建议关闭客户端)使用 PgBouncer 时的侧连接池)。我对吗?
如果是这样 - 对于其他运行时和语言(例如 Java、Python、Go)也是如此吗?或者这是一个特定于实施的问题?
postgresql connection-pooling prepared-statement npgsql pgbouncer
我想在我的 postgres rds 中安装 pgbouncer,但我无法访问该实例,就像我们访问 ec2 实例一样。那么有没有一种方法可以让我通过 ssh 连接到机器(不是 psql,它工作正常)。
pgbouncer ×13
postgresql ×13
npgsql ×2
pgpool ×2
asp.net-core ×1
benchmarking ×1
database ×1
heroku ×1
kubernetes ×1
nginx ×1
rds ×1
sockets ×1
spring-boot ×1
throughput ×1
timeout ×1