我一直在Aurora PostgreSQL集群上运行查询,该集群有1个writer示例和1个reader示例。我的应用程序在.NET 6中,它使用Npgsql库连接到集群。我一直在使用多个版本的库进行测试:6.0.7和7.0.0。
以下是场景:
1.我使用集群的读取器端点(负载均衡器)执行查询。
1.在指标中,所有连接都出现在读取器示例上。
1.已将另一个读取器示例添加到群集。
1.一旦新的读取器示例启动并运行,一些新的查询可能已经传输到新的读取器,但有时所有查询仍在第一个读取器上执行。
1.我从AWS管理控制台中删除了第一个读取器示例。此时,我希望所有新查询都在新添加的读取器上执行,因为第一个读取器已被删除。
1.但通常大多数查询仍然在第一个上执行。
1.在删除原始读取器时,查询可以正常执行一段时间,但在某个时候读取器被删除,查询失败并出错:
Npgsql.NpgsqlException(0x 80004005):从流中阅读时发生异常-> System.IO.EndOfStreamException:试图读取流的末尾。
当第一个读取器被标记为要删除时,新的查询(使用新创建的NpgSqlConection对象)是否应该在第二个读取器上执行?有人能提供一些关于如何做到这一点的细节吗?这可以在不使用重试机制的情况下避免吗?
1条答案
按热度按时间rseugnpd1#
我在重新启动主示例时遇到了类似的问题。即使在主示例重新启动后,前几个请求也会转到旧示例,导致相同的错误。
我将Keepalive=1参数添加到postgres连接字符串中,发现陈旧的连接被删除并替换为干净的连接。