mongo php副本连接很慢

Cas*_*les 17 database-connection mongodb

这没有延迟:

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

但是,当我从副本集添加所有主机时,这最多需要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));
Run Code Online (Sandbox Code Playgroud)

在日志中,延迟似乎在每个连接处.以下是日志的摘录:

[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
Run Code Online (Sandbox Code Playgroud)

当我进入主服务器并尝试从终端快速连接时.

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
Run Code Online (Sandbox Code Playgroud)

为什么PHP需要这么长时间才能连接?


7月20日更新:

我已将主服务器上的mongo更新为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() . "]");
}
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激.

aru*_*uuu 3

我在您的问题中没有看到任何硬件信息,并且在我参加 mongo 问答并与为 mongo 工作的工程师交谈时的性能方面,我明白检查和选择正确的硬件和硬件的物理位置是加快速度的一个重要因素。

1)副本是否位于同一个数据中心?即使它们位于同一数据中心,在测量 ping 时间和检查每个副本(即 1 到 2、1 到 3、2 到 3)之间的跟踪路由方面,服务器之间的通信也很快许多事务在副本之间传递以保持最新状态,如果它们位于不同的数据中心,这可能是一个因素。因此,一种解决方案是确保副本足够接近,有时甚至位于同一数据中心。尽管为了分区容错性而在不同的数据中心中拥有副本还是有一些话要说。2) 硬件的 RAM 和 CPU 会产生影响,也许增加这些也会产生影响,并且使用 SSD 驱动器通常会加快速度。

另外,作为旁注,您所看到的问题的一种“解决方法”是池化与 mongodb 的连接,以便连接随时可用,但我意识到这不是您要问的,您要问的是连接本身以及为什么它很慢!