我一直在对我们的数据库进行一些 HA 测试,并且在模拟服务器死机时我发现了一个问题。
我的测试使用 Django 并执行以下操作:
- 连接到数据库
- 做一个查询
- 拔掉服务器的网线
- 做另一个查询
此时一切都无限期地卡在 mysql_ping 函数中。就我的应用程序而言,它已连接到数据库(因为之前的查询),只是服务器需要很长时间才能响应...
有谁知道有什么方法可以处理这种情况? connect_timeout 不起作用,因为我已经连接了。 read_timeout 似乎是一个有点过于生硬的工具(而且我什至不能让它与 Django 一起工作)。
设置默认的套接字超时也不起作用(而且过于生硬,因为这会影响所有套接字操作,而不仅仅是 MySQL)。
我正在认真考虑在线程内进行查询并使用 Thread.join(timeout) 来执行超时。
理论上,如果我能做到这个超时,那么重新连接逻辑应该启动,我们的数据库自动故障转移应该可以完美地工作(kill -9 在受影响的进程上目前可以做到这一点,但有点手动!)。
请您参考如下方法:
我认为这更符合在您的前端网络服务器上设置 read_timeout 的要求。无限期地阻止你的 django 应用程序的原因可能有很多。虽然您发现了一种特定情况,但可能还有更多情况(代码错误、缓存困难等)。
