Haben Sie nach dem Upgrade des MongoDB-Ruby-Treibers auf 2.5.x Probleme beim Herstellen einer Verbindung zu MongoDB-Replikatsätzen? Wir haben kürzlich einige Anfragen zu diesem Problem mit der neuesten Version des MongoDB Ruby-Treibers erhalten und diesen Beitrag verfasst, um unsere Ergebnisse zu dem Problem und der Ursache mitzuteilen.
Die beim Verbindungsversuch aufgetretene Fehlermeldung war -
No server is available matching preference: #<Mongo::ServerSelector::Primary:...>
Das Problem wurde MongoDB bereits gemeldet und wird hier verfolgt. Wir haben einige Zeit damit verbracht, dieses Problem und die im Treibercode in 2.5.x eingeführte Grundursache zu untersuchen.
Zusammenfassung der Probleme mit MongoDB Ruby Driver 2.5.x
Das Problem existiert in der/den Version(en) 2.5.x des MongoDB-Ruby-Treibers und tritt auf, wenn die Hostnamen des Replikatsatzes Groß-/Kleinschreibung enthalten, z. B. ABC-server1.example.com . Mögliche Problemumgehungen sind:
- Downgrade auf 2.4.x oder Upgrade auf 2.6.x, sobald es verfügbar ist.
- Ändern Sie die Hostnamen aller Mitglieder der Replikatgruppen in Kleinbuchstaben. Ändern Sie beispielsweise den Hostnamen im obigen Beispiel in abc-server1.example.com.
Details zum Problem
Das Aktivieren der detaillierten Protokollierung in Ruby lieferte einen Hinweis darauf, was passiert ist:
... #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' ...
Es schien offensichtlich, dass der Treiber nicht in der Lage war, die Rolle des primären des Replikatsatzes korrekt zu erkennen. Beim Vergleich mit den Protokollen von 2.4.x war klar, dass dies in dieser Version früher korrekt geschah, d. h. der primäre wurde korrekt als primär identifiziert.
] 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'.
Der andere Hinweis, den wir hatten, war, dass unsere Servernamen in den Protokollen leicht geändert wurden. Anstelle des eigentlichen Namens SG -Verbindungstest1-2.servers.example.com , wurde es als sg protokolliert -Verbindungstest1-2.servers.example.com .
Bei der Untersuchung des Codes, wie Hostnamen während der Verbindungsinitialisierung geparst und ihnen Rollen zugewiesen werden, konnten wir feststellen, dass der Treibercode die Groß-/Kleinschreibung heruntergerechnet hat (d. h. ABC. example.com zu abc.example.com), während die Verbindungszeichenfolge analysiert wird. Als Nächstes stellt der Treiber eine Verbindung mit dem Primärserver her, um die Topologie mithilfe des Befehls isMaster zu ermitteln. Beim Analysieren des Ergebnisses dieses Befehls bestimmt der Treiber die Rolle jedes Knotens.
MongoDB Ruby Driver 2.5.x Probleme mit der Groß-/Kleinschreibung bei Hostnamen in ReplikatgruppenClick To TweetBeim Vergleichen der vom Befehl zurückgegebenen Hostnamen mit denen in der Verbindungszeichenfolge ignorierte der Treiber jedoch eine Übereinstimmung ohne Berücksichtigung der Groß-/Kleinschreibung. Dies führte zu einer Nichtübereinstimmung der von MongoDB gemeldeten Namen des primären Servers mit dem, was der Treiber aus der Verbindungszeichenfolge ermittelt hatte. Dadurch wurde die Rolle des Primärservers unbekannt und es kam zum Verbindungsabbruch. Die Adressübereinstimmungsprüfung im Rollenerkennungscode wurde in 2.5.x hinzugefügt.
Die Behebung des Problems wurde auf Version 2.6.0 des Treibers ausgerichtet.