Kubernetes 上的 Npgsql 和 Pgbouncer - 池化和 keepalives

2024-03-24

我正在寻找更详细的指导/其他人在 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)我有三个选择。

  1. 接受它,并在我的应用程序中处理 SQL 命令的重试。可能,但似乎需要付出很大的努力,如果我弄错了,就会产生很多可能的错误。

  2. 打开 keepalives 并让 npgsql 本身在坏连接失败时相对较快地“失败”。我什至不确定这是否有效或者是否会导致进一步的问题。

  3. 完全关闭客户端连接池。这似乎是官方建议,但出于性能原因我不愿意这样做,对于 Npgsql 来说,必须为每个会话打开到 pgbouncer 的连接似乎非常浪费 - 并且与我使用 SQL 等其他 RDBMS 的所有经验背道而驰服务器。

我的这些选择之一是否走在正确的轨道上?或者我错过了什么?


您通常走在正确的轨道上,并且您的分析似乎很准确。一些评论:

选项 2(关闭 keepalive)将有助于删除 Npgsql 池中已损坏的空闲连接。正如您所编写的,您的应用程序仍然会出现一些故障(因为一些不良的空闲连接可能无法及时删除)。没有特别的理由认为这会导致进一步的问题 - 这应该是非常安全的打开。

选项 3 对于性能来说确实是有问题的,因为每次需要数据库连接时都必须建立到 pgbouncer 的 TCP 连接。它也不会提供 100% 的防故障机制,因为 pgbouncer 在使用连接时仍然可能会丢失。

归根结底,您会询问面对任意网络/服务器故障时的弹性,这并不是一件容易实现的事情。处理此问题的唯一 100% 可靠方法是在您的应用程序中,通过专用层在发生瞬态异常时重试操作。您可能想看看Polly https://github.com/App-vNext/Polly,并注意 Npgsql 通过公开一个对我们有帮助的IsTransient http://www.npgsql.org/doc/api/Npgsql.NpgsqlException.html#Npgsql_NpgsqlException_IsTransient异常可以用作重试的触发器(Entity Framework Core 也包含类似的“重试策略”)。如果您确实走这条路,请注意,正确处理交易特别困难。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kubernetes 上的 Npgsql 和 Pgbouncer - 池化和 keepalives 的相关文章

  • Kubernetes 集群自动缩放器似乎不适用于 GKE?

    我定义了一个节点池 最小实例设置为 1 最大实例设置为 5 并启用了自动缩放 但它似乎并没有缩小规模 我已经封锁了一个节点 已经过去12个多小时了 没有待处理的 Pod 删除节点不会减少我自己的部署的副本数量 相关节点上运行以下 pod f
  • 如何在ubuntu中从源代码安装postgresql的AGE扩展? [关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 由于我想尝试一下 Apache Age of postgresql 所以在阅读文档时我迷失了方向 有什么简单的解决方案吗 这是有关如何
  • 有没有办法在 asp.net core 3.1 Rest-API 中使用 Identity Server 功能

    我正在使用 asp net core 3 1 在服务器中使用 Rest API 的项目 以 Angular 作为单页应用程序的前端 从每个客户端 用户需要提供其用户名和密码才能访问 Web API 的受保护部分 我想使用 Identity
  • 使用 Hibernate 映射数组

    你能帮我使用 Hibernate 映射这个类吗 public class MyClass private Long id private String name private int values 我使用的是 PostgreSQL 表中的
  • Django 全文搜索优化 - Postgres

    我正在尝试利用 Django v2 1 和 Postgres 9 5 创建一个地址自动完成功能的全文搜索 但性能目前不适合自动完成 我不明白逻辑我得到的绩效结果背后 就信息而言 该表相当大 有 1400 万行 我的型号 from djang
  • Asp net Core 获取用户Windows用户名

    在ASP net CORE mvc中构建内联网 我需要获取当前用户的Windows用户名进行登录 我不需要使用Windows身份验证自动登录用户 我已经有一个自定义登录控制器来做到这一点 我只需要他的用户名 它在本地工作正常 但在 IIS
  • 在 Postgres 中以周为单位分割间隔

    这是另一个关于日期的 SQL 问题 我正在使用 PHP 和 Postgres 构建一个日历应用程序 它将显示几天 几周甚至几个月的事件 每个事件都有开始日期和结束日期 按范围选择它们不是问题 然而 如果 Postgres 可以在每周的第一天
  • 如何为容器设置正确的 cpu 毫核?

    我想要优化配置 CPU 核心 而不会分配过多或不足 如何测量给定容器所需的 CPU 毫核 它还带来了一个问题 即代理将根据 CPU 消耗将多少流量发送到任何给定的 Pod 以便我们可以最佳地使用计算 目前我发送请求并进行监控 kubectl
  • ASP.NET 5 OAuth 不记名令牌身份验证

    我正在尝试在 ASP NET 5 中实现 OAuth 不记名令牌身份验证 并且很难找到如何执行此操作的示例 因为 OWIN 内容在 ASP NET 5 中已发生变化 例如IApplicationBuilder UseOAuthAuthori
  • PostgreSQL 触发器不返回任何内容

    我在创建时有一个 PostgreSQL 触发器 它基本上将插入重定向到子表中 插入记录后 我想中止请求以避免重复数据 据我所知 执行此操作的唯一方法是返回NULL在触发器中 问题是我需要返回记录才能获取 ID 如果我回来NULL 我得到 N
  • 如何在 ASP.NET Core 中转换 AppSettings

    我被引导相信appsettings json及其环境对应项 开发 登台 生产 取代了 Web config 转换 这在开发环境中工作得很好 这些环境的变量存在于launchSettings json 但是 如果我使用发布功能 将发布配置为使
  • 通过 AWS ALB 的 HTTP2 PING 帧(gRPC keepalive ping)

    我正在使用 AWS Application Load Balancer ALB 公开 ASP NET Core gRPC 服务 这些服务在 Fargate 容器中运行并公开不安全的 HTTP 端口 ALB 终止外部 TLS 连接 并根据路由
  • Postgres UUID 和休眠

    我有一个具有 UUID 列的实体 它不是主键 我正在使用 Postgres 和 hibernate 我对此专栏的类型是https www postgresql org docs 9 1 static datatype uuid html h
  • 各种 Istio 端口是如何使用的?

    Question 我正在尝试学习 Istio 并且正在设置我的 Istio Ingress Gateway 当我设置它时 有以下端口选项 如此处所示 https istio io latest docs reference config i
  • Spark 执行器 STDOUT 到 Kubernetes STDOUT

    我在 Spark Worker 中运行的 Spark 应用程序将执行程序日志输出到特定文件路径 worker home directory app xxxxxxxx 0 stdout I used log4j properties将日志从
  • Django ConnectionAbortedError:[WinError 10053]已建立的连接被主机中的软件中止

    我将 django 与 postgresql 一起使用 每当我尝试保存或删除任何内容时 都会发生此错误 Traceback most recent call last File c program files x86 python35 32
  • 如何根据 Kubernetes / Docker 事件发送警报?

    是否可以根据 Kubernetes 集群内发生的事件以某种方式发送警报 到电子邮件 slack 特别是 如果 Pod 意外重新启动或 Pod 无法启动 那么获取警报将非常有用 同样 了解 Pod 的 CPU 使用率是否超过特定阈值并获取警报
  • PostgreSQL 中的逆透视表

    我有下表作为 SUM Case End 的结果 Account Product A Product B Product C 101 1000 2000 3000 102 2000 1000 0 103 2000 1000 0 104 200
  • Asp.NET Core 自定义输入标记帮助器渲染重复复选框

    我创建了一个继承自 InputTagHelper 的标签助手 如本文中的答案所示https stackoverflow com a 40489654 945651 https stackoverflow com a 40489654 945
  • 如何在 NHibernate 中自动生成 ID

    如何让 NHibernate 自动生成表的唯一 ID ID 可以是任意的long值 只要每个值仅使用一次 我当前的映射如下所示

随机推荐

  • 分别计算每列的不同值

    我可以计算每列的不同值而不枚举它们吗 假设我有一张桌子col1 col2 col3 并且没有其他列 在不明确提及这些列的情况下 我希望得到与以下相同的结果 SELECT count distinct col1 as col1 count d
  • 不同航线如何使用相同的护照策略?

    假设我有这样的代码 var api1 require api1 var api2 require api2 var app express app use api1 api1 app use api2 api2 这是 api1 模块的代码
  • 斯坦福 NLP - VP 与 NP

    我有一个例子 斯坦福 NLP 为句子输出了一个奇怪的解析树 Clean my desk ROOT NP NP JJ Clean NP PRP my NN desk 正如你所看到的 它标记了这个词Clean作为依赖于动词的形容词desk整个短
  • 保持 OpenCV 2 和 OpenCV 3 之间的代码兼容性

    我的库当前使用 OpenCV 2 现在 我正在尝试编译该库以使用 OpenCV 3 似乎一些头文件被移动 一些常量被重命名 例如 CV INTER LINEAROpenCV 3 中未定义 由于我的库需要在 OpenCV 2 和 3 上编译和
  • AmazonRDSEnhancedMonitoringRole 的 Cloudformation 模板

    我正在尝试通过 Cloudformation 模板启动 RDS 堆栈 我想在我的数据库实例上启用增强监控 为了做到这一点 MonitoringRoleArn必须在资源上指定属性 据我了解 这个 ARN 应该指向一个 IAM 服务角色 该角色
  • python urllib2 urlopen 响应

    python urllib2 urlopen 响应
  • 在 eclipse RCP 中安装新插件/功能后,是否有任何方法可以自动从磁盘中清除旧插件/功能?

    我正在构建一个 RCP 应用程序 每个季度都会更新功能 插件 因此 如果用户选择自动更新功能 插件 则将下载更新插件的新 jar 但旧插件仍在使用我不再使用的磁盘空间 我厌倦了删除包含旧 jar 信息的安装历史记录 当我尝试删除它时 它向我
  • 我们什么时候应该使用 RxJS tap 运算符?

    我不明白从the docs https rxjs dev firebaseapp com api operators tap 有人能给我解释一下吗 大多数操作符都按流顺序工作 例如 source pipe map a string gt c
  • 如何将支持的操作系统添加到 Windows 单击一次应用程序清单中?

    我正在尝试将supportedOS标签添加到单击一次应用程序清单中 对于常规应用程序执行此操作的常用方法是将 app manifest 文件添加到包含supportedOS 标记的项目中 如下所示 我删除了自动生成的单击一次清单中已包含的所
  • 在 Swift 中将两字节 UInt8 数组转换为 UInt16

    使用 Swift 我想将 uint8 t 数组中的字节转换为整数 C 示例 char bytes 2 0x01 0x02 NSData data NSData dataWithBytes bytes length 2 NSLog data
  • Vue.js 从 webpack 包中排除文件夹

    我陷入了一个关于 webpack 的非常简单的问题 我有一个使用 vue cli 创建的简单 Vue js 应用程序 我创建了文件夹public Reports我想从捆绑包中排除它 该文件夹包含子文件夹和 PDF 我的项目结构是标准的 di
  • 从边框外部绝对定位

    当我将元素绝对定位在相对元素内时 坐标是从容器的边缘计算的 而不考虑边框 相当于从边框的内侧定位 除了从边框的外侧定位元素之外 还有什么方法可以定位元素吗 例如 如果我有一个没有边框的红色方块 如第一个 则文本会粘在容器的左上角 因为它有t
  • PHP PHAR 归档的优点

    PHP 5 3 有一个新功能称为PHAR如同JAR在JAVA中 它基本上是 PHP 文件的存档 它的优点是什么 我不明白它们在网络场景中有何帮助 除 易于部署 之外的任何其他用途 只需复制一个文件即可部署整个应用程序 开源项目有巨大的好处
  • 从 JavaScript 字符串中去除 U+10000-U+10FFFF

    Tried string replace u10000 u10FFFF g 但可悲的是 u不支持10000 要指定超出 U FFFF 的代码点 您需要查找UTF 16 代理对 https en wikipedia org wiki UTF
  • 放大黑线的阈值

    给定一张图像 如下图所示 我需要将其转换为二进制图像 仅限黑白像素 这听起来很简单 我尝试过两个阈值函数 问题是我无法使用这些函数中的任何一个来获得完美的边缘 任何帮助将不胜感激 我尝试过的过滤器是 RGB 和 HSV 空间中的欧几里得距离
  • 在 C++ 中写入相同值的竞争条件?

    当操作写入单个常量值时 代码中存在竞争条件是否存在任何问题 例如 如果有一个并行循环填充了seen另一个数组中的每个值的数组arr 假设索引越界没有问题 关键部分可能是以下代码 parallel body with index i int
  • mongodb查询嵌套结构

    如何查询此嵌套 json 结构以查找包含 A 的文档 categories id 12 values A B C id 17 values D E F 到目前为止 我只能通过以下方式获取 id 值 db coll find categori
  • 有没有办法专注于 Angular 4/Ionic 3 上动态创建的表单?

    I have a page with dynamically created forms like this The blank spaces are inputs and the entire row is a button Is the
  • 如何在H2中创建新数据库?

    我有一个在 MySQL 上本地运行的站点 我想在 H2 数据库上运行它 我刚刚在浏览器上运行了控制台的 h2 jar 文件 但每当我登录时我都会看到该列表jdbc h2 var www mysite data db MODE MySQL i
  • Kubernetes 上的 Npgsql 和 Pgbouncer - 池化和 keepalives

    我正在寻找更详细的指导 其他人在 Pgbouncer 的生产中使用 Npgsql 的经验 基本上 我们使用 GKE 和 Google Cloud SQL 进行了以下设置 现在 我已经使用本地连接池配置了 npgsql 就好像 pgbounc