Har du problem med att ansluta till MongoDB replikuppsättningar efter att ha uppgraderat MongoDB Ruby drivrutinen till 2.5.x? Vi har nyligen fått några förfrågningar om det här problemet med den senaste MongoDB Ruby-drivrutinversionen och skrev det här inlägget för att dela våra upptäckter om problemet och orsaken.
Felmeddelandet som påträffades vid anslutningsförsöket var -
No server is available matching preference: #<Mongo::ServerSelector::Primary:...>
Problemet hade redan rapporterats till MongoDB och spåras här. Vi ägnade lite tid åt att undersöka detta problem och grundorsaken som introducerades i drivrutinskoden i 2.5.x.
MongoDB Ruby Driver 2.5.x ärendesammanfattning
Problemet finns i 2.5.x-version(er) av MongoDB Ruby-drivrutinen och uppstår när värdnamnen som utgörs av replikuppsättningen innehåller skiftlägeskänsliga tecken, t.ex. ABC-server1.example.com . Möjliga lösningar är:
- Nedgradera till 2.4.x eller uppgradera 2.6.x när den har gjorts tillgänglig.
- Ändra värdnamnen för alla medlemmar i replikuppsättningarna till nedsänkta. Ändra till exempel värdnamnet i exemplet ovan till abc-server1.example.com.
Information om problemet
Att aktivera detaljerad inloggning på Ruby gav en ledtråd om vad som hände:
... #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 verkade uppenbart att föraren inte kunde upptäcka rollen som den primära i replikuppsättningen korrekt. När man jämförde med loggarna från 2.4.x stod det klart att detta brukade ske korrekt på den versionen, dvs. den primära identifierades korrekt som den primära.
] 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 andra ledtråden vi hade var att våra servernamn ändrades något i loggarna. Istället för det faktiska namnet SG -connectiontest1-2.servers.example.com , det loggades som sg -connectiontest1-2.servers.example.com .
När vi inspekterade koden kring hur värdnamn analyseras under anslutningsinitiering och roller tilldelas dem, kunde vi fastställa att drivrutinskoden var nedskriven (dvs. konverterade ABC. example.com till abc.example.com) medan anslutningssträngen analyseras. Därefter ansluter drivrutinen till den primära för att upptäcka topologin med hjälp av kommandot isMaster. Det är när resultatet av detta kommando analyseras som drivrutinen bestämmer rollen för varje nod.
MongoDB Ruby Driver 2.5.x problem med skiftlägeskänslighet med värdnamn på replikuppsättningarKlicka för att tweetaMen medan värdnamnen som returnerades från kommandot jämfördes med de i anslutningssträngen, ignorerade drivrutinen för att utföra en skiftlägesokänslig matchning. Detta ledde till att namnen på den primära som rapporterats av MongoDB inte överensstämde med vad föraren hade bestämt från anslutningssträngen. Detta gjorde att den primära rollen blev okänd och ledde till att anslutningen misslyckades. Adressmatchningskontrollen i rolldetekteringskoden lades till i 2.5.x.
Lättningen till problemet har riktats mot version 2.6.0 av drivrutinen.