2015-04-28 6 views
10

Ich habe ein Replikat-Set bestehend aus 5 Mitgliedern: primäre + Arbiter auf Server 1, sekundäre + Arbiter auf Server 2, versteckte sekundäre (Backup-Knoten) auf Server 3. Ich erwarte, dass diese Konfiguration funktioniert, wenn ein Server ausfällt oder die Verbindung vorübergehend unterbrochen wird.Verbindung zu MongoDB Replikat-Set dauert eine Minute + in PHP, wenn eine sekundäre unerreichbar ist

Allerdings, wenn Server 2 gegangen ist (die mit sekundären + Arbiter-Knoten), habe ich ein seltsames Problem angetroffen. Jede Verbindung mit dem Replikatsatz von PHP dauerte mehr als eine Minute. Ich habe versucht, Verbindungszeichenfolge zu ändern, um den heruntergefahrenen Server (sekundärer Knoten) auszuschließen, aber es hat nicht geholfen.

Zur gleichen Zeit funktionierte die Verbindung über Mongo-Konsole gut. Der primäre Knoten wurde als primärer Knoten beibehalten. Das PHP-Fehlerprotokoll enthielt keine Fehler.

Die einzige Sache, die geholfen hat, war das Entfernen der Knoten auf dem Server, der von der Replikatgruppe untergegangen ist.

Ich mache mir jedoch Sorgen über den Failover der Konfiguration. Wie ich jetzt weiß, wird die gesamte Konfiguration nicht mehr ordnungsgemäß funktionieren, wenn der Server mit sekundären + Arbiter-Knoten ausfällt. Gibt es eine Möglichkeit, es zu vermeiden? Ich brauche den PHP-Client, um eine Verbindung zum primären Server herstellen zu können, unabhängig davon, ob der sekundäre + Arbiter-Server verfügbar ist oder nicht. Wie erreiche ich das?

Version der mongo PHP-Client-Bibliothek ist 1.6.x, Version des Servers ist 3.0.

Antwort

1

Ihre Konfiguration wird nicht funktionieren, wenn Server 2 ausfällt. Ihr Replikat-Set hat 3 Voting-Knoten, von denen sich zwei auf Server 2 befinden. Wenn Server 2 ausfällt, hat das Set 1/3 Mitglieder und kann daher kein Primary verwalten oder auswählen. Sie müssen 2/3 in der Lage sein, miteinander zu reden, um eine Primary zu wählen.

Ihre Beschreibung des Problems ist nicht konsistent mit der Funktionsweise von Replikatgruppen. Wenn die Verbindung zur Primärseite über die Shell hergestellt wird, wenn 2/3 inaktiv sind, wird die primäre verbleibende Primärdatenbank nicht angezeigt. Es würde auf zweitrangig werden. Sind Sie sicher, dass Sie die richtigen Symptome haben?

+0

Die Konfiguration enthält 5 abstimmenden Mitglieder. Server 1 und 2 haben jeweils 2 stimmberechtigte Mitglieder, Server 3 hat 1 stimmberechtigtes Mitglied. Wenn Server 2 ausfällt, haben wir immer noch die Mehrheit der Stimmen online. – mephisto123

1

Fragen Sie sich einfach, wie Ihre Verbindungszeichenfolge aussieht.

Nach meiner Erfahrung so etwas wie dies würde auf einer Replikat-Gruppe Konfiguration arbeiten:

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

Aber wenn rs2 untergeht, würde ich ähnliche Erfahrungen hat, wie Sie beschrieben. Vielleicht möchten Sie die richtige Verbindung String-Format verwenden, stellen Sie sicher:

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

oder

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

+0

Danke für die Antwort. Ich hatte anfangs zwei Server in meinem conn-String, aber als dieses Problem auftrat, änderte ich den conn-String in den "mongodb: //127.0.0.1: 27017? ReplicaSet = RSName" (zu dem Server, der sich auf demselben Server wie der Webserver befindet) und es hat immer noch nicht geholfen :( – mephisto123

Verwandte Themen