我对Google Cloud和运行应用程序非常陌生。我目前在Google Flexible App Engine上的Docker容器中运行了一个Django应用程序,该应用程序连接到同一项目中的Google Cloud SQL(PostgreSQL)实例。最新版本已经运行了大约 3 天,没有问题。
问题:
今天,我开始从应用程序中反复收到OperationalError: server closed the connection unexpectedly
错误。 我可以运行云SQL代理并且它正常启动(Ready for new connections
),但是如果我尝试使用psql连接,则会收到错误:
psql: server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
代理报告:
couldn't connect to "<instance_name>:us-central1:<instance_name>":
dial tcp <ip address>:3307: connect: connection refused
在SSH到我正在运行的flex应用程序实例并运行sudo docker logs <cloud proxy container>
时,最后一行类似:
couldn't connect to "<instance_name>:us-central1:<instance_name>":
dial tcp <ip address>:3307: getsockopt: connection refused
我尝试/检查过的事情
- 已重启云 SQL 实例。实例本身运行良好,我可以从控制台使用云外壳访问它。
- 已检查数据库实例名称和 IP 地址 - 它们匹配。
- 已重新启动 Flex 应用程序引擎实例。据我所知,没有变化。
- 将我的本地cloud_sql_proxy副本升级到 1.09。
- 已检查配额 - 我似乎没有达到任何 API 或同时连接限制。
- 我可以通过授权我的本地 IP 地址连接到 sql 实例。
- 我能够在本地使用代理连接到不同(但非常相似)的 Google Cloud SQL 实例,所以我不确定代理是否有问题。
任何帮助将不胜感激,在这一点上我没有想法。谢谢!
如果 CloudSQL 实例仅配置了私有 IP 地址,这也可能是个问题。根据文档中隐藏的一小段:
代理不提供新的连接路径;它依赖于现有的 IP 连接。例如,您无法使用代理与使用私有 IP 的实例连接,除非代理使用的是已配置为访问私有服务的 VPC 网络。
在这种情况下,唯一的解决方案似乎是向服务器添加公共 IP。
我首先重新启动了Cloud SQL实例。这无济于事。然后,我只需单击SQL实例的"停止",一旦它,单击"开始",现在它可以工作了。这是非常随机和烦人的。
就我而言,我在当天早些时候升级了SQL实例的计算机类型,似乎这样做,Google Cloud只是"重新启动"实例,因为需要的是"停止",然后"启动"。这只是一个猜测。
tl;dr 停止,然后启动云 SQL 实例。不要重新启动,因为"重新启动"!="停止+启动">
希望它能帮助其他面临这个随机问题的人。
我们最终通过回滚到较早的备份来"修复"问题。Google支持指出"问题始于Cloud SQL实例的维护窗口,因此可能进行了导致连接中断的更改"。