4

从 3 月 31 日起,我在 Google Cloud SQL 中出现以下错误:

读取通信数据包时出错。

我已经使用 Google Cloud SQL 2 年了,但从未遇到过这样的问题。我很担心。

这是详细的错误消息:

textPayload:  "2019-04-29T17:21:26.007574Z 203385 [Note] Aborted connection 203385 to db: {db_name} user: {db_username} host: 'cloudsqlproxy~{private ip}' (Got an error reading communication packets)"
4

2 回答 2

0

虽然此错误消息确实经常在维护期之后发生,但不一定需要担心,因为这是 MySQL 的已知行为。

关于为什么会发生此问题的可能解释是:

  1. 对实例的连接请求大量增加,活动连接数在短时间内增加。由于在很短的时间间隔内发生连接突发,也可能发生实例的冻结/不可用。可以观察到,这种冻结总是随着连接请求的增加而发生。这种连接的增加会导致实例过载,因此无法响应进一步的连接请求,直到连接数量减少或实例稳定为止。
  2. 服务器太忙,无法接受新连接。
  3. 以前的连接没有正确关闭的比例很高。
  4. 客户端异常终止。
  5. readTimeout在 MySQL 驱动程序中设置太低。
  6. 在文档的摘录中,指出:

连接尝试可能不成功的原因有很多。网络通信永远无法保证,数据库可能暂时无法响应。确保您的应用程序优雅地处理断开或不成功的连接。

  1. 低 Cloud SQL 代理版本也可能是此类事件问题的原因。可能升级到最新版本 (v1.23.0) 可能是故障排除解决方案。
  2. 您尝试连接的 IP 可能不会添加到 Cloud SQL 实例中的授权网络。

此问题的一些可能解决方法,取决于您的情况,可能是以下之一:

  1. 如果问题与高负载有关,您可以重试连接,使用指数退避来防止同时发送过多的连接请求。此处的最佳实践是以指数方式回退您的连接请求并添加随机回退以避免限制,并可能使实例超载。作为将来缓解此问题的一种方法,建议应分隔连接请求以防止过载。虽然,根据您连接到 Cloud SQL 的方式,指数退避可能已经在默认情况下与某些 ORM 包一起使用。

  2. 如果问题可能与长期运行的非活动连接的积累有关,您将能够知道是否是您show full processlist在数据库上使用高Time连接或连接在哪里Command的情况 Sleep

    如果这是您的情况,您将有几个可能的选择:

    如果您没有使用连接池,您可以尝试更新客户端应用程序逻辑以在操作结束时立即正确关闭连接,或者使用连接池来限制连接寿命。特别是,使用连接池管理连接计数是理想的。通过这种方式,未使用的连接被回收,同时连接请求的数量可以通过使用maximum pool size参数来限制。

    如果您正在使用连接池,您可以在操作结束时立即将空闲连接返回到池中,并通过调整wait_timeoutinteractive_timeout标记值设置更短的超时。将 CloudSQL wait_timeout标志设置为 600 秒以强制刷新连接。

  3. 检查网络和端口连接一次 -

步骤 1. 使用 tcptraceroute 或 netcat 确认端口 3306 上的 TCP 连接。

Step 2. 如果 [Step 1] 成功,则尝试检查使用 mysql 客户端检查超时/错误是否有任何错误。

  1. 当客户端可能突然终止连接时,您可以检查:

    如果 MySQL 客户端或 mysqld 服务器正在接收大于max_allowed_packet字节的数据包,或者客户端接收到的数据包过大消息,则可以发送较小的数据包或增加max_allowed_packet客户端和服务器上的标志值。如果使用“begin”和“commit”没有正确提交事务,则需要更新客户端应用程序逻辑以正确提交事务。

  2. 我认为这里有几个实用程序会很有帮助,如果您可以安装mtr这些tcpdump实用程序来监视这些连接增加事件期间的数据包。

  3. 强烈建议在数据库标志中启用 general_log。另一个建议是启用 slow_query 数据库标志并输出到文件。另请查看此 GitHub 问题评论,并在此处查看针对此问题提出的其他解决方案列表

于 2021-10-20T09:21:17.250 回答
-1

此错误消息表明存在连接问题,可能是因为您的应用程序没有正确终止连接,也可能是因为网络问题。

正如 GCP 文档中针对MySQLPostgreSQL实例的这些故障排除步骤中所建议的那样,您可以通过检查您是否遵循管理数据库连接的最佳实践来开始调试。

于 2019-04-30T10:30:20.737 回答