PHP MongoClient“;未找到候选服务器";具有副本集

PHP MongoClient“;未找到候选服务器";具有副本集,php,mongodb,Php,Mongodb,规格:PHP5.3.10、Ubuntu 12.04 64位、Mongo驱动程序1.5.1、MongoDB 2.4.8 我们有一个具有两个辅助副本集的单碎片Mongo。我似乎无法让PHP驱动程序利用副本集进行高性能读/写。在尝试使用下面提供的连接字符串进行连接时,我得到“找不到候选服务器” $connection = new MongoClient("mongodb://10.88.217.247:27017,10.88.217.247:27018",

规格:PHP5.3.10、Ubuntu 12.04 64位、Mongo驱动程序1.5.1、MongoDB 2.4.8

我们有一个具有两个辅助副本集的单碎片Mongo。我似乎无法让PHP驱动程序利用副本集进行高性能读/写。在尝试使用下面提供的连接字符串进行连接时,我得到“找不到候选服务器”

$connection = new MongoClient("mongodb://10.88.217.247:27017,10.88.217.247:27018",
                            array('username'=>"{$username}", 'password'=>"{$password}", 'replicaSet' => true));
这是Mongo log发送的内容:

[Wed Apr 23 22:29:29 2014] [error] [client 170.171.2.122] ismaster: start
[Wed Apr 23 22:29:29 2014] [error] [client 170.171.2.122] send_packet: read from header: 36
[Wed Apr 23 22:29:29 2014] [error] [client 170.171.2.122] send_packet: data_size: 259
[Wed Apr 23 22:29:29 2014] [error] [client 170.171.2.122] ismaster: can't find minWireVersion, defaulting to 0
[Wed Apr 23 22:29:29 2014] [error] [client 170.171.2.122] ismaster: can't find maxWireVersion, defaulting to 0
[Wed Apr 23 22:29:29 2014] [error] [client 170.171.2.122] ismaster: setting maxBsonObjectSize to 16777216
[Wed Apr 23 22:29:29 2014] [error] [client 170.171.2.122] ismaster: setting maxMessageSizeBytes to 48000000
[Wed Apr 23 22:29:29 2014] [error] [client 170.171.2.122] ismaster: can't find maxWriteBatchSize, defaulting to 1000
[Wed Apr 23 22:29:29 2014] [error] [client 170.171.2.122] ismaster: set name: rs-0, ismaster: 1, secondary: 0, is_arbiter: 0
[Wed Apr 23 22:29:29 2014] [error] [client 170.171.2.122] ismaster: the server name (mongo-0-0:27018) did not match with what we thought it'd be (10.88.218.248:27018).
[Wed Apr 23 22:29:29 2014] [error] [client 170.171.2.122] ismaster: the replicaset name is not set, so we're using rs-0.
[Wed Apr 23 22:29:29 2014] [error] [client 170.171.2.122] found host: mongo-0-0:27018
[Wed Apr 23 22:29:29 2014] [error] [client 170.171.2.122] found host: mongo-0-2:27018
[Wed Apr 23 22:29:29 2014] [error] [client 170.171.2.122] found host: mongo-0-1:27018
[Wed Apr 23 22:29:29 2014] [error] [client 170.171.2.122] ismaster: last ran at 1398292169
[Wed Apr 23 22:29:29 2014] [error] [client 170.171.2.122] discover_topology: ismaster worked, but we need to remove the seed host's connection
[Wed Apr 23 22:29:29 2014] [error] [client 170.171.2.122] mongo_connection_destroy: Destroying connection object for 10.88.218.248:27018;-;admin/scal/a6612d715d1a4f9549232ec4d599bf55;12199
[Wed Apr 23 22:29:29 2014] [error] [client 170.171.2.122] mongo_connection_destroy: Closing socket for 10.88.218.248:27018;-;admin/scal/a6612d715d1a4f9549232ec4d599bf55;12199.
[Wed Apr 23 22:29:29 2014] [error] [client 170.171.2.122] discover_topology: ismaster worked
[Wed Apr 23 22:29:29 2014] [error] [client 170.171.2.122] discover_topology: found new host: mongo-0-0:27018
[Wed Apr 23 22:29:29 2014] [error] [client 170.171.2.122] connection_create: creating new connection for mongo-0-0:27018
rs.status()JSON:


}

设置副本集时,您可能需要注意以下几点:

  • 构建副本集时,将使用服务器的主机名命名第一个成员。因此,当您访问服务器时,它不会访问连接字符串中的主机。相反,它从那里获得可用的服务器列表,并尝试连接到该列表中的主机名。我解释了一些细节。您还可以在以下位置找到信息:
要求每个MongoDB服务器都有一个可由客户端计算机解析的DNS名称。每个MongoDB服务器通过isMaster命令报告其主机名,驱动程序使用此名称与服务器通信。当种子列表包含IP地址并且MongoDB服务器报告客户端计算机无法解析的主机名时,可能会发生此问题

  • 访问副本集时,应提供一个replia集名称,参数为replicaSet=[set name],如下所示

    mongodb://hostname1,hostname2/dbName?replicaSet=rs0
    
  • 不要混淆来自不同副本集的服务器,因为:
如果列出了多个服务器,其中一个是副本集的一部分,另一个不是,则连接模式是不确定的。确保连接字符串上没有混合服务器类型

  • 请注意mongo服务器的绑定ip。如果我没记错的话,在一些发行版中,它默认监听127.0.0.1:27017。因此,您将永远无法从来宾计算机连接。尝试在/etc/mongodb.conf中设置以下行:

    绑定ip=0.0.0.0

回到你的问题上来。从日志中:

[Wed Apr 23 22:29:29 2014] [error] [client 170.171.1.123] ismaster: the replicaset name is not set, so we're using rs-0.
它告诉您提供副本集名称。它假设它是rs-0(名称正确吗?)

表示您的副本集中有3个成员。司机将使用他们的名字连接到他们,这将是:

mongo-0-0:27018
mongo-0-1:27018
mongo-0-2:27018
如果希望它们工作,请添加到客户端的/etc/hosts

[ip of mongo] mongo-0-0:27018
[ip of mongo] mongo-0-0:27018
[ip of mongo] mongo-0-0:27018
或者,如果要更改这些名称,请使用以下行:

var conf = rs.conf();
conf.members[0].host = "..." // your new name for member0
conf.member[1].host = "..."
conf.member[2].host = "..."
rs.reconfig(conf)

我不知道这是否重要,但你会在你的问题中编辑你的PHP版本和操作系统平台吗?对于可能涉及平台错误的问题,值得养成添加这些数据的习惯,以防有用。我不知道Mongo,但“replicaset名称未设置,因此我们使用rs-0”是否相关?这是否意味着复制集需要进一步配置?请尝试运行rs.status()并将结果粘贴到您的问题中。刚刚发布了rs.status()的输出,谢谢。这不是完整的输出。完整输出将包含连接选择逻辑详细信息,该详细信息导致您获得的异常。请粘贴完整的日志。此外,您正在将布尔值true传递给“replSet”,这不是您想要的(如日志所示)。请改为传递复制集名称。是的,复制集名称正确。我编辑了带有rs.status()输出的问题以确认这一点。所以驱动程序将尝试连接到mongo-0-0/1/2。你确定这3个名字可以解析吗?顺便问一下,在你的问题中,我注意到你正在连接27017。但是从rs.status()来看,您的服务器似乎都在使用27018。这也可能是个问题,但事实并非如此。我如何将rs配置更改为正确的IP?我编辑我的答案,有两种方法都适用于您。
[ip of mongo] mongo-0-0:27018
[ip of mongo] mongo-0-0:27018
[ip of mongo] mongo-0-0:27018
var conf = rs.conf();
conf.members[0].host = "..." // your new name for member0
conf.member[1].host = "..."
conf.member[2].host = "..."
rs.reconfig(conf)