0

我的 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文件:

  • 教义 2.1.7
  • 学说-mongodb 1.0.0-BETA1
  • 学说-mongodb-odm 1.0.0-BETA5
  • 学说通用 2.2.0
  • 教义-dbal 2.1.7

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

有关的:

可能相关:

4

1 回答 1

1

假设您使用的是 PHP 驱动程序的 1.2.12 版,我是否正确?鉴于重新启动 Apache 似乎可以解决问题,看起来驱动程序只是在其池中重新使用错误的连接。重新启动 Apache 及其工作程序可以有效地清除所有池,因为每个工作程序都有自己的连接池,可以在其生命周期内服务的请求之间共享。完全有可能一些工作人员在故障转移后刷新了他们的连接,而另一些工作人员没有,这将导致您仍然会收到异常,具体取决于哪个工作人员被击中。

连接处理在 1.3.0 中进行了大修,因此升级后您应该会看到故障转移支持方面的一些改进。一旦PR #81被合并, Doctrine MongoDB 应该正确支持 1.3.0 ,ODM 紧随其后。

Doctrine 中的retry_选项不支持连续尝试之间的延迟,这使得它们不太适合处理可能需要 10-30 秒的故障转移。我相信 Jon 对他们的初衷是处理掉线和网络故障。

我还要注意,在 PHP 驱动程序 1.3.0 之前,mongo.is_master_intervalINI 设置从未真正使用过。这已在PHP-576中修复。

于 2012-12-02T18:47:06.920 回答