sql >> Database >  >> NoSQL >> MongoDB

MongoDB Ruby Driver 2.5.x Hoofdlettergevoeligheidsproblemen met hostnamen op replicasets

Heeft u problemen met het maken van verbinding met MongoDB-replicasets na het upgraden van de MongoDB Ruby-driver naar 2.5.x? We hebben onlangs enkele vragen ontvangen over dit probleem met de nieuwste MongoDB Ruby-stuurprogrammaversie en hebben dit bericht geschreven om onze bevindingen over het probleem en de oorzaak te delen.

De foutmelding die werd aangetroffen bij een verbindingspoging was -

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

Het probleem was al gemeld aan MongoDB en wordt hier gevolgd. We hebben enige tijd besteed aan het onderzoeken van dit probleem en de hoofdoorzaak die is geïntroduceerd in de stuurprogrammacode in 2.5.x.

MongoDB Ruby Driver 2.5.x probleemoverzicht

Het probleem doet zich voor in de 2.5.x-versie(s) van het MongoDB Ruby-stuurprogramma en treedt op wanneer de hostnamen waaruit de replicaset bestaat, hoofdlettergevoelige tekens bevatten, bijvoorbeeld:ABC-server1.example.com . Mogelijke oplossingen zijn:

  1.  Downgrade naar 2.4.x of upgrade 2.6.x zodra het beschikbaar is gemaakt.
  2. Verander de hostnamen van alle leden van de replicasets in kleine letters. Wijzig bijvoorbeeld de hostnaam in het bovenstaande voorbeeld in abc-server1.example.com.

Details over het probleem

Het inschakelen van gedetailleerde logboekregistratie op Ruby gaf een idee van wat er aan de hand was:

...
#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'
...

Het leek duidelijk dat de driver de rol van de primary van de replicaset niet correct kon detecteren. Bij vergelijking met de logboeken van 2.4.x was het duidelijk dat dit in die versie correct gebeurde, d.w.z. de primaire werd correct geïdentificeerd als de primaire.

] 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'.

De andere aanwijzing die we hadden was dat onze servernamen lichtjes waren gewijzigd in de logs. In plaats van de echte naam SG -connectiontest1-2.servers.example.com , het werd gelogd als sg -connectiontest1-2.servers.example.com .

Bij het inspecteren van de code over hoe hostnamen worden geparseerd tijdens het initialiseren van de verbinding en de rollen die eraan worden toegewezen, konden we vaststellen dat de stuurprogrammacode klein was (d.w.z. het omzetten van ABC. voorbeeld.com naar abc.voorbeeld.com) tijdens het ontleden van de verbindingsreeks. Vervolgens maakt het stuurprogramma verbinding met de primaire om de topologie te ontdekken met behulp van de opdracht isMaster. Tijdens het ontleden van het resultaat van deze opdracht bepaalt de driver de rol van elk knooppunt.

MongoDB Ruby Driver 2.5.x Hoofdlettergevoeligheidsproblemen met hostnamen op replicasetsKlik om te tweeten

Tijdens het vergelijken van hostnamen die door de opdracht zijn geretourneerd met die in de verbindingsreeks, negeerde de driver echter om een ​​hoofdletterongevoelige overeenkomst uit te voeren. Dit leidde tot een mismatch in de namen van de primaire zoals gerapporteerd door MongoDB met wat het stuurprogramma had vastgesteld op basis van de verbindingsreeks. Dit zorgde ervoor dat de rol van de primary onbekend werd en leidde tot het mislukken van de verbinding. De controle van de adresovereenkomst in de roldetectiecode is toegevoegd in 2.5.x.

De oplossing voor het probleem is gericht op versie 2.6.0 van het stuurprogramma.


  1. Hoe redis bijwerken na het bijwerken van de database?

  2. 9 ClusterControl-functies die u niet zult vinden in andere hulpprogramma's voor databasebeheer

  3. Kan Redis naar een database zoals PostgreSQL schrijven?

  4. Laravel Caching met Redis is erg traag