1

我正在使用 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-392MongoCursorExceptionnot master and slaveok=false

但是,在故障转移期间,我仍然收到一些MongoCursorException消息couldn't determine master。例如,我刚刚进行了故障转移;根据 mongod 日志,几秒钟后选出了一个新的主节点,但 Web 应用程序甚至在 5 分钟后抛出了该异常。

4

2 回答 2

6

我假设您正在使用与 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

我意识到捆绑文档中没有提到这一点,所以我只是在这个提交中添加了一个部分。

于 2012-11-06T21:16:24.847 回答
1

您是否已将 replicaSet 选项配置为指向您在 MongoDB 中配置的指定副本集?

Symfony DoctrineMongoDBBundle 文档

查看底部的完整配置。据我所知,您需要在服务器配置行中命名所有服务器,并选项部分中命名副本集。该页面上的文档并没有说得很清楚。

浏览代码。看起来重试系统应该是通过设置来配置的。

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

当我没有配置副本集时,我遇到了类似的错误。

于 2012-06-20T19:22:36.353 回答