我正在使用 Doctrine ODM 连接到 MongoDB。我有一个三节点副本集:两个完整副本和一个仲裁者。复制只是为了更高的可用性,我不寻求跨节点分布读取。我的应用程序MongoCursorException
经常使用消息记录 s not master and slaveok=false
。我没有看到任何证据表明 mongodb 日志中发生了故障转移事件并且主节点没有更改。更正:故障转移确实发生了,但常见的例外not master and slaveok=false
经常出现,甚至在成功选举后6小时后出现6小时。
该怎么办?我看到我们的学说 mongodb版本包括(实验性?)重试功能,但我没有看到启用它的简单方法。
不确定它是否重要,但这是一个 Symfony2 (v2.0) 应用程序。
https://groups.google.com/d/topic/mongodb-user/6p710Rdycpg/discussion暗示我们需要重试(强调我的):
您的应用程序必须编写为重新连接/重试,因为可能会出现任何数量的瞬态(网络)错误,这与正常操作期间的滚动升级过程非常相似。
Mongo PHP 扩展文档似乎解释了这一点:
如果第一次尝试由于某些原因失败,驱动程序将自动重试“普通”查询(而不是命令)。这是为了在副本集故障转移期间导致更少的异常(尽管您可能仍然需要处理一些)并掩盖暂时的网络问题。
而且我认为doctrine-mongodb
只是使用 PHP 扩展来实际与 mongod 交谈。所以我有点困惑是否应该担心重试配置。
我想我解决了部分问题:按照Kristina Chodorow 的建议,我从连接字符串中删除了仲裁器。我不再看到带有 message 的任何 s 。我可能一直在点击https://jira.mongodb.org/browse/PHP-392。MongoCursorException
not master and slaveok=false
但是,在故障转移期间,我仍然收到一些MongoCursorException
消息couldn't determine master
。例如,我刚刚进行了故障转移;根据 mongod 日志,几秒钟后选出了一个新的主节点,但 Web 应用程序甚至在 5 分钟后抛出了该异常。