sql >> Base de Datos >  >> NoSQL >> MongoDB

MongoDB Ruby Driver 2.5.x Problemas de distinción entre mayúsculas y minúsculas con nombres de host en conjuntos de réplicas

¿Tiene problemas para conectarse a conjuntos de réplicas de MongoDB después de actualizar el controlador de Ruby de MongoDB a 2.5.x? Recientemente recibimos algunas consultas sobre este problema con la última versión del controlador MongoDB Ruby y escribimos esta publicación para compartir nuestros hallazgos sobre el problema y la causa.

El mensaje de error que se encontró en el intento de conexión fue -

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

El problema ya se informó a MongoDB y se está rastreando aquí. Dedicamos algo de tiempo a investigar este problema y la causa raíz introducida en el código del controlador en 2.5.x.

MongoDB Ruby Driver 2.5.x Resumen de problemas

El problema existe en la(s) versión(es) 2.5.x del controlador MongoDB Ruby y se encuentra cuando los nombres de host que componen el conjunto de réplicas contienen caracteres que distinguen entre mayúsculas y minúsculas, por ejemplo, ABC-servidor1.ejemplo.com . Las posibles soluciones son:

  1.  Cambie a 2.4.x o actualice 2.6.x una vez que esté disponible.
  2. Cambie los nombres de host de todos los miembros de los conjuntos de réplicas a minúsculas. Por ejemplo, cambie el nombre de host en el ejemplo anterior a abc-server1.example.com.

Detalles sobre el problema

Habilitar el inicio de sesión detallado en Ruby proporcionó una pista de lo que estaba sucediendo:

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

Parecía obvio que el controlador no podía detectar correctamente el rol del primario del conjunto de réplicas. Al comparar con los registros de 2.4.x, estaba claro que esto solía suceder correctamente en esa versión, es decir, el principal se identificó correctamente como el principal.

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

La otra pista que teníamos era que los nombres de nuestros servidores habían cambiado ligeramente en los registros. En lugar del nombre real SG -prueba de conexión1-2.servidores.ejemplo.com , se registraba como sg -prueba de conexión1-2.servidores.ejemplo.com .

Al inspeccionar el código sobre cómo se analizan los nombres de host durante la inicialización de la conexión y cómo se les asignan las funciones, pudimos determinar que el código del controlador se estaba reduciendo (es decir, convirtiendo ABC. example.com a abc.example.com) mientras analiza la cadena de conexión. A continuación, el controlador se conecta al principal para descubrir la topología mediante el comando isMaster. Mientras analiza el resultado de este comando, el controlador determina el rol de cada nodo.

MongoDB Ruby Driver 2.5.x Problemas de distinción entre mayúsculas y minúsculas con nombres de host en conjuntos de réplicasHaga clic para twittear

Sin embargo, al comparar los nombres de host devueltos por el comando con los de la cadena de conexión, el controlador estaba ignorando para realizar una coincidencia que no distinga entre mayúsculas y minúsculas. Esto condujo a una discrepancia en los nombres del primario según lo informado por MongoDB con lo que el controlador había determinado a partir de la cadena de conexión. Esto hizo que la función del principal se volviera desconocida y condujo a la falla de la conexión. La verificación de coincidencia de dirección en el código de detección de roles se agregó en 2.5.x.

La solución al problema se ha dirigido a la versión 2.6.0 del controlador.