2012-04-04 78 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應用程序。當你找到一個特定的案例時,可能會有更多(代碼錯誤,緩存困難等)。