【问题标题】:CloudSQL Proxy intermittently refuses connectionCloudSQL 代理间歇性拒绝连接
【发布时间】:2019-08-06 00:09:05
【问题描述】:

我在我的 nodejs API 服务上使用 Cloud SQL 代理 sidecar。

它似乎工作得很好,除了我大约 1% 的 API 请求返回一个错误,表明数据库连接失败:

connect ECONNREFUSED 127.0.0.1:3306

我的后端日志显示,这是在我的 ORM 尝试连接到数据库时抛出的。

Sidecar 日志没有显示任何内容,相关 CloudSQL 实例也没有显示任何异常(17/4000 个连接、

这可能是什么原因?

编辑:附加信息:

我所有的 pod 都已经运行了好几个小时,重启了 0 次,所以间歇性故障不是暂时的启动故障。

日志显示,自 30 天前以来,这种情况一直间歇性发生。

【问题讨论】:

  • 这是否可能在启动时发生,并且 NodeJS pod 启动速度如此之快,并在 cloudsql 代理 pod 完全启动之前尝试连接?
  • 否;我已向有关此问题的问题添加了信息。
  • 这种情况一直在发生吗?还是最近才发生的?这可能是由于无数的事情最终导致某些连接被丢弃或拒绝,这是可以预料的。从角度来看,服务水平协议规定,如果错误率达到 20%,则该实例将被视为“故障”。考虑到目前的错误率有多高,我认为目前没有理由担心。
  • 我们有大约 20 个应用程序(主要是 Java)使用 CloudSQL 代理端汽车,我们没有看到这个问题。您是否使用任何数据库连接池?我已经看到与数据库连接池和空闲连接相关的连接问题被关闭,但通常表现为连接重置错误。

标签: google-cloud-sql cloud-sql-proxy


【解决方案1】:

以下是可能导致 Cloud SQL 实例无法访问的几个原因:

1) 您的实例与 Cloud SQL 用于监控实例运行状况的代理之间的连接失败
2) 您的实例与 Cloud SQL 服务之间的操作同步
3) 为您的 Cloud SQL 实例提供的资源(例如 CPU 内核、RAM 和/或存储)不足(有关更多信息,请参阅 Cloud SQL 的操作指南 [1])。

由于可能导致连接断开的原因有多种(其中许多与您的项目实施和环境的具体情况密切相关),因此诊断异常连接拒绝非常复杂。此外,Cloud SQL 会持续监控可能导致实例无法访问的任何问题,并自动采取措施解决这些问题。

在正常情况下,错误率不会完全消失,但应该发生在非常低​​的水平[2]。当然,有些情况可能会使情况变得更糟——生产问题以及某些操作组合。

在任何情况下,在这种情况下的建议是实施重试策略以重新连接到具有指数退避的实例。一些客户端库已经有支持代码,但这有点取决于你到底在使用什么。

[1]https://cloud.google.com/sql/docs/mysql/operational-guidelines
[2]https://cloud.google.com/sql/sla

【讨论】:

  • 与此特定问题无关。与 Cloud SQL 的连接不是问题。他们正在使用 Cloud SQL 代理,该代理在 kubernetes 中作为 side car 运行,并代理从应用程序 pod 到 Cloud SQL 的连接。从代理到 Cloud SQL 的连接很好。但是从应用程序到代理的连接有问题。
  • My backend logs show that this was thrown from my ORM when it attempted to connect to the DB. 是这样吗? @bdares 你能澄清一下吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-18
  • 2021-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多