我的Symfony2应用程序连接到MongoDB副本集(2个完整节点和仲裁服务器)。故障转移完成后(成功选择了新主节点),许多Web请求都会导致服务器错误。如果我重新启动Apache(但不做任何其他更改),异常就会消失,应用程序会按预期工作(查询新主数据库,没问题)。
在重新启动Apache之前,我会收到MongoCursorException
消息not master and slaveOk=false
或couldn't determine master
。不一致:看起来它取决于我遇到的Apache工作者。或者其他的东西。无论如何,重启Apache似乎立即修复了应用程序并且所有查询都正常成功。
我的副本集用于冗余,而不是性能,因此我从不使用slaveOk = true。
将这些选项传递给Mongo构造函数:
connect => TRUE
replicaSet => foo
我正在使用:
来自我的deps
文件:
它闻起来像Symfony2应用程序试图重用过时的MongoDB连接。主要的日志支持这种猜测:当我点击应用程序网页并进行查询时,连接加起来,当我重新启动apache时,会释放许多连接。
mongo.is_master_interval
?retry_query
and retry_connect
would smooth out failover automatically,但情况似乎并非如此。我是否需要在代码中添加try / catch块?相关:
retry_query
和retry_connect
选项)可能相关:
答案 0 :(得分:1)
假设您使用的是PHP驱动程序的1.2.12版本,我是否正确?鉴于重新启动Apache似乎解决了问题,看起来驱动程序只是在其池中重新使用错误的连接。重新启动Apache及其工作人员可以有效地清除所有池,因为每个工作人员都有自己的连接池,可以在其生命周期内提供的请求之间共享。一些工作人员完全有可能在故障转移后更新了他们的连接,而其他工作人员则没有,这将导致您仍然会获得异常,具体取决于哪个工作人员被击中。
连接处理在1.3.0中进行了彻底检查,因此升级后您应该看到故障转移支持有所改进。一旦PR #81合并,Doctrine MongoDB应该支持1.3.0,不久之后会有ODM。
Doctrine中的retry_
选项不支持连续尝试之间的延迟,这使得它们不太适合处理故障转移,这可能需要10-30秒。我相信乔恩对他们的初衷是处理掉线和网络昙花一现。
我还要注意,在PHP驱动程序1.3.0之前,mongo.is_master_interval
INI设置从未实际使用过。这已在PHP-576中修复。