2015-06-22 17 views
17

To łączy bez opóźnienia:Mongo połączenie php replika bardzo powolny

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

Jednak ta trwa do 10 sekund, kiedy dodać wszystkie hosty z zestawu replik. Sterownik 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)); 

W logu opóźnienie wydaje się znajdować przy każdym połączeniu. Oto fragment z dziennika:

[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 

Kiedy ssh do serwera podstawowego i spróbuj połączyć z terminalem jej szybko, jak dobrze.

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 

Dlaczego połączenie się z PHP trwa tak długo?


20 lipca Aktualizacja:

zaktualizowałem Mongo na moim podstawowego serwera do 2.6.10, ale nadal trwa 5 sekund na mojej stronie testowej, aby załadować. Oto, jak próbuję się połączyć:

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() . "]"); 
} 

Każda pomoc będzie doceniona.

+0

Dwa udostępnione komunikaty dziennika nie wyglądają na zwyczajne. 60 sekund to domyślny limit czasu połączenia używany przez sterownik (przekroczenie limitu czasu gniazd domyślnie wynosi 30 sekund). Czy możesz śledzić z pełnym wyjściem MongoLog (wszystkie moduły i pełną szczegółowością)? Zobacz przykład na [MongoLog :: setCallback()] (http://php.net/manual/en/mongolog.setcallback.php), jeśli potrzebujesz kodu, aby to zrobić. Oczekuję, że pełny dziennik będzie zbyt duży dla PO, ale wystarczający będzie link do istoty i będę mógł przytoczyć odpowiednie linie w odpowiedzi. – jmikola

+0

Witam jmikola. Oto treść: https://gist.githubusercontent.com/castles/a0f08297fcb3fad48b2a/raw/4ff15990a389f6285b9f4fe34813dd8f61d7f97e/gistfile1.txt – Castles

+0

Inne niż połączenie 'demo.example.com.au: 27018', które zajmuje 5 sekund, nie zobacz cokolwiek niezwykłego w dziennikach.Moje pierwsze założenie było takie, że być może twój URI używał innych nazw hostów niż zgłoszonych przez isMaster, w którym to przypadku sterownik nie utrzymywałby połączeń z listą nasion. Czy możesz spróbować odtworzyć opóźnienie połączenia (do tego samego hosta/portu) za pomocą ['socket_create()'] (http://php.net/manual/en/function.socket-create.php) i ['socket_connect () '] (http://php.net/manual/en/function.socket-connect.php)? – jmikola

Odpowiedz

3

Nie widzę żadnych informacji o sprzęcie w twoim pytaniu i pod względem wydajności w moim mongorze Q & A i rozmowie z inżynierami pracującymi dla mongo Rozumiem, że sprawdzenie i wybór właściwego sprzętu i fizycznej lokalizacji sprzętu jest czynnikiem przyspieszającym rzeczy.

1) Czy repliki znajdują się w tym samym centrum danych? Nawet jeśli są w tym samym centrum danych, komunikacja między serwerami przebiega szybko, jeśli chodzi o mierzenie czasu na pingowanie i sprawdzanie linii śledzenia pomiędzy każdą z replik (tj. Od 1 do 2, od 1 do 3, od 2 do 3). Wiele transakcji przechodzi pomiędzy replikami, aby być na bieżąco i jeśli są w różnych centrach danych, które mogą być czynnikiem. Tak więc rozwiązaniem byłoby zapewnienie, że repliki są wystarczająco blisko, a czasem nawet w tym samym centrum danych. Chociaż istnieje coś, co można powiedzieć o posiadaniu repliki w różnych centrach danych w celu uzyskania tolerancji na partycje. 2) RAM i procesor sprzętu może być różnicą, być może zwiększenie tych różnic również przy użyciu dysków SSD przyspiesza wszystko w ogóle.

Ponadto, na marginesie, typem "obejścia" problemu, który widzisz, jest połączenie połączeń z monondb, aby połączenia były łatwo dostępne, ale zdaję sobie sprawę, że nie o to pytasz, jesteś pytanie o samo połączenie i dlaczego jest wolne!

+0

Zrobiłem kilka testów i dwie z replik były superszybkie, ale trzeci było wąskim gardłem. Po obejrzeniu go odkryłem, że to DNS spowalniało działanie. Dodałem dwa pozostałe adresy IP do pliku hosts i zostało to naprawione !!! Dzięki – Castles

Powiązane problemy