Php MongoConnectionException-未找到候选服务器

Php MongoConnectionException-未找到候选服务器,php,mongodb,mongodb-php,Php,Mongodb,Mongodb Php,我正在使用MongoDB复制集开发一个PHP web应用程序来存储我的数据。我偶尔会收到以下错误: 致命错误:未捕获异常“MongoConnectionException”,消息“未找到候选服务器” 我有一个3人的Mongo副本集和一个仲裁器 rs0:PRIMARY> rs.status() { "set" : "rs0", "date" : ISODate("2013-01-30T01:04:04Z"), "myState" : 1, "members"

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

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

我有一个3人的Mongo副本集和一个仲裁器

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驱动程序(自1.3版起)提供了大量日志记录来调试连接问题。在上有一篇文章解释如何打开它。如果从日志信息中不清楚发生了什么,请使用日志更新您的问题,以便我可以更新我的答案

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

  • 驱动程序无法将名称转换为IP地址。在这种情况下,您需要修复DNS设置,或将所有主机添加到/etc/hosts
  • 你真的无法连接到他们,这可能是一个防火墙
  • 驱动程序的1.2系列中存在一些问题,因此如果您还没有使用1.3.4或更高版本,我建议您升级。这应该是一次更加顺利的体验
  • 请记住,为了能够写入,您需要将大部分节点向上移动。如果没有,则会出现“无候选服务器”错误

mongo配置中提供的主机名是否真的从运行此php脚本的计算机解析?如果您执行了ping.local操作,它会解析为ip地址吗?是的,它们会使用ping和nslookup正确解析。似乎存在相关问题,例如:尝试通过谷歌搜索错误消息以获取更多信息。谢谢。我以前看过同一篇文章。我从每台服务器的配置文件中删除了bind_id=localhost,并使用了10.0.0.x本地IP。例如,一台服务器的mongo.conf现在包含bind_id=10.0.0.50,但是我仍然收到错误。我的副本集中的每台服务器都是Mac。有一次,Windows和Linux机器在网络上找不到我的macservernames.local,因此我将所有4个.local地址添加到我的局域网DNS服务器,以确定它们可能相关。那没用。这件事真让我抓狂。问题来了又去。打开驱动程序日志并更新我的问题。我看到从套接字读取时出错。无法100%确定这是否相关。我每天都从网络上删除EricsMacBookAir和EricsMacBookPro。当我回到存在剩余副本集的网络并开始用php开发时,我遇到了错误。我看到另一篇文章,其中php mongo驱动程序有时会保留旧的连接。当我今天返回到副本集时,我在编码之前立即重新启动了Apache,并且没有发生错误。相关链接:@geekinit,驱动程序的1.2系列中存在一些问题,因此如果您还没有使用1.3.4或更高版本,我建议您升级。这应该是一次更加顺利的体验。但是,请记住,为了能够写入,您需要将大部分节点向上移动。如果没有,则会出现“无候选服务器”错误。-我已用此更新了答案。我已更新到版本1.3.4,似乎问题现在可以更正。非常感谢你的帮助!将mongo驱动程序更新到1.3.7对我有帮助!