Masz problemy z połączeniem z zestawami replik MongoDB po uaktualnieniu sterownika MongoDB Ruby do wersji 2.5.x? Niedawno otrzymaliśmy kilka zapytań dotyczących tego problemu z najnowszą wersją sterownika MongoDB Ruby i napisaliśmy ten post, aby podzielić się naszymi ustaleniami na temat problemu i przyczyny.
Komunikat o błędzie, który pojawił się podczas próby połączenia, to -
No server is available matching preference: #<Mongo::ServerSelector::Primary:...>
Problem został już zgłoszony do MongoDB i jest tutaj śledzony. Spędziliśmy trochę czasu, aby zbadać ten problem i główną przyczynę wprowadzoną w kodzie sterownika w wersji 2.5.x.
Podsumowanie problemu MongoDB Ruby Driver 2.5.x
Problem występuje w wersjach 2.5.x sterownika MongoDB Ruby i występuje, gdy nazwy hostów składające się z zestawu replik zawierają znaki z rozróżnianiem wielkości liter, na przykład ABC-server1.example.com . Możliwe obejścia to:
- Zmień wersję na 2.4.x lub zaktualizuj 2.6.x po jej udostępnieniu.
- Zmień nazwy hostów wszystkich członków zestawów replik na małe litery. Na przykład zmień nazwę hosta w powyższym przykładzie na abc-server1.example.com.
Szczegóły dotyczące problemu
Włączenie szczegółowego logowania w Rubim dało wskazówkę, co się dzieje:
... #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' ...
Wydawało się oczywiste, że kierowca nie był w stanie prawidłowo wykryć roli podstawowego zestawu repliki. Porównując logi z wersji 2.4.x, stało się jasne, że w tej wersji miało to miejsce poprawnie, tj. podstawowy został poprawnie zidentyfikowany jako podstawowy.
] 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'.
Inną wskazówką, jaką mieliśmy, było to, że nazwy naszych serwerów zostały nieznacznie zmienione w dziennikach. Zamiast rzeczywistej nazwy SG -connectiontest1-2.servers.example.com , był rejestrowany jako sg -connectiontest1-2.servers.example.com .
Podczas sprawdzania kodu pod kątem analizowania nazw hostów podczas inicjalizacji połączenia i przypisywania im ról, udało nam się ustalić, że kod sterownika nie zawiera liter (tj. konwertuje ABC. example.com na abc.example.com) podczas analizowania parametrów połączenia. Następnie sterownik łączy się z podstawowym, aby wykryć topologię za pomocą polecenia isMaster. Podczas analizowania wyniku tego polecenia sterownik określa rolę każdego węzła.
MongoDB Ruby Driver 2.5.x Problemy z rozróżnianiem wielkości liter w nazwach hostów w zestawach replikKliknij, aby tweetowaćJednak podczas porównywania nazw hostów zwróconych z polecenia z nazwami w ciągu połączenia sterownik ignorował, aby przeprowadzić dopasowanie bez uwzględniania wielkości liter. Doprowadziło to do niezgodności nazw podstawowych zgłoszonych przez MongoDB z tym, co sterownik określił na podstawie parametrów połączenia. To spowodowało, że rola podstawowego stała się nieznana i doprowadziło do awarii połączenia. Sprawdzanie dopasowania adresu w kodzie wykrywania ról zostało dodane w 2.5.x.
Rozwiązanie problemu zostało skierowane do wersji 2.6.0 sterownika.