MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDB Ruby Driver 2.5.x Problemi di distinzione tra maiuscole e minuscole con i nomi host sui set di repliche

Hai problemi di connessione ai set di repliche di MongoDB dopo aver aggiornato il driver Ruby di MongoDB alla 2.5.x? Di recente abbiamo ricevuto alcune domande su questo problema con l'ultima versione del driver MongoDB Ruby e abbiamo scritto questo post per condividere i nostri risultati sul problema e sulla causa.

Il messaggio di errore riscontrato durante il tentativo di connessione era -

No server is available matching preference: #<Mongo::ServerSelector::Primary:...>

Il problema era già stato segnalato a MongoDB ed è stato monitorato qui. Abbiamo dedicato del tempo a indagare su questo problema e sulla causa principale introdotta nel codice del driver in 2.5.x.

Riepilogo del problema di MongoDB Ruby Driver 2.5.x

Il problema esiste nelle versioni 2.5.x del driver MongoDB Ruby e si verifica quando i nomi host che compongono il set di repliche contengono caratteri con distinzione tra maiuscole e minuscole, ad esempio, ABC-server1.example.com . Possibili soluzioni alternative sono:

  1.  Esegui il downgrade alla 2.4.xo aggiorna la 2.6.x una volta resa disponibile.
  2. Modifica i nomi host di tutti i membri dei set di repliche in minuscolo. Ad esempio, cambia il nome host nell'esempio sopra in abc-server1.example.com.

Dettagli sulla questione

L'abilitazione dell'accesso dettagliato su Ruby ha fornito un indizio su ciò che stava accadendo:

...
#19140] DEBUG -- : MONGODB | Topology type 'replica set' initializing.
#19140] DEBUG -- : MONGODB | Server sg-connectiontest1-13622.servers.example.com:27017 initializing.
#19140] DEBUG -- : MONGODB | Server description for sg-connectiontest1-2.servers.example.com:27017 changed from 'unknown' to 'unknown'.
#19140] DEBUG -- : MONGODB | Server sg-connectiontest1-13623.servers.example.com:27017 initializing.
#19140] DEBUG -- : MONGODB | Server description for sg-connectiontest1-3.servers.example.com:27017 changed from 'unknown' to 'secondary'.
#19140] DEBUG -- : MONGODB | Server sg-connectiontest1-13624.servers.example.com:27017 initializing.
#19140] DEBUG -- : MONGODB | Server description for sg-connectiontest1-4.servers.example.com:27017 changed from 'unknown' to 'arbiter'.
#19140] DEBUG -- : MONGODB | There was a change in the members of the 'replica set' topology.
C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/mongo-2.5.1/lib/mongo/server_selector/selectable.rb:119:in `select_server': No server is available matching preference: # using server_selection_timeout=30 and local_threshold=0.015 (Mongo::Error::NoServerAvailable)
from lib/ruby/gems/2.4.0/gems/mongo-2.5.1/lib/mongo/database.rb:157:in `command'
from lib/ruby/gems/2.4.0/gems/mongo-2.5.1/lib/mongo/client.rb:404:in `list_databases'
from lib/ruby/gems/2.4.0/gems/mongo-2.5.1/lib/mongo/client.rb:385:in `database_names'
...

Sembrava ovvio che il driver non fosse in grado di rilevare correttamente il ruolo della primaria della replica impostata. Durante il confronto con i log della 2.4.x, era chiaro che ciò avveniva correttamente in quella versione, ovvero il primario era stato correttamente identificato come primario.

] DEBUG -- : MONGODB | Topology type 'replica set' initializing.
] DEBUG -- : MONGODB | Server sg-connectiontest1-13622.servers.example.com:27017 initializing.
] DEBUG -- : MONGODB | Server description for sg-connectiontest1-2.servers.example.com:27017 changed from 'unknown' to 'primary'.
] DEBUG -- : MONGODB | Server sg-connectiontest1-13623.servers.example.com:27017 initializing.
] DEBUG -- : MONGODB | Server description for sg-connectiontest1-3.servers.example.com:27017 changed from 'unknown' to 'secondary'.
] DEBUG -- : MONGODB | Server sg-connectiontest1-13624.servers.example.com:27017 initializing.
] DEBUG -- : MONGODB | Server description for sg-connectiontest1-4.servers.example.com:27017 changed from 'unknown' to 'arbiter'.

L'altro indizio che avevamo era che i nomi dei nostri server erano stati leggermente modificati nei log. Invece del nome vero e proprio SG -connectiontest1-2.servers.example.com , veniva registrato come sg -connectiontest1-2.servers.example.com .

Controllando il codice su come vengono analizzati i nomi host durante l'inizializzazione della connessione e vengono assegnati loro i ruoli, siamo stati in grado di determinare che il codice del driver stava riducendo il case (ad esempio convertendo ABC. example.com su abc.example.com) durante l'analisi della stringa di connessione. Successivamente, il driver si connette al primario per rilevare la topologia utilizzando il comando isMaster. È durante l'analisi del risultato di questo comando che il driver determina il ruolo di ciascun nodo.

MongoDB Ruby Driver 2.5.x Problemi di sensibilità alle maiuscole con i nomi host sui set di replicheFai clic per twittare

Tuttavia, durante il confronto dei nomi host restituiti dal comando con quelli nella stringa di connessione, il driver ignorava di eseguire una corrispondenza senza distinzione tra maiuscole e minuscole. Ciò ha portato a una mancata corrispondenza nei nomi del primario come riportato da MongoDB a ciò che il driver aveva determinato dalla stringa di connessione. Ciò ha fatto sì che il ruolo del primario diventasse sconosciuto e ha portato all'errore di connessione. Il controllo della corrispondenza degli indirizzi nel codice di rilevamento del ruolo è stato aggiunto in 2.5.x.

La correzione del problema è stata mirata alla versione 2.6.0 del driver.