Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Doctrine ODM/MongoDB不重试查询?_Php_Mongodb_Doctrine_Doctrine Odm - Fatal编程技术网

Php Doctrine ODM/MongoDB不重试查询?

Php Doctrine ODM/MongoDB不重试查询?,php,mongodb,doctrine,doctrine-odm,Php,Mongodb,Doctrine,Doctrine Odm,我正在使用ODM连接MongoDB。我有一个三节点副本集:两个完整副本集和一个仲裁器。复制只是为了更高的可用性,我不寻求跨节点分发读取。我的应用程序经常记录MongoCursorExceptions,并显示消息not master and slaveok=false。我没有看到任何证据表明mongodb日志中发生了故障转移事件,并且主服务器没有更改。更正:故障转移确实发生了,但经常出现非master和slaveok=false的异常,甚至在成功选择新的主设备6小时后出现 怎么办?我看到了我们版本

我正在使用ODM连接MongoDB。我有一个三节点副本集:两个完整副本集和一个仲裁器。复制只是为了更高的可用性,我不寻求跨节点分发读取。我的应用程序经常记录
MongoCursorException
s,并显示消息
not master and slaveok=false
。我没有看到任何证据表明mongodb日志中发生了故障转移事件,并且主服务器没有更改。更正:故障转移确实发生了,但经常出现
非master和slaveok=false的异常
,甚至在成功选择新的主设备6小时后出现

怎么办?我看到了我们版本的includes,但我没有看到一个简单的方法来实现它

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

意味着我们需要重试(强调我的):

必须写入应用程序以重新连接/重试,因为存在 可能出现的任何数量的瞬态(网络)错误 正常运行期间的滚动升级过程

这似乎可以解释:

如果由于某些原因第一次尝试失败,驱动程序将自动重试“普通”查询(而不是命令)几次。这是为了在副本集故障切换期间减少异常(尽管您可能仍然需要处理一些异常),并掩盖暂时的网络问题

我想,
doctrine mongodb
只是使用PHP扩展与mongod进行了实际对话。所以我有点困惑,我是否应该担心重试配置

我想我解决了部分问题:我从下面的连接字符串中删除了仲裁器。我再也看不到任何带有消息
not master and slaveok=false
mongoursorexception
s。我可能一直在打


但是,在故障转移期间,我仍然收到一些消息
MongoCursorException
s,其中包含
无法确定主设备的消息。例如,我刚刚进行了故障切换;根据mongod日志,几秒钟后选择了一个新的主副本,但web应用程序甚至在5分钟后仍引发该异常。

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

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

查看代码。看起来应该通过设置来配置重试系统

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

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

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

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

查看代码。看起来应该通过设置来配置重试系统

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

当我没有配置replicaSet时,我也遇到了类似的错误。

我假设您正在使用DoctrineMongoDBBundle上对应于2.0分支的一个标记(此时最多为2.2.1)。Symfony 2.1+兼容性在捆绑包的标签版本3+中

配置类在文档管理器级别公开默认为零的
retry\u查询
retry\u连接
选项。在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

我意识到在中没有提到这一点,所以我只是在中添加了一节。

我假设您使用的是DoctrineMongoDBBundle上2.0分支对应的一个标记(此时最多为2.2.1)。Symfony 2.1+兼容性在捆绑包的标签版本3+中

配置类在文档管理器级别公开默认为零的
retry\u查询
retry\u连接
选项。在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

我意识到在中没有提到这一点,所以我只是在中添加了一节。

我已经配置了
doctor\u mongodb.connections.default.options.replicaSet=true
doctor\u mongodb.connections.default.server=mongodb://localhost:27017,localhost:27018,localhost:27019
(此处用
localhost
替换真实主机/IPs/端口)(Symfony2-config与Zend看起来有些不同)。我已经更新了答案,以包括我认为适合重试系统的行。如果仍然不正确,我将删除答案,直到我可以在我的设置中正确尝试。谢谢Jamie!我确实在doctrine mongodb代码中看到了这些重试设置,但是Symfony2使用
DoctrineMongoDBBundle
包装了doctrine mongodb配置o在Symfony2中可能没有简单的方法来设置这些。另外,请参阅我刚刚进行的另一次更新。似乎Mongo PHP扩展应该已经在重试了。我已经配置了
doctor\u mongodb.connections.default.options.replicaSet=true
doctor\u mongodb.connections.default.server=mongodb://localhost:27017,localhost:27018,localhost:27019
(此处用
localhost
替换真实主机/IPs/端口)(Symfony2配置看起来与Zend稍有不同)。我已更新了答案,以包括我认为适合重试系统的行。如果仍然不正确,我将删除答案,直到我可以在我的设置中正确尝试它