2012-11-10 41 views
0

我的Symfony2應用程序連接到一個MongoDB副本集(2個完整節點和一個仲裁器)。故障轉移完成後(新的主服務器已成功選出),許多Web請求都會導致服務器錯誤。如果我重新啓動Apache(但不做其他更改),則異常消失,應用程序按預期工作(查詢新的主服務器,沒有問題)。symfony2應用程序:mongodb副本集故障切換需要Apache重啓

重新啓動Apache之前,我得到MongoCursorException,其中的消息not master and slaveOk=falsecouldn't determine master。不一致:這看起來取決於我打哪個Apache工作人員。或者其他的東西。無論如何,重新啓動Apache似乎立即修復應用程序,所有查詢都能正常進行。

我的副本集用於冗餘,而不是性能,所以我從不使用slaveOk = true。

這些選項傳遞給Mongo的構造函數:

  • connect => TRUE
  • replicaSet => foo

我使用:

  • PHP 5.3.10
  • APC 3.1 .7
  • 的MongoDB 2.2.1
  • Symfony2的版本2.0.18

從我deps文件:

  • 學說2.1.7
  • 學說,MongoDB的1.0.0-β1
  • 主義-mongodb-odm 1.0.0-BETA5
  • 學說共同2.2.0
  • doctrine-dbal 2.1.7

它聞起來像Symfony2應用程序試圖重新使用過時的MongoDB連接。主要的日誌支持這種猜測:當我打開應用程序網頁並且它進行查詢時,連接加起來,並且當我重新啓動apache時,許多連接被釋放。

相關:

  • ​​(我想出來的新retry_queryretry_connect選項)

可能相關:

回答

1

我是否正確地假設您使用的是PHP驅動程序的1.2.12版本?鑑於重新啓動Apache似乎解決了這個問題,它看起來像驅動程序只是在其池中重新使用錯誤的連接。重新啓動Apache及其工作人員可以清除所有池,因爲每個工作人員都有自己的連接池,可以在其生命週期中的服務請求之間共享。一些工作人員在故障轉移後刷新其連接的可能性很大,而另一些工作人員則沒有這樣做,這將導致您依然受到異常影響,具體取決於哪個工作人員遇到了問題。

連接處理在1.3.0中進行了全面檢查,因此升級後應該會在故障切換支持方面有所改進。學說MongoDB在PR #81合併後應該適當地支持1.3.0,隨後的ODM將會繼續。

Doctrine中的retry_選項不支持連續嘗試之間的延遲,這使得它們不適合處理故障轉移,這可能需要10-30秒。我相信喬恩的初衷是爲了處理丟失的連接和網絡連接。

我還會注意到,直到PHP驅動程序1.3.0,mongo.is_master_interval INI設置從未實際使用。這已在PHP-576中得到修復。

+0

是的,我當時(和我)正在使用PHP Mongo擴展/驅動程序的1.2.12版本。一旦PR#81合併,我會嘗試1.3.x。並且請注意,我在我的問題中描述的情況發生在新的小學成功選舉後。 –