【问题标题】:Uncaught exception 'MongoCursorException' with message 'Couldn't get connection: No candidate servers found'未捕获的异常“MongoCursorException”和消息“无法连接:未找到候选服务器”
【发布时间】:2014-11-19 19:22:08
【问题描述】:

问题描述

我有一个三成员副本集和一个 php Web 前端,它 a) 写入一条记录,然后 b) 对集合执行 .find() 并返回数据库中的所有文档。

为了更好地理解副本集的工作原理,我做了以下工作:

  1. 停止了主服务器 (mongohost1) 上的 mongo 服务。网页继续运行。
  2. 停止了升级为主服务器 (mongohost2) 上的 mongo 服务。此时,即使我有另一个具有相同数据库的 mongo 主机 (mongohost3),PHP Web 应用程序也会失败并显示上述错误消息。

我期待系统至少让我从数据库中读取记录,即使写入失败。

到目前为止我检查过/尝试过的内容:

所有主机都可以访问。我正在尝试从每个框中按主机名 ping 并且一切正常。

这是根据 mongohost3 配置副本集的方式:

        jlrs0:SECONDARY> cfg=rs.config()
        {
            "_id" : "jlrs0",
            "version" : 5,
            "members" : [
                {
                    "_id" : 0,
                    "host" : "monghost1.test.mm.org:27017",
                    "priority" : 3
                },
                {
                    "_id" : 1,
                    "host" : "mongohost2.test.mm.org:27017",
                    "priority" : 2
                },
                {
                    "_id" : 2,
                    "host" : "mongohost3.test.mm.org:27017",
                    "priority" : 2
                }
            ]
        }
        jlrs0:SECONDARY> 

以及每个 mongohost3 的副本集中每个成员的状态:

jlrs0:SECONDARY> rs.status()
{
    "set" : "jlrs0",
    "date" : ISODate("2014-11-19T15:16:21Z"),
    "myState" : 2,
    "members" : [
        {
            "_id" : 0,
            "name" : "mongohost1.test.mm.org:27017",
            "health" : 0,
            "state" : 8,
            "stateStr" : "(not reachable/healthy)",
            "uptime" : 0,
            "optime" : Timestamp(1416419914, 1),
            "optimeDate" : ISODate("2014-11-19T17:58:34Z"),
            "lastHeartbeat" : ISODate("2014-11-19T15:16:20Z"),
            "lastHeartbeatRecv" : ISODate("2014-11-19T14:06:49Z"),
            "pingMs" : 0
        },
        {
            "_id" : 1,
            "name" : "mongohost2.test.mm.org:27017",
            "health" : 0,
            "state" : 8,
            "stateStr" : "(not reachable/healthy)",
            "uptime" : 0,
            "optime" : Timestamp(1416419914, 5),
            "optimeDate" : ISODate("2014-11-19T17:58:34Z"),
            "lastHeartbeat" : ISODate("2014-11-19T15:16:17Z"),
            "lastHeartbeatRecv" : ISODate("2014-11-19T14:10:58Z"),
            "pingMs" : 0
    },
    {
        "_id" : 2,
        "name" : "mongohost3.test.mm.org:27017",
        "health" : 1,
        "state" : 2,
        "stateStr" : "SECONDARY",
        "uptime" : 451417,
        "optime" : Timestamp(1416419914, 5),
        "optimeDate" : ISODate("2014-11-19T17:58:34Z"),
        "self" : true
    }
],
"ok" : 1
}

这是连接的 PHP 代码:

        $m = new   MongoClient("mongodb://mongohost1.test.mm.org:27017,mongohost2.test.mm.org:27017,mongohost3.test.mm.org:27017/?replicaSet=jlrs0");

我仍在阅读副本集等内容,因此我确定这是我错过/忽略设置的内容。 例如,我还没有设置仲裁员... 不确定它是否相关,但以防万一,我想我会提到它。我不确定还要检查什么。

谢谢。

【问题讨论】:

    标签: mongodb replication ubuntu-14.04 database-replication mongodb-php


    【解决方案1】:

    您需要将阅读偏好设置为 primaryPreferred。 您需要指定当主要不可用时可以从辅助读取。 默认情况下并非如此。

    Link to documentation

    【讨论】:

      【解决方案2】:

      请检查您的 php mongo pecl lib 版本。 在 1.5.6 之前,有 2 个错误与 PHP 在副本集失败后未选择主服务器有关。 确保 pecl mongo 至少 1.5.6。

      【讨论】:

        猜你喜欢
        • 2015-06-21
        • 1970-01-01
        • 2011-07-14
        • 2023-03-09
        • 2012-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-19
        相关资源
        最近更新 更多