2015-06-22 74 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