GCP 服务器崩溃 "cloudsql.enable_instance_password_validation"

GCP Server crashing with "cloudsql.enable_instance_password_validation"

在过去的一天里,我经常遇到此错误,导致需要重置云实例才能继续连接:

ERROR:  unrecognized configuration parameter "cloudsql.enable_instance_password_validation"

这是在 PostgreSQL14 GCP Cloud SQL 社区共享 1 个 vCPU,0.614 GB 实例上运行,但也在标准 1 vCPU,3.7 GB 实例上进行了测试,问题仍然存在。

发生这种情况后唯一更改的代码是 listen/notify 使用 Golang PGX 池接口的调用,该接口已被还原,问题仍然存在。

任何数据库调用都会经常出现此问题(重置后 30 分钟内),而且我没有设置任何涉及“enable_instance_password_validation”的内容 - 我也找不到任何涉及此名称的参数。

这很有趣,@enocom 正确地指出了 Postgresql 中遇到的错误是转移注意力的问题。在整个过程中,由于跨越 Go 服务器实例和 Postgresql 服务器的问题,出现了一些转移注意力的问题。

崩溃的真正原因是用于与 Postgres 数据库交互的 Golang PGX 池接口在默认情况下最大 'DBMaxPools' 上限为 14 个连接。当我们达到这个连接数时,服务器挂起而没有任何错误日志,并且所有进一步的连接都被永久拒绝。

要解决此问题,只需在调用时在 dbURI 中添加一个 'pool_max_conns':

dbPool, err := pgxpool.Connect(context.Background(), dbURI)

这可以通过以下方式完成:

dbURI = fmt.Sprintf(`postgresql://%s:%s@%s:%s/%s?pool_max_conns=%s`, config.DBUser, config.DBPassword, config.DBAddress, config.DBPort, config.DBName, config.DBMaxPools)

可在此处找到详细说明:pgxpool package info

设置 PGX max conns 时,请务必将此数字设置为与服务器实例的最大并发连接数相同或相似,以避免再次发生这种情况。对于 GCP 云 运行 实例,这可以在 'Maximum requests per container'

下的部署修订中设置