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

MongoDB Ruby Driver 2.5.x problemer med store og små bogstaver med værtsnavne på replikasæt

Har du problemer med at oprette forbindelse til MongoDB replikasæt efter opgradering af MongoDB Ruby driveren til 2.5.x? Vi har for nylig modtaget et par forespørgsler om dette problem med den seneste MongoDB Ruby-driverversion og skrev dette indlæg for at dele vores resultater om problemet og årsagen.

Fejlmeddelelsen, der blev fundet ved forbindelsesforsøg, var -

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

Problemet var allerede blevet rapporteret til MongoDB og spores her. Vi brugte noget tid på at undersøge dette problem og den grundlæggende årsag introduceret i driverkoden i 2.5.x.

MongoDB Ruby Driver 2.5.x problemoversigt

Problemet findes i 2.5.x-version(er) af MongoDB Ruby-driveren og opstår, når værtsnavnene, der består af replikasættet, indeholder store og små bogstaver, f.eks. ABC-server1.example.com . Mulige løsninger er:

  1.  Nedgrader til 2.4.x eller opgrader 2.6.x, når det er gjort tilgængeligt.
  2. Skift værtsnavnene på alle medlemmer af replikasættene til nedskrivning. Skift f.eks. værtsnavnet i eksemplet ovenfor til abc-server1.example.com.

Detaljer om problemet

Aktivering af detaljeret logning på Ruby gav et fingerpeg om, hvad der skete:

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

Det virkede indlysende, at driveren ikke var i stand til at registrere rollen som den primære af replikasættet korrekt. Ved sammenligning med logfilerne fra 2.4.x var det tydeligt, at dette plejede at ske korrekt på den version, dvs. den primære var korrekt identificeret som den primære.

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

Den anden ledetråd, vi havde, var, at vores servernavne blev ændret lidt i loggene. I stedet for det faktiske navn SG -connectiontest1-2.servers.example.com , den blev logget som sg -connectiontest1-2.servers.example.com .

Ved at inspicere koden omkring, hvordan værtsnavne parses under forbindelsesinitialisering og roller tildeles dem, var vi i stand til at fastslå, at driverkoden var nedadgående (dvs. konvertering af ABC. example.com til abc.example.com), mens forbindelsesstrengen analyseres. Derefter opretter driveren forbindelse til den primære for at opdage topologien ved hjælp af kommandoen isMaster. Det er under parsing af resultatet af denne kommando, at driveren bestemmer rollen for hver node.

MongoDB Ruby Driver 2.5.x problemer med store og små bogstaver med værtsnavne på replikasætKlik for at tweete

Men mens man sammenlignede værtsnavne, der blev returneret fra kommandoen, med dem i forbindelsesstrengen, ignorerede driveren for at udføre et match-uafhængigt af store og små bogstaver. Dette førte til et misforhold i navnene på den primære, som rapporteret af MongoDB, til det, som driveren havde bestemt ud fra forbindelsesstrengen. Dette medførte, at den primære rolle blev ukendt og førte til forbindelsesfejl. Adressematchkontrollen i rolledetekteringskoden blev tilføjet i 2.5.x.

Lettelsen af ​​problemet er målrettet mod version 2.6.0 af driveren.


  1. Skalering af Socket.IO til flere Node.js-processer ved hjælp af klynge

  2. $filter inde i $project MongoDB ved hjælp af Spring Data

  3. Selleri giver forbindelsesnulstilling af peer

  4. LuaSocket, Lua 5.2 og Redis