簡體   English   中英

教義ODM / MongoDB是否不重試查詢?

[英]Doctrine ODM / MongoDB not retrying queries?

我正在使用Doctrine ODM連接到MongoDB。 我有一個三節點副本集:兩個完整副本和一個仲裁程序。 復制只是為了提高可用性,我不打算在節點之間分配讀取。 我的應用程序經常記錄MongoCursorException ,消息not master and slaveok=false 我沒有看到任何證據表明mongodb日志中發生了故障轉移事件,並且主事件沒有發生變化。 改正: 確實發生了故障轉移 ,但是經常出現異常( not master and slaveok=false ),甚至在成功選出新的主not master and slaveok=false后的6小時內也出現了。

該怎么辦? 我看到我們的doctrine-mongodb版本包含(實驗性?)重試功能 ,但是我看不到啟用它的簡便方法。

不確定是否重要,但這是一個Symfony2(v2.0)應用程序。

https://groups.google.com/d/topic/mongodb-user/6p710Rdycpg/discussion表示我們需要重試(強調我的意思):

必須編寫您的應用程序才能重新連接/重試,因為可能會出現許多瞬時(網絡)錯誤,就像在正常操作期間的滾動升級過程一樣。

Mongo PHP擴展文檔似乎說明了這一點:

如果由於某些原因第一次嘗試失敗,驅動程序將自動重試幾次“普通”查詢(不是命令)。 這將在副本集故障轉移期間引起較少的異常(盡管您可能仍將不得不處理一些異常),並避免出現瞬態網絡問題。

而且我認為doctrine-mongodb只是使用PHP擴展與mongod進行了實際對話。 因此,我是否應該擔心重試配置讓我有些困惑。

我想我已經解決了部分問題:我按照Kristina Chodorow的建議從連接字符串中刪除了仲裁程序 我再也看不到任何MongoCursorException消息, not master and slaveok=false消息。 我可能一直在點擊https://jira.mongodb.org/browse/PHP-392

但是,我仍然遇到一些MongoCursorException ,並且消息在故障轉移期間couldn't determine master服務器。 例如,我只是進行了故障轉移; 根據mongod日志,幾秒鍾后便選擇了一個新的主數據庫,但Web應用程序甚至在5分鍾后仍拋出該異常。

我假設您正在使用與DoctrineMongoDBBundle上的2.0分支相對應的標記之一(當前為2.2.1)。 Symfony 2.1+的兼容性在捆綁軟件的3+版本中。

配置類在文檔管理器級別公開retry_queryretry_connect選項,默認情況下為零。 在YML中,配置如下所示:

doctrine_mongodb:
    # Other proxy, hydrator and connection configuration options

    default_document_manager: dm1

    document_managers:
        dm1:
            retry_query: 1
            retry_connect: 1
            # Other mapping, metadata and DM options follow

我意識到捆綁包文檔中沒有提到這點,所以我在提交中添加了一段。

您是否配置了copysetSet選項以指向在MongoDB中配置的指定副本集?

Symfony主義MongoDB捆綁文檔

查看底部的完整配置。 據我知道你需要來命名服務器配置行中的所有服務器名稱的選項部分的replicaSet。 該頁面上的文檔並不清楚。

查看代碼。 看起來重試系統應該通過設置進行配置。

retryConnect
retryQuery

與數據庫名稱處於同一級別。

這是我的Zend Framework配置的一個示例,該配置實際上執行相同的操作。

; Database details
resources.odm.configuration.defaultDB = "test"
resources.odm.connection.options.replicaSet = "test-replica-set"
resources.odm.connection.server = "mongodb://rs1a.testing.com:27017,rs1b.testing.com:27017,rs1c.testing.com:27017"
resources.odm.configuration.retryConnect = 3
resources.odm.configuration.retryQuery = 3

當我沒有配置plicateSet時,我得到了類似的錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM