symfony2 app:mongodb副本集故障转移需要apache重启

时间:2012-11-10 01:24:58

标签: mongodb symfony doctrine

我的Symfony2应用程序连接到MongoDB副本集(2个完整节点和仲裁服务器)。故障转移完成后(成功选择了新主节点),许多Web请求都会导致服务器错误。如果我重新启动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文件:

  • doctrine 2.1.7
  • doctrine-mongodb 1.0.0-BETA1
  • doctrine-mongodb-odm 1.0.0-BETA5
  • doctrine-common 2.2.0
  • doctrine-dbal 2.1.7

它闻起来像Symfony2应用程序试图重用过时的MongoDB连接。主要的日志支持这种猜测:当我点击应用程序网页并进行查询时,连接加起来,当我重新启动apache时,会释放许多连接。

相关:

可能相关:

1 个答案:

答案 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中修复。