我们在生产环境中拥有高负载数据库,有时(大约 0.0001%)我们会遇到有关 mysql 的错误块
我们使用 AWS RDS Aurora,目前有 1 个主副本和 2 个只读副本。 AWS 找不到他们这边的任何内容,并告诉我们这是应用程序或 mysql 配置问题。
这种情况发生在完全随机的端点中,因此我们无法专注于特定的查询或工作负载。
它们总是包含 3 个错误:
15:26:56 --> Severity: Warning --> mysqli_select_db(): MySQL server has gone away
15:26:56 --> Severity: Warning --> mysqli_select_db(): Error while reading INIT_DB's response packet. PID=1442
15:26:56 --> Unable to select database: XXXX
我有同样的问题,我注意到TCP关闭顺序并不总是“干净”,有时有规律:
-> Quit
-> FIN ACK
<- FIN ACK
-> ACK
但大多数时候我有:
-> Quit
-> FIN ACK
<- FIN ACK
<- RST ACK
-> ACK
<- RST
出于某种奇怪的原因,Aurora 在 FIN ACK 发送一个 RST 数据包后,我猜测这会在某种程度上导致下一个 PHP 连接出现问题。
在我们的代码中,我们使用 PDO,并且有一个“显式关闭”的 Mysql 连接,将对象设置为 null,如 PDO 文档中所述: https://www.php.net/manual/en/pdo.connections.php
“要关闭连接,您需要通过确保删除对它的所有剩余引用来销毁该对象 - 您可以通过将 null 分配给保存该对象的变量来完成此操作。”
您在关闭与 Aurora 的 TCP 连接时是否观察到相同的模式?