【问题标题】:MongoConnectionException - No candidate servers foundMongoConnectionException - 未找到候选服务器
【发布时间】:2013-01-30 01:25:08
【问题描述】:

我正在开发一个 PHP Web 应用程序,使用 MongoDB 副本集来存储我的数据。我偶尔会收到以下错误:

致命错误:未捕获异常“MongoConnectionException”,消息“未找到候选服务器”

我有一个 3 成员 Mongo 副本集和 1 个仲裁器

rs0:PRIMARY> rs.status()
{
    "set" : "rs0",
    "date" : ISODate("2013-01-30T01:04:04Z"),
    "myState" : 1,
    "members" : [
        {
            "_id" : 0,
            "name" : "JenEricsMacPro.local:27017",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",
            "uptime" : 844478,
            "optime" : Timestamp(1359507378000, 1),
            "optimeDate" : ISODate("2013-01-30T00:56:18Z"),
            "self" : true
        },
        {
            "_id" : 1,
            "name" : "ericsmacbookpro.local:27017",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 10720,
            "optime" : Timestamp(1359507378000, 1),
            "optimeDate" : ISODate("2013-01-30T00:56:18Z"),
            "lastHeartbeat" : ISODate("2013-01-30T01:04:04Z"),
            "pingMs" : 3
        },
        {
            "_id" : 2,
            "name" : "ericsmacbookair.local:27017",
            "health" : 1,
            "state" : 7,
            "stateStr" : "ARBITER",
            "uptime" : 1206,
            "lastHeartbeat" : ISODate("2013-01-30T01:04:03Z"),
            "pingMs" : 4
        },
        {
            "_id" : 3,
            "name" : "ericsmacxps.local:27017",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 75204,
            "optime" : Timestamp(1359507378000, 1),
            "optimeDate" : ISODate("2013-01-30T00:56:18Z"),
            "lastHeartbeat" : ISODate("2013-01-30T01:04:03Z"),
            "pingMs" : 1
        }
    ],
    "ok" : 1
}

以下是我偶尔收到此错误的代码示例。

$mongoConfig = array (
    'uri' => 'mongodb://JenEricsMacPro.local:27017,ericsmacbookpro.local:27017,ericsmacxps.local:27017/',
    'database' => 'myDatabase',
    'replicaSetArray' => array('replicaSet' => 'rs0'));

$connection = new MongoClient(
    $mongoConfig['uri'],
    $mongoConfig['replicaSetArray']);

$connection->setReadPreference(MongoClient::RP_SECONDARY_PREFERRED);

$db = $connection->selectDB($mongoConfig['database']);

任何人都知道可能导致“未找到候选服务器”消息的原因或关于如何确定问题根源的任何建议?

我所有的 mongo.conf 文件都使用每台服务器的静态 IP,没有防火墙和 DNS 似乎正确解析到我网络上的 .local 域。

编辑:我在实例化 MongoClient 之前添加了 Derick 建议的日志记录。

error_reporting (E_NOTICE);

MongoLog::setModule( MongoLog::ALL );
MongoLog::setLevel( MongoLog::ALL );

启用日志记录后,我收到以下通知。

Notice: PARSE INFO: Parsing mongodb://JenEricsMacPro.local:27017,ericsmacbookpro.local:27017,ericsmacxps.local:27017/ in MongoLogic.php on line 27
Notice: PARSE INFO: - Found node: JenEricsMacPro.local:27017 in MongoLogic.php on line 27
Notice: PARSE INFO: - Found node: ericsmacbookpro.local:27017 in MongoLogic.php on line 27
Notice: PARSE INFO: - Found node: ericsmacxps.local:27017 in MongoLogic.php on line 27
Notice: PARSE INFO: - Connection type: MULTIPLE in MongoLogic.php on line 27
Notice: PARSE INFO: - Found option 'replicaSet': 'rs0' in MongoLogic.php on line 27
Notice: PARSE INFO: - Switching connection type: REPLSET in MongoLogic.php on line 27
Notice: CON INFO: mongo_get_read_write_connection: finding a REPLSET connection (read) in MongoLogic.php on line 27
Notice: CON FINE: found connection JenEricsMacPro.local:27017;rs0;X;297 (looking for JenEricsMacPro.local:27017;rs0;X;297) in MongoLogic.php on line 27
Notice: CON INFO: is_ping: pinging JenEricsMacPro.local:27017;rs0;X;297 in MongoLogic.php on line 27
Notice: CON FINE: mongo_connection_destroy: Closing socket for JenEricsMacPro.local:27017;rs0;X;297. in MongoLogic.php on line 27
Notice: CON INFO: freeing connection JenEricsMacPro.local:27017;rs0;X;297 in MongoLogic.php on line 27
Notice: CON WARN: Couldn't connect to 'JenEricsMacPro.local:27017': send_package: error reading from socket: Operation timed out in MongoLogic.php on line 27
Notice: CON FINE: found connection ericsmacbookpro.local:27017;rs0;X;297 (looking for ericsmacbookpro.local:27017;rs0;X;297) in MongoLogic.php on line 27
Notice: CON INFO: is_ping: pinging ericsmacbookpro.local:27017;rs0;X;297 in MongoLogic.php on line 27
Notice: CON FINE: mongo_connection_destroy: Closing socket for ericsmacbookpro.local:27017;rs0;X;297. in MongoLogic.php on line 27
Notice: CON INFO: freeing connection ericsmacbookpro.local:27017;rs0;X;297 in MongoLogic.php on line 27
Notice: CON WARN: Couldn't connect to 'ericsmacbookpro.local:27017': send_package: error reading from socket: Operation timed out in MongoLogic.php on line 27
Notice: CON FINE: found connection ericsmacxps.local:27017;rs0;X;297 (looking for ericsmacxps.local:27017;rs0;X;297) in MongoLogic.php on line 27
Notice: CON INFO: is_ping: pinging ericsmacxps.local:27017;rs0;X;297 in MongoLogic.php on line 27
Notice: CON FINE: mongo_connection_destroy: Closing socket for ericsmacxps.local:27017;rs0;X;297. in MongoLogic.php on line 27
Notice: CON INFO: freeing connection ericsmacxps.local:27017;rs0;X;297 in MongoLogic.php on line 27
Notice: CON WARN: Couldn't connect to 'ericsmacxps.local:27017': send_package: error reading from socket: Operation timed out in MongoLogic.php on line 27
Notice: CON FINE: discover_topology: checking ismaster for JenEricsMacPro.local:27017;rs0;X;297 in MongoLogic.php on line 27
Notice: CON WARN: discover_topology: couldn't create a connection for JenEricsMacPro.local:27017;rs0;X;297 in MongoLogic.php on line 27
Notice: CON FINE: discover_topology: checking ismaster for ericsmacbookpro.local:27017;rs0;X;297 in MongoLogic.php on line 27
Notice: CON WARN: discover_topology: couldn't create a connection for ericsmacbookpro.local:27017;rs0;X;297 in MongoLogic.php on line 27
Notice: CON FINE: discover_topology: checking ismaster for ericsmacxps.local:27017;rs0;X;297 in MongoLogic.php on line 27
Notice: CON WARN: discover_topology: couldn't create a connection for ericsmacxps.local:27017;rs0;X;297 in MongoLogic.php on line 27
Notice: REPLSET FINE: finding candidate servers in MongoLogic.php on line 27
Notice: REPLSET FINE: - all servers in MongoLogic.php on line 27
Notice: REPLSET FINE: filter_connections: adding connections: in MongoLogic.php on line 27
Notice: REPLSET FINE: filter_connections: done in MongoLogic.php on line 27
Notice: REPLSET FINE: limiting to servers with same replicaset name in MongoLogic.php on line 27
Notice: REPLSET FINE: limiting to servers with same replicaset name: done in MongoLogic.php on line 27
Notice: REPLSET FINE: limiting by credentials in MongoLogic.php on line 27
Notice: REPLSET FINE: limiting by credentials: done in MongoLogic.php on line 27

【问题讨论】:

  • 您的 mongo 配置中提供的主机名是否实际上是从您运行此 php 脚本的计算机上解析的?如果你做了ping JenEricsMacPro.local,它会解析为一个IP地址吗?
  • 是的,它们使用 ping 和 nslookup 正确解析。
  • 似乎存在相关问题,例如:groups.google.com/forum/?fromgroups=#!topic/mongodb-user/… 尝试谷歌搜索错误消息以获取更多信息。
  • 谢谢。我以前遇到过同一篇文章。我从每台服务器的配置文件中删除了 bind_id = localhost,并使用了 10.0.0.x 本地 IP。例如,一台服务器的 mongo.conf 现在包含 bind_id = 10.0.0.50,但我仍然收到错误消息。我的副本集中的每台服务器都是一台 Mac。有一次,Windows 和 Linux 机器在网络上找不到我的 macservernames.local,所以我将所有 4 个 .local 地址添加到我的 LAN 的 DNS 服务器中,认为这可能是相关的。那没有帮助。我真的在这个问题上摸不着头脑。问题来了又去。

标签: php mongodb mongodb-php


【解决方案1】:

我建议您添加日志记录以了解发生了什么。 Mongo 驱动程序(自 1.3 版起)提供广泛日志记录以调试连接问题。 http://derickrethans.nl/mongodb-debugging.html有一篇文章解释了如何开启它。如果从日志信息中不清楚发生了什么,请使用日志更新您的问题,以便我可以更新我的答案。

从发布的日志中,我可以看到您的客户端无法从您的连接字符串连接到 任何 种子。如果您的机器/客户端无法连接,您当然无法与 MongoDB 对话。在这种情况下,可能有几种可能性:

  • 驱动程序无法将名称转换为 IP 地址。在这种情况下,您需要修复 DNS 设置,或将所有主机添加到 /etc/hosts
  • 您确实无法连接到它们,这可能是防火墙的阻碍。
  • 1.2系列的驱动存在一些问题,所以如果你还没有使用1.3.4或更高版本,我建议你升级。这应该是一个更流畅的体验。
  • 请记住,您需要启动大部分节点才能进行写入。如果没有,您将收到“没有候选服务器”错误。

【讨论】:

  • 开启驱动程序日志并更新了我的问题。我看到从套接字读取的错误。
  • 不是 100% 确定这是相关的。我每天都从网络中删除 EricsMacBookAir 和 EricsMacBookPro。当我回到存在剩余副本集并开始在 php 中开发的网络时,我遇到了错误。我看到另一个帖子,其中 php mongo 驱动程序有时会保留旧连接。当我今天返回副本集时,我在编码之前立即重新启动了 Apache,并且没有发生错误。相关链接:stackoverflow.com/questions/14249768/…
  • @geekinit,1.2系列的驱动存在一些问题,所以如果你还没有使用1.3.4或更高版本,我建议你升级。这应该是一个更流畅的体验。但是请记住,您需要大部分节点才能进行写入。如果你没有那个,那么你会得到“没有候选服务器”错误。-我已经用这个更新了答案。
  • 我已更新到 1.3.4 版,现在看来问题可能已得到纠正。非常感谢您的帮助!
  • 将 mongo 驱动程序更新到 1.3.7 对我有帮助!
猜你喜欢
  • 2013-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-06
  • 2020-01-04
  • 2020-12-06
  • 2013-07-26
  • 1970-01-01
相关资源
最近更新 更多