2015-04-28 20 views
10

Ho un set di repliche composto da 5 membri: primario + arbitro sul server 1, secondario + arbitro sul server 2, secondario nascosto (nodo di backup) sul server 3. Mi aspetto che questa configurazione funzioni se un server si arresta o perde temporaneamente la connettività.La connessione al set di repliche MongoDB richiede un minuto + in PHP quando un secondario non è raggiungibile

Tuttavia, quando il server 2 è andato giù (quello con i nodi secondario + arbitro), ho riscontrato un problema strano. Qualsiasi connessione al set di repliche di PHP richiedeva più di un minuto. Ho provato a modificare la stringa di connessione per escludere il server che era inattivo (nodo secondario) da esso, ma non ha aiutato.

Allo stesso tempo, la connessione tramite la console mongo funzionava bene. Il nodo primario rimaneva primario. Il registro degli errori di PHP non conteneva errori.

L'unica cosa che ha aiutato è stata la rimozione dei nodi sul server che è andato giù dal set di repliche.

Tuttavia, ora sono preoccupato per il failover della configurazione. Come ora mi rendo conto, se il server con nodi secondari + arbitro cesserà di funzionare, l'intera configurazione smetterà di funzionare correttamente. C'è un modo per evitarlo? Ho bisogno che il client PHP sia in grado di connettersi al primario indipendentemente dal fatto che il server secondario + arbitro sia disponibile o meno. Come raggiungerlo?

La versione della libreria client PHP mongo è 1.6.x, la versione del server è 3.0.

risposta

1

La configurazione non funzionerà se il server 2 si arresta. Il set di repliche ha 3 nodi di voto, due dei quali sono sul server 2. Se il server 2 si arresta, il set ha 1/3 membri in su, quindi non può mantenere o eleggere un primario. Hai bisogno di 2/3 in grado di parlare tra loro per eleggere un primario.

La descrizione del problema non è coerente con il comportamento degli insiemi di repliche: la connessione al primario tramite la shell quando 2/3 non è attiva non mostra il primario rimanente primario. Andrebbe giù al secondario. Sei sicuro di avere i sintomi giusti?

+0

La configurazione comprende 5 membri votanti. I server 1 e 2 hanno 2 membri votanti ciascuno, il server 3 ha 1 membro votante. Quando il server 2 non funziona, abbiamo ancora la maggioranza dei voti online. – mephisto123

1

Basta chiedersi come si presenta la stringa di connessione.

Nella mia esperienza qualcosa di simile avrebbe funzionato su una configurazione di set di repliche:

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

Ma quando RS2 va giù, avrei un'esperienza simile come hai descritto. Si consiglia di assicurarsi di utilizzare il formato corretto stringa di connessione:

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

o

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

+0

Grazie per la risposta. Inizialmente avevo due server nella mia stringa di connessione, ma quando si è verificato questo problema ho modificato la stringa di connessione in "mongodb: //127.0.0.1: 27017? ReplicaSet = RSName" (sul server situato sullo stesso server del server Web) e ancora non ha aiutato :( – mephisto123

Problemi correlati