Skip to main content
 首页 » 编程设计

python之我如何从 Python 中检测到 MySQL 服务器的总死亡

2025年05月04日19shangdawei

我一直在对我们的数据库进行一些 HA 测试,并且在模拟服务器死机时我发现了一个问题。

我的测试使用 Django 并执行以下操作:

  1. 连接到数据库
  2. 做一个查询
  3. 拔掉服务器的网线
  4. 做另一个查询

此时一切都无限期地卡在 mysql_ping 函数中。就我的应用程序而言,它已连接到数据库(因为之前的查询),只是服务器需要很长时间才能响应...

有谁知道有什么方法可以处理这种情况? connect_timeout 不起作用,因为我已经连接了。 read_timeout 似乎是一个有点过于生硬的工具(而且我什至不能让它与 Django 一起工作)。

设置默认的套接字超时也不起作用(而且过于生硬,因为这会影响所有套接字操作,而不仅仅是 MySQL)。

我正在认真考虑在线程内进行查询并使用 Thread.join(timeout) 来执行超时。

理论上,如果我能做到这个超时,那么重新连接逻辑应该启动,我们的数据库自动故障转移应该可以完美地工作(kill -9 在受影响的进程上目前可以做到这一点,但有点手动!)。

请您参考如下方法:

我认为这更符合在您的前端网络服务器上设置 read_timeout 的要求。无限期地阻止你的 django 应用程序的原因可能有很多。虽然您发现了一种特定情况,但可能还有更多情况(代码错误、缓存困难等)。