MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

MongoDB Ruby Driver 2.5.x Problemy z rozróżnianiem wielkości liter w nazwach hostów w zestawach replik

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:

  1.  Zmień wersję na 2.4.x lub zaktualizuj 2.6.x po jej udostępnieniu.
  2. 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.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB bulkWrite()

  2. Konfiguracja środowiska MongoDB | Zainstaluj MongoDB w systemie Windows

  3. Wydajność MongoDB w zapytaniach agregujących

  4. Błąd rzutowania JSON.NET podczas serializacji Mongo ObjectId

  5. Zapytanie Java/MongoDB według daty