2015-04-28 11 views
10

Mam zestaw replik składający się z 5 elementów: primary + arbiter na serwerze 1, secondary + arbiter na serwerze 2, hidden secondary (backup node) na serwerze 3. Oczekuję, że ta konfiguracja zadziała, jeśli jeden serwer przestanie działać lub tymczasowo utraci połączenie.Połączenie z zestawem replik MongoDB zajmuje minutę + w PHP, gdy pomocnicza jest nieosiągalna

Jednak po zaniku serwera 2 (tym z węzłami pomocniczymi + arbitrów) napotkałem dziwny problem. Każde połączenie z zestawem replik z PHP trwało ponad minutę. Próbowałem zmodyfikować ciąg połączenia, aby wykluczyć z niego serwer, który był nieczynny (węzeł dodatkowy), ale to nie pomogło.

W tym samym czasie połączenie za pośrednictwem konsoli mongo działało dobrze. Węzeł główny pozostał główny. Dziennik błędów PHP nie zawierał żadnych błędów.

Jedyną rzeczą, która pomogła w usunięciu węzłów na serwerze, które utraciły swój zestaw replik.

Jednak obecnie martwię się o awarię konfiguracji. Jak teraz rozumiem, jeśli serwer z węzłami pomocniczymi + węzłami arbitrażowymi zostanie wyłączony, cała konfiguracja przestanie działać poprawnie. Czy istnieje sposób, aby tego uniknąć? Potrzebuję klienta PHP, aby móc połączyć się z podstawowym bez względu na to, czy serwer pomocniczy + serwer arbitrażowy jest dostępny, czy nie. Jak to osiągnąć?

Wersja biblioteki klienta PHP mongo to 1.6.x, wersja serwera to 3.0.

Odpowiedz

1

Twoja konfiguracja nie będzie działać, jeśli serwer 2 zostanie wyłączony. Twój zestaw replik ma 3 węzły głosowania, z których dwa znajdują się na serwerze 2. Jeśli serwer 2 przestanie działać, zestaw ma 1/3 członków, więc nie może utrzymywać ani wybrać podstawowego. Potrzebujesz 2/3 możliwości rozmawiania ze sobą, aby wybrać podstawowy.

Twój opis problemu nie jest zgodny z zachowaniem się zestawów replik - połączenie z podstawową poprzez powłokę, gdy 2/3 jest wyłączone, nie pokazuje pierwotnego pozostałego podstawowego. Zejdzie na drugi plan. Czy na pewno masz odpowiednie objawy?

+0

Konfiguracja zawiera 5 członków z prawem głosu. Serwer 1 i 2 ma po 2 członków głosujących, Serwer 3 ma 1 członka głosującego. Kiedy serwer 2 przestanie działać, nadal będziemy mieli większość głosów online. – mephisto123

1

Zastanawiasz się, jak wygląda twój ciąg połączenia.

Z mojego doświadczenia wynika coś jak to będzie działać w konfiguracji zestawu replik:

$m = new MongoClient("mongodb://rs1.example.com:27017,rs2.example.com:27017");

Ale kiedy RS2 idzie w dół, to mam podobne doświadczenia, jak to opisano. Możesz upewnić się, że używany jest prawidłowy format string gra:

$m = new MongoClient("mongodb://rs1.example.com:27017", array("replicaSet" => "myReplSetName"));

lub

$m = new MongoClient("mongodb://rs1.example.com:27017,rs2.example.com:27017/?replicaSet=myReplSetName");

+0

Dziękuję za odpowiedź. Początkowo miałem dwa serwery w łańcuchu połączeń, ale gdy wystąpił ten problem, zmieniłem ciąg połączenia na "mongodb: //127.0.0.1: 27017? ReplicaSet = RSName" (na serwer znajdujący się na tym samym serwerze co serwer sieciowy) i nadal nie pomogło :( – mephisto123

Powiązane problemy