【发布时间】:2020-01-05 15:33:03
【问题描述】:
我正在寻找更详细的指导/其他人使用 Pgbouncer 在生产中使用 Npgsql 的经验。
基本上我们使用 GKE 和 Google Cloud SQL 进行以下设置:
现在 - 我已经使用本地连接池配置了 npgsql,就好像 pgbouncer 没有到位一样。我已经在我的 GKE 集群中添加了 pgbouncer 作为部署,因为 Google SQL 的最大连接限制非常低 - 为了能够在 Kubernetes 内水平扩展我的应用程序,我需要防止它被压倒。
当一个 pgbouncer pod 死掉时(由于节点故障或我正在扩大/缩小规模),我的问题是可靠性之一。
发生这种情况时 (1) 来自应用程序 pod 中客户端连接池的所有现有打开连接不会立即关闭 (2) - 并且基本上会导致我的应用程序在尝试执行命令时出现异常。不理想!
在我看来(并查看https://www.npgsql.org/doc/compatibility.html 的建议)我有三个选择。
接受它,并在我的应用程序中处理 SQL 命令的重试。 可能,但如果我弄错了,似乎需要付出很多努力,并且会产生很多可能的错误。 p>
打开 keep alives 并让 npgsql 本身在坏连接失败时相对快速地“失败”。我什至不确定这是否可行,或者是否会导致进一步问题。
完全关闭客户端连接池。这似乎是官方的建议,但出于性能原因我不愿意这样做,Npgsql 必须打开似乎非常浪费每个会话与 pgbouncer 的连接 - 与我使用 SQL Server 等其他 RDBMS 的所有经验背道而驰。
我是否在这些选项之一的正确轨道上?还是我错过了什么?
【问题讨论】:
标签: postgresql asp.net-core kubernetes npgsql pgbouncer