Doctrine ODM/MongoDB没有重试查询?

Ada*_*sen 1 php doctrine mongodb doctrine-odm

我正在使用Doctrine ODM连接到MongoDB.我有一个三节点副本集:两个fulls和一个仲裁器.复制仅用于提高可用性,我不寻求跨节点分发读取.我的应用程序MongoCursorException经常使用消息进行日志记录not master and slaveok=false.我没有看到任何证据表明mongodb日志中发生了故障转移事件,并且主要事件没有发生变化.更正:确实发生了故障转移,但是例外情况not master and slaveok=false经常出现,甚至在新主要成功当选后6小时出现.

该怎么办?我看到我们的doctrine-mongodb版本包含(实验?)重试功能,但我没有看到一种简单的方法来启用它.

不确定它是否重要,但这是一个Symfony2(v2.0)应用程序.

https://groups.google.com/d/topic/mongodb-user/6p710Rdycpg/discussion意味着我们需要重试(强调我的):

您的应用程序必须写入重新连接/重试,因为有任何数量的瞬态(网络)错误可能会像正常操作期间的滚动升级过程那样出现.

蒙戈PHP扩展文档似乎考虑到这一点:

如果第一次尝试因某些原因失败,驱动程序将自动重试"普通"查询(而不是命令)几次.这是为了减少副本集故障转移期间的异常(尽管您可能仍需要处理一些故障转移)并掩盖瞬态网络问题.

我认为doctrine-mongodb只是使用PHP扩展实际上与mongod交谈.所以我有点困惑,我是否应该担心重试配置.

我想我解决了部分问题:我根据Kristina Chodorow的建议从连接字符串中删除了仲裁器.我不再看到任何有消息的了.我可能一直在点击https://jira.mongodb.org/browse/PHP-392.MongoCursorExceptionnot master and slaveok=false

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

jmi*_*ola 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
Run Code Online (Sandbox Code Playgroud)

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