2012-04-04 76 views
2

我一直在做我们的数据库的一些高可用性测试和我的服务器死亡模拟我发现了一个问题。如何检测Python中的MySQL服务器总死亡率?

我的测试使用Django和做到这一点:

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

在这一点上,一切都在mysql_ping函数中无限期地挂起。至于我的应用程序而言,它连接到数据库(因为前面的查询),这只是服务器需要很长时间来响应...

有谁知道任何方式来处理这种情况? connect_timeout不起作用,因为我已经连接。 read_timeout看起来像是一个有点太钝的工具(我甚至无法使用Django工作)。

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

我正在认真考虑在线程内执行我的查询并使用Thread.join(超时)来执行超时。在理论上,如果我可以做这个超时,那么重新连接逻辑就应该启动了,我们的数据库自动故障切换应该完美地工作(在受影响的进程中kill -9目前有效,但有点手动!)。

+0

“我正在认真考虑在线程内完成我的查询” - 无论如何不是一个好主意? – Ivan 2012-04-04 19:38:58

+0

@Ivan是...并且不......在某些情况下,我已经在线程内,我只是针对每个查询添加其他线程。 – ColinHowe 2012-04-04 19:45:47

+0

@Ivan是的,没有好的'pythonic'方法来终止它之外的线程。使用多线程可能会导致大量连接的线程。 – 2012-04-04 20:08:56

回答

0

我认为这将更直接与您的前置Web服务器上设置read_timeout。可以存在任何数量的原因来无限期地保留您的django应用程序。当你找到一个特定的案例时,可能会有更多(代码错误,缓存困难等)。