Docs Menu
Docs Home
/ /

Solución de problemas de conexión

Esta página ofrece posibles soluciones a los problemas que puede encontrar al utilizar el controlador de sincronización MongoDB Kotlin para conectarse a una implementación de MongoDB.

Nota

Esta página solo aborda problemas de conexión. Si experimenta otros problemas al usar MongoDB o el controlador, visite los siguientes recursos:

  • El Página deproblemas y ayuda para obtener información sobre cómo informar errores, contribuir al controlador y encontrar más recursos

  • El MongoDB Página de Stack Overflow o la comunidad Reddit de MongoDB para preguntas, debates o soporte técnico general

Si ocurre un problema al intentar conectarse a un servidor, el controlador de sincronización de Kotlin devuelve un mensaje de error. Si este error se parece al siguiente, indica que el controlador no puede conectarse a una implementación de MongoDB:

Error: couldn't connect to server 127.0.0.1:27017

Las siguientes secciones describen métodos que podrían ayudar a resolver el problema.

Verifique que el nombre de host y el número de puerto en la cadena de conexión sean correctos. En el mensaje de error de ejemplo, el nombre de host es 127.0.0.1 El puerto es 27017. El valor de puerto predeterminado para una instancia de MongoDB Server es 27017, pero puede configurar MongoDB para que escuche en otro puerto.

Al conectarse a un conjunto de réplicas, incluya todos los hosts del conjunto de réplicas en la cadena de conexión. Separe cada host con una coma. Esto permite que el controlador establezca una conexión si uno de los hosts no es accesible.

Para aprender a especificar varios hosts de conjuntos de réplicas, consulte la sección Conjuntos de réplicas de la Guía de conexión.

Si su implementación de MongoDB está alojada tras un firewall, asegúrese de que el puerto de escucha de MongoDB esté abierto en el firewall. Si su implementación escucha en el puerto de red predeterminado, asegúrese de que el puerto 27017 esté abierto en el firewall. Si su implementación escucha en un puerto diferente, asegúrese de que ese puerto esté abierto en el firewall.

Advertencia

No abra un puerto de firewall a menos que esté seguro de que es el que escucha su implementación de MongoDB.

Cada instancia MongoClient admite un número máximo de conexiones abiertas simultáneas en su grupo de conexiones. El parámetro de configuración maxPoolSize define este valor y está establecido en 100 de forma predeterminada. Si el número de conexiones abiertas es igual a maxPoolSize, el servidor espera hasta que haya una conexión disponible. Si este tiempo de espera supera el valor maxIdleTimeMS, el controlador responde con un error.

Para obtener más información sobre cómo funciona la agrupación de conexiones en el controlador, consulte la página Grupos de conexiones.

Es posible que el controlador de sincronización de Kotlin no pueda conectarse a una implementación de MongoDB si la autorización no está configurada correctamente. En estos casos, el controlador genera un mensaje de error similar al siguiente:

Command failed with error 18 (AuthenticationFailed): 'Authentication failed.' on server localhost:27017.

Las siguientes secciones describen métodos que pueden ayudar a resolver el problema.

Una de las causas más comunes de problemas de autenticación es el formato de credenciales no válido en la cadena de conexión de MongoDB.

Tip

Para obtener más información sobre el uso de cadenas de conexión,consulte URI de conexión en la Guía de conexión.

Si su cadena de conexión contiene un nombre de usuario y una contraseña, asegúrese de que tengan el formato correcto.

Nota

Si su nombre de usuario o contraseña incluye alguno de los siguientes caracteres, deberá codificarlo con un porcentaje:

: / ? # [ ] @

Utilice su nombre de usuario y contraseña codificados en porcentaje en su cadena de conexión.

Asegúrate de que tus credenciales y mecanismo de autenticación sean correctos. Se puede especificar tus credenciales de autenticación en las opciones de tu cadena de conexión.

Si se construye un cliente con un MongoCredential, el método de construcción corresponde al mecanismo de autenticación. El siguiente código muestra el método de construcción para el mecanismo de autenticación SCRAM-SHA-256:

val credential = MongoCredential.createScramSha256Credential(
"<db_username>", "<authenticationDb>", "<db_password>".toCharArray()
)
val settings = MongoClientSettings.builder()
.applyToClusterSettings { builder: ClusterSettings.Builder ->
builder.hosts(
listOf(ServerAddress("<hostname>", <port>))
)
}
.credential(credential)
.build()
val mongoClient = MongoClient.create(settings)

Para obtener más información sobre cómo especificar mecanismos de autenticación, consulte la sección Mecanismos de autenticación.

Cuando se utiliza un método de autenticación basado en nombre de usuario y contraseña, el nombre de usuario debe estar definido en la base de datos de autenticación.

La base de datos de autenticación predeterminada es admin. Para usar una base de datos diferente para la autenticación, especifique la opción authSource en la cadena de conexión.

El siguiente ejemplo indica a MongoDB que utilice la base de datos users como base de datos de autenticación:

val mongoClient = MongoClient.create("mongodb://<db_username>:<db_password>@<hostname>:<port>/?authSource=users");

El controlador Kotlin sincronizar puede no ser capaz de resolver tu conexión DNS. Cuando esto sucede, puede que recibas un mensaje de error similar al siguiente:

com.mongodb.MongoSocketWriteException: Exception sending message

Si el controlador informa este error, pruebe los métodos de las siguientes secciones para resolver el problema.

Si se está conectando a MongoDB Atlas y su controlador no puede encontrar el host DNS de la implementación de la base de datos Atlas, es posible que la implementación de la base de datos se pause o elimine.

Asegúrese de que la implementación de la base de datos exista en Atlas. Si el clúster está en pausa, puede reanudarlo en la interfaz de usuario de Atlas o en la interfaz de línea de comandos de Atlas.

Para saber cómo reanudar un clúster,consulte Reanudar un clúster en la documentación de Atlas.

Verifica que las direcciones de red o nombres de host en tu cadena de conexión sean precisos.

Si su implementación está alojada en MongoDB Atlas, puede seguir el tutorial Conectarse a su clúster para encontrar su cadena de conexión Atlas.

Al enviar mensajes al servidor a través del controlador, a veces estos tardan en responder. En este caso, podría recibir un mensaje de error similar a uno de los siguientes:

Timed out after 30000 ms while waiting for a server that matches ReadPreferenceServerSelector{readPreference=primary}.
No server chosen by ReadPreferenceServerSelector{readPreference=primary} from cluster description

Si recibes uno de estos errores, intenta los siguientes métodos para resolver el problema.

La opción maxConnectionTimeoutMS indica el tiempo que el controlador de Kotlin Sync espera una conexión antes de agotar el tiempo de espera. El valor predeterminado es 10000. Puede aumentar este valor o establecerlo en 0 si desea que el controlador nunca agote el tiempo de espera.

Considere configurar maxConnectionLifeTime maxConnectionIdleTimey. Estos parámetros configuran el tiempo durante el cual el controlador mantiene la conexión con una instancia de MongoDB. Para obtener más información sobre estos parámetros, consulte Grupos de conexiones.

Es posible que su aplicación no pueda completar una solicitud incluso cuando algunos servidores estén disponibles, lo que provoca que el controlador devuelva una excepción de tiempo de espera de selección de servidor.

Esta excepción es de tipo MongoTimeoutException. A continuación, se muestra un ejemplo de la excepción que se produce si se intenta enviar una solicitud a un conjunto de réplicas en el que no se puede acceder a la réplica principal:

com.mongodb.MongoTimeoutException:
Timed out while waiting for a server that matches ReadPreferenceServerSelector{readPreference=primary}.
Client view of cluster state is
{type=REPLICA_SET,
servers=[
{address=localhost:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.ConnectException: Connection refused}},
{address=localhost:27018, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.ConnectException: Connection refused}},
{address=localhost:27019, type=REPLICA_SET_SECONDARY, roundTripTime=15.0 ms, state=CONNECTED}
]
}

El error incluye una vista del estado del clúster que describe el estado de conexión de cada nodo, lo que puede ayudarlo a identificar el origen de su problema de conexión.

En el error anterior, el único servidor conectado, localhost:27019, es un nodo secundario. Por ello, la solicitud agota el tiempo de espera, ya que el controlador no puede seleccionar un servidor que cumpla con la preferencia de lectura primary. En esta situación, aún puede realizar operaciones de lectura en el nodo secundario conectado si establece la preferencia de lectura en secondary, secondaryPreferred o nearest.

También puede especificar la serverSelectionTimeoutMS opción de conexión para ajustar el tiempo que el controlador debe tardar en seleccionar un servidor. Para obtener más información, consulte la guía "Especificar opciones de conexión".

Esta sección muestra errores de conexión que no entran en una categoría más amplia.

INFO: Exception in monitor thread while connecting to server ssc-cluster-01-shard-00-02.9cbnp.mongodb.net:27017

Esta línea de registro indica que el monitor que verifica continuamente el estado de cada miembro del conjunto de réplicas o del servidor mongos no pudo contactar con uno de los nodos o servidores. Este mensaje es normal durante las operaciones de mantenimiento del servidor y se puede ignorar sin problemas.

javax.net.ssl.SSLHandshakeException: extension (5) should not be presented in certificate_request

Este es un problema conocido en ciertas versiones del JDK que puede ocurrir al intentar conectarse mediante el protocolo TLS 1.3.

Si encuentra este error al conectarse a su instancia o clúster de MongoDB, actualice su JDK a una de las siguientes versiones de parche o más recientes:

  • JDK 11.0.7

  • JDK 13.0.3

  • JDK 14.0.2

Para obtener más información sobre este problema, consulte la descripción del problema en el rastreador de errores del sistema OpenJDK.

Si bien no está relacionado con un mensaje de error específico, esta sección incluye información que puede ayudar en el proceso de solución de problemas de conexión.

Puede utilizar la propiedad del sistema -Djavax.net.debug=all para habilitar el registro de nivel de depuración relacionado con todas las conexiones, incluidas aquellas establecidas mediante TLS/SSL.

Habilitar el registro a nivel de depuración puede ayudarle a diagnosticar la raíz del problema de conexión. Para obtener más información sobre los mensajes de registro TLS/SSL, consulte la documentación de Java sobre depuración de conexiones SSL/TLS.

Volver

AWS Lambda