有趣而奇怪的问题。
有一个生产系统运行分布在多台服务器上的应用程序,所有服务器都对单独的 MySQL 服务器进行读写。
- MySQL 服务器版本 5.6.31
- CentOS 7
运行几个小时后,应用程序崩溃,并指出:
<JDBCExceptionReporter.java:233>SQL Error: 0, SQLState: 08S01
<JDBCExceptionReporter.java:234>Communications link failure
The last packet successfully received from the server was 60,059 milliseconds ago. The last packet sent successfully to the server was 60,059 milliseconds ago.
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
应用程序在发生这种情况之前运行多长时间似乎很难预测,有时是一天,有时只有几个小时。这个问题会在不同的服务器上的不同时间发生,导致应用程序崩溃,直到最终所有服务器都崩溃。然而,有趣的是:
失败,如果发生,将始终按照可预测的时间表运行,时间表的周期为 61 分钟(在 60 分钟 55 秒和 61 分钟 5 秒之间变化)。因此,例如,我们可能会在以下位置看到故障:
- 16:01:30
- 17:02:32
- 18:03:31
- 19:04:35
- 21:06:33
我的问题是:每次发生此类故障都可能是什么原因造成的?61分钟?
我们已经查看了大量的东西,但仍然感到困惑,对我来说,关键似乎在于这种奇怪的周期模式,它排除了计划任务,因为它每小时漂移 1 分钟,而所有计划任务都不会这样做。