2015-06-22 83 views
17

这没有延迟连接:蒙戈PHP副本连接很慢

$connection = new MongoClient("mongodb://localhost:27017", array("replicaSet" => REPLICASET,'username'=>USER, 'password'=>PASSWORD, 'db'=>DATABASE)); 

然而,当我添加的所有主机从副本集中最多需要10秒。 PHP驱动程序(1.6.7)

$connection = new MongoClient("mongodb://".HOST_1.":27017,".HOST_2.":27017,".HOST_3.":27018", array("replicaSet" => REPLICASET,'username'=>USER, 'password'=>PASSWORD, 'db'=>DATABASE)); 

在日志中,延迟似乎是在每个连接处。下面是从日志摘录:

[22-Jun-2015 12:04:41 Australia/ACT] PHP Notice: CON  FINE: Connecting to tcp://ec2-XX-XXX-XXX-XXX.ap-southeast-2.compute.amazonaws.com:27017 (ec2-XX-XXX-XXX-XXX.ap-southeast-2.compute.amazonaws.com:27017;launch;launch/launch/55a850dad20e018890350ece678dc293;15873) with connection timeout: 60.000000 in /home/user/public_html/test.php on line 52 
[22-Jun-2015 12:04:47 Australia/ACT] PHP Notice: CON  INFO: stream_connect: Not establishing SSL for ec2-XX-XXX-XXX-XXX.ap-southeast-2.compute.amazonaws.com:27017 in /home/user/public_html/test.php on line 52 

当我ssh到主服务器,并尝试从终端连接其快速的为好。

mongo --host "launch/host:27017,ec2-XX-XXX-XXX-XXX.ap-southeast-2.compute.amazonaws.com:27017,host2:27018" --authenticationDatabase launch -u USERNAME -p PASSWORD 

为什么PHP需要这么长的时间来连接?


7月20日更新:

我已经更新了我的主服务器上蒙戈到2.6.10,但它仍然需要5秒,我的测试页面加载。这是我试图连接:

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

try { 
    $connection = new MongoClient("mongodb://host1:27017,ec2host1:27017,ec2arbiterhost:27017", array("replicaSet" => "setname",'username'=>USER, 'password'=>PASSWORD, 'db'=>DATABASE)); 

    echo 'connected'; 

} catch (MongoConnectionException $e) { 
    die("Unable to connect to database [code: " . $e->getCode() . "]"); 
} 

任何帮助,将不胜感激。

+0

您共享的两条日志消息不会显得不寻常。 60秒是驱动程序使用的默认连接超时(此后套接字超时默认为30秒)。 你可以跟进你的完整的MongoLog输出(所有模块和完整的冗长)吗?如果您需要一些代码,请参见[MongoLog :: setCallback()](http://php.net/manual/en/mongolog.setcallback.php)上的示例。我预计OP的完整日志可能太大了,但是一个要点的链接就足够了,我可以引用相关的回应。 – jmikola

+0

hi jmikola。这是要点:https://gist.githubusercontent.com/castles/a0f08297fcb3fad48b2a/raw/4ff15990a389f6285b9f4fe34813dd8f61d7f97e/gistfile1.txt – Castles

+0

除了'demo.example.com.au:27018'连接需要5秒钟,我没有在日志中看到任何不寻常的东西。我的第一个假设是,也许你的URI使用的是不同于isMaster报告的主机名,在这种情况下,驱动程序不会保留种子列表连接。你能尝试用['socket_create()'](http://php.net/manual/en/function.socket-create.php)和['socket_connect()来重现连接延迟(到同一个主机/端口) )'](http://php.net/manual/en/function.socket-connect.php)? – jmikola

回答

3

我在您的问题和性能方面没有看到任何硬件信息,我参加mongo Q & A,并与mongo的工程师交谈我了解,检查和选择正确的硬件和硬件的物理位置是一个很大的加快速度的因素。

1)副本是否在同一个数据中心?即使它们在同一个数据中心内,服务器之间的通信速度也很快,测量ping的时间和检查每个副本之间的跟踪路由(即1到2,1到3,2到3) 是否有大量的事务在副本之间传递以保持自己处于最新状态,以及它们是否位于可能成为因素的不同数据中心。因此,一种解决方案是确保副本足够接近,有时甚至在同一个数据中心。尽管在不同的数据中心中使用复制分区来容忍分区容量有些问题。 2)硬件的ram和cpu有所不同,也许会增加这些差异,使用SSD驱动器可以加快速度。

此外,作为一个方面说明,您遇到的问题的一种“解决方法”是将连接池连接到mongodb,以便连接可用,但我意识到这不是您要求的,您是询问连接本身以及为什么它很慢!

+0

我已经做了一些测试,其中两个副本超快,但第三个是瓶颈。玩过它后,我发现它是减缓它的DNS。我添加了其他两个IP到主机文件,它是固定的!谢谢 – Castles