我一直在对我们的数据库进行一些 HA 测试,在我模拟服务器死亡的过程中,我发现了一个问题。
我的测试使用 Django 并执行此操作:
- 连接到数据库
- 进行查询
- 拔出服务器的网线
- 做另一个查询
此时,一切都无限期地挂在 mysql_ping 函数中。就我的应用程序而言,它已连接到数据库(因为之前的查询),只是服务器需要很长时间才能响应......
有谁知道处理这种情况的任何方法?connect_timeout 不起作用,因为我已经连接。read_timeout 似乎有点过于生硬(无论如何我什至无法使用 Django)。
设置默认套接字超时也不起作用(并且过于生硬,因为这会影响所有套接字操作而不仅仅是 MySQL)。
我正在认真考虑在线程中进行查询并使用 Thread.join(timeout) 来执行超时。
理论上,如果我能做到这个超时,那么重新连接逻辑应该会启动,并且我们的数据库自动故障转移应该可以完美运行(在受影响的进程上 kill -9 目前可以解决问题,但有点手动!)。