Mongodb 未捕获异常';MongoCursorException';带有消息';不能';无法获取连接:未找到候选服务器';

Mongodb 未捕获异常';MongoCursorException';带有消息';不能';无法获取连接:未找到候选服务器';,mongodb,replication,ubuntu-14.04,database-replication,mongodb-php,Mongodb,Replication,Ubuntu 14.04,Database Replication,Mongodb Php,问题描述 我有一个三人副本集,还有一个php web前端,它a)写入一条记录,然后b)对集合执行a.find(),并返回数据库中的所有文档 为了更好地了解副本集的工作原理,我执行了以下操作: 已停止主服务器(mongohost1)上的mongo服务。网页一直在运行 已停止已升级为主服务器(mongohost2)上的mongo服务。此时,即使我有另一个mongo主机(mongohost3)具有相同的数据库,PHP web应用程序仍会失败,并显示上述错误消息 我希望系统至少能让我从数据库中读取记录,

问题描述

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

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

  • 已停止主服务器(mongohost1)上的mongo服务。网页一直在运行
  • 已停止已升级为主服务器(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> 
    
    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
    }
    
    以及每个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> 
    
    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");
    
    我仍在阅读副本集等内容,因此我确信这是我错过/忽略设置的内容。 例如,我没有设置仲裁人。。。 不确定是否有关联,但以防万一,我想我应该提一下。我不知道还要检查什么


    谢谢

    您需要将阅读首选项设置为primaryPreferred。 您需要指定,当主服务器不可用时,可以从辅助服务器读取数据。 默认情况下,情况并非如此


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