删除读取器实例后,Aurora PostgreSQL 查询失败并出现错误“尝试读取超过流末尾”

问题描述 投票:0回答:1

我一直在具有 1 个写入器实例和 1 个读取器实例的 Aurora PostgreSQL 集群上运行查询。 我的应用程序位于 .NET6 中,它使用 Npgsql 库连接到集群。我一直在测试该库的多个版本:6.0.7 和 7.0.0。

场景如下:

  1. 我使用集群的读取器端点(负载均衡器)执行查询。
  2. 在指标中,所有连接都出现在读取器实例上。
  3. 向集群添加了另一个读取器实例。
  4. 新读取器实例启动并运行后,一些新查询可能已传输到新读取器,但有时所有查询仍在第一个读取器上执行。
  5. 我从 AWS 管理控制台删除了第一个读取器实例。此时,我预计所有新查询都会在新添加的读取器上执行,因为第一个查询已被删除。
  6. 但通常大多数查询仍然在第一个查询上执行。
  7. 当原始读取器被删除时,查询在一段时间内执行良好,但在某些时候读取器被删除并且查询失败并出现错误:

Npgsql.NpgsqlException (0x80004005):从流读取时出现异常 ---> System.IO.EndOfStreamException:尝试读取超过流末尾的内容。

当第一个读取器被标记为删除时,新查询(使用新创建的 NpgSqlConection 对象)不应该在第二个读取器上执行吗? 有人可以提供一些关于如何完成此操作的详细信息吗?不使用重试机制可以避免这种情况吗?

postgresql .net-6.0 npgsql amazon-aurora
1个回答
0
投票

我在重新启动主实例时遇到了类似的问题。即使主实例重新启动后,前几个请求也会转到旧实例,这会导致相同的错误。

我将 Keepalive=1 参数添加到 postgres 连接字符串中,发现过时的连接已被删除并替换为干净的连接。问题解决后

© www.soinside.com 2019 - 2024. All rights reserved.