未捕获的异常' MongoCursorException'有消息'无法获得连接:找不到候选服务器'

时间:2014-11-19 19:22:09

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

问题说明

我有一个三个成员副本集,一个php web前端a)写一个记录,然后b)对集合做一个.find()并返回数据库中的所有文件。

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

  1. 停止主服务器(mongohost1)上的mongo服务。网页继续有效。
  2. 停止了升级到主服务器(mongohost2)的服务器上的mongo服务。此时,即使我有另一个具有相同数据库的mongo主机(mongohost3),PHP Web应用程序也会失败并显示上述错误消息。
  3. 我原以为系统会让我至少从数据库中读取记录,即使写入失败也是如此。

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

    所有主机都可以访问。我试着通过每个方框的主机名进行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");
    

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

    感谢。

2 个答案:

答案 0 :(得分:1)

您需要将读取首选项设置为primaryPreferred。 当primary不可用时,您需要指定可以从辅助节点读取。 默认情况下,情况并非如此。

Link to documentation

答案 1 :(得分:0)

请检查您的php mongo pecl lib版本。 在1.5.6之前,有两个错误与在副本集失败后不通过PHP选择主服务器有关。 一定要有pecl mongo至少1.5.6。