Problemas de conectividad - Amazon DocumentDB

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Problemas de conectividad

¿Tiene problemas para conectarse? A continuación se muestran algunos escenarios comunes y cómo resolverlos.

Temas

No se puede conectar a un punto de conexión de Amazon DocumentDB

Al intentar conectarse a Amazon DocumentDB, el siguiente es uno de los mensajes de error más comunes que podría encontrarse.

connecting to: mongodb://docdb-2018-11-08-21-47-27.cluster-ccuszbx3pn5e.us-east- 1.docdb.amazonaws.com:27017/ 2018-11-14T14:33:46.451-0800 W NETWORK [thread1] Failed to connect to 172.31.91.193:27017 after 5000ms milliseconds, giving up. 2018-11-14T14:33:46.452-0800 E QUERY [thread1] Error: couldn't connect to server docdb-2018-11-08-21-47-27.cluster-ccuszbx3pn5e.us-east-1.docdb.amazonaws.com:27017, connection attempt failed : connect@src/mongo/shell/mongo.js:237:13 @(connect):1:6 exception: connect failed

Este mensaje de error normalmente significa que el cliente (el intérprete de comandos de mongo, en este ejemplo) no puede obtener acceso al punto de conexión de Amazon DocumentDB. Esto puede deberse a varios motivos:

Conexión desde puntos de conexión públicos

Está intentando conectarse a un clúster de Amazon DocumentDB directamente desde un portátil o un equipo de desarrollo local.

Se producirá un error al intentar conectarse a un clúster de Amazon DocumentDB directamente desde un dispositivo de punto de conexión público, como una laptop o una máquina de desarrollo local. Amazon DocumentDB solo está diseñado para una nube privada virtual (VPC) y actualmente no admite puntos de conexión públicos. Por lo tanto, no puede conectarse directamente a su clúster de Amazon DocumentDB desde un portátil o un entorno de desarrollo local que esté fuera de la VPC.

Para conectarse a un clúster de Amazon DocumentDB desde fuera de una VPC de Amazon, puede utilizar un túnel de SSH. Para obtener más información, consulte Conexión a un clúster de Amazon DocumentDB desde fuera de una Amazon VPC. Asimismo, si su entorno de desarrollo se encuentra en una VPC distinta, también puede utilizar una interconexión de VPC y conectarse a su clúster de Amazon DocumentDB desde otra VPC de Amazon que esté en la misma región o en una región diferente.

Conexiones entre regiones

Está intentando conectarse a un clúster de Amazon DocumentDB de otra región.

Si intenta conectarse a un clúster de Amazon DocumentDB desde una instancia de Amazon EC2 en una región distinta a la región del clúster (por ejemplo, si intenta conectarse a un clúster en región este de EE. UU. (Norte de Virginia) (us-east-1) desde la región oeste de EE. UU. (Oregón) (us-west-2), la conexión fallará.

Para verificar la región del clúster de Amazon DocumentDB, ejecute el siguiente comando. La región está en el punto de conexión.

aws docdb describe-db-clusters \ --db-cluster-identifier sample-cluster \ --query 'DBClusters[*].Endpoint'

La salida de esta operación será similar a lo que se indica a continuación.

[ "sample-cluster.node.us-east-1.docdb.amazonaws.com" ]

Para verificar la región de la instancia EC2, ejecute el siguiente comando.

aws ec2 describe-instances \ --query 'Reservations[*].Instances[*].Placement.AvailabilityZone'

La salida de esta operación será similar a lo que se indica a continuación.

[ [ "us-east-1a" ] ]

Conexión desde diferentes Amazon VPC

Está intentando conectarse a un clúster de Amazon DocumentDB desde una VPC distinta de la VPC de Amazon en la que se ha implementado el clúster.

Si tanto el clúster de Amazon DocumentDB como la instancia de Amazon EC2 se encuentran en la Región de AWS misma Amazon VPC, pero no en la misma, no podrá conectarse directamente a su clúster de Amazon DocumentDB a menos que esté habilitado el emparejamiento de VPC entre las dos Amazon VPC.

Para comprobar la Amazon VPC de su instancia de Amazon DocumentDB, ejecute el siguiente comando.

aws docdb describe-db-instances \ --db-instance-identifier sample-instance \ --query 'DBInstances[*].DBSubnetGroup.VpcId'

Para comprobar la Amazon VPC de su instancia de Amazon EC2, ejecute el siguiente comando.

aws ec2 describe-instances \ --query 'Reservations[*].Instances[*].VpcId'

Conexiones entrantes en bloques del grupo de seguridad

Está intentando conectarse a un clúster de Amazon DocumentDB, pero el grupo de seguridad del clúster no admite conexiones entrantes en el puerto del clúster (el puerto predeterminado es el 27017).

Supongamos que el clúster de Amazon DocumentDB y la instancia Amazon EC2 se encuentran en la misma región y la VPC de Amazon, y utiliza el mismo grupo de seguridad de Amazon VPC. Si no puede conectarse al clúster de Amazon DocumentDB, es probable que la causa sea que el grupo de seguridad (es decir, el firewall) del clúster no permite las conexiones entrantes en el puerto que eligió para el clúster de Amazon DocumentDB (el puerto predeterminado es el 27017).

Para verificar el puerto del clúster de Amazon DocumentDB, ejecute el siguiente comando.

aws docdb describe-db-clusters \ --db-cluster-identifier sample-cluster \ --query 'DBClusters[*].[DBClusterIdentifier,Port]'

Para obtener el grupo de seguridad de Amazon DocumentDB de su clúster, ejecute el siguiente comando.

aws docdb describe-db-clusters \ --db-cluster-identifier sample-cluster \ --query 'DBClusters[*].[VpcSecurityGroups[*],VpcSecurityGroupId]'

Para comprobar las reglas de entrada del grupo de seguridad, consulte los temas siguientes de la documentación de Amazon EC2:

Problema de preferencia de lectura del controlador Java Mongo

No se respetan las preferencias de lectura del cliente y algunos clientes no pueden escribir en Amazon DocumentDB después de una conmutación por error a menos que reinicien.

Este problema, descubierto por primera vez en Java Mongo Driver 3.7.x, se produce cuando un cliente establece una conexión con Amazon DocumentDB mediante MongoClientSettings y, específicamente, al encadenar el método applyToClusterSettings. La configuración del MongoClient clúster se puede definir mediante varios métodos diferentes, como, y. hosts() requiredReplicaSetName() mode()

Cuando el cliente especifica solo un host en el método hosts(), el modo se establece en ClusterConnectionMode.SINGLE lugar de ClusterConnectionMode.MULTIPLE. Esto hace que el cliente ignore la preferencia de lectura y solo se conecte al servidor configurado en hosts(). Por lo tanto, incluso si la configuración del cliente se inicializa como se muestra a continuación, todas las lecturas seguirán yendo a la principal en lugar de a la secundaria.

final ServerAddress serverAddress0 = new ServerAddress("cluster-endpoint", 27317)); final MongoCredential credential = MongoCredential.createCredential("xxx", "admin", "xxxx".toCharArray()); final MongoClientSettings settings = MongoClientSettings.builder() .credential(credential) .readPreference(ReadPreference.secondaryPreferred()) .retryWrites(false) .applyToSslSettings(builder -> builder .enabled(false)) .applyToClusterSettings(builder -> builder.hosts( Arrays.asList(serverAddress0 )) .requiredReplicaSetName("rs0")) .build(); MongoClient mongoClient = MongoClients.create(settings);

Caso de conmutación por error

Con la configuración de conexión del cliente anterior, si se produce una conmutación por error y se retrasa la actualización del registro de DNS en el punto de conexión del escritor del clúster, el cliente seguirá intentando realizar escrituras en el antiguo escritor (que ahora se lee tras la conmutación por error). Esto provoca un error en el servidor (no en el maestro) que el controlador de Java no gestiona adecuadamente (el problema aún se está investigando). Por lo tanto, el cliente puede quedar en mal estado hasta que se reinicie el servidor de aplicaciones, por ejemplo.

Existen dos soluciones alternativas para ello:

  • Los clientes que se conecten a Amazon DocumentDB mediante una cadena de conexión no tendrán este problema, ya que ClusterConnectionMode se establecerá en MULTIPLE al configurar la preferencia de lectura.

    MongoClientURI mongoClientURI = new MongoClientURI("mongodb://usr:pass:cluster-endpoint:27317/test?ssl=false&replicaSet=rs0&readpreference=secondaryPreferred"); MongoClient mongoClient = MongoClients.create(mongoClientURI.getURI());

    O usar el constructor MongoClientSettings con el método applyConnectionString.

    final MongoClientSettings settings = MongoClientSettings.builder() .credential(credential) .applyConnectionString(new ConnectionString("usr:pass:cluster-endpoint:27317/test?ssl=false&replicaSet=rs0&readpreference=secondaryPreferred")) .retryWrites(false) .applyToSslSettings(builder → builder .enabled(false)) .build(); MongoClient mongoClient = MongoClients.create(settings);
  • Establecido ClusterConnectionMode explícitamente en MULTIPLE. Esto solo es necesario cuando se usa applyToClusterSettings y hosts().size() == 1.

    final ServerAddress serverAddress0 = new ServerAddress("cluster-endpoint", 27317)); final MongoCredential credential = MongoCredential.createCredential("xxx","admin", "xxxx".toCharArray()); final MongoClientSettings settings = MongoClientSettings.builder() .credential(credential) .readPreference(ReadPreference.secondaryPreferred()) .retryWrites(false) .applyToSslSettings(builder → builder .enabled(false)) .applyToClusterSettings(builder → builder .hosts(Arrays.asList(serverAddress0)) .requiredReplicaSetName("rs0")) .mode(ClusterConnectionMode.MULTIPLE)) .build(); MongoClient mongoClient = MongoClients.create(settings);

Comprobación de una conexión a una instancia de Amazon DocumentDB

Puede comprobar la conexión a un clúster mediante las herramientas habituales de Windows o de Linux.

En un terminal de Linux o Unix, puede comprobar la conexión escribiendo lo siguiente (sustituya cluster-endpoint por el punto de conexión y port por el puerto de la instancia):

nc -zv cluster-endpoint port

A continuación se muestra un ejemplo de una operación y el valor devuelto:

nc -zv docdbTest.d4c7nm7stsfc0.us-west-2.docdb.amazonaws.com 27017 Connection to docdbTest.d4c7nm7stsfc0.us-west-2.docdb.amazonaws.com 27017 port [tcp/*] succeeded!

Conexión a un punto de conexión no válido

Si se conecta a un clúster de Amazon DocumentDB y utiliza un punto de conexión del clúster que no es válido, aparece un error similar al siguiente.

mongo --ssl \ --host sample-cluster.node.us-east-1.docdb.amazonaws.com:27017 \ --sslCAFile global-bundle.pem \ --username <user-name> \ --password <password>

El resultado tendrá este aspecto:

MongoDB shell version v3.6 connecting to: mongodb://sample-cluster.node.us-east-1.docdb.amazonaws.com:27017/ 2018-11-14T17:21:18.516-0800 I NETWORK [thread1] getaddrinfo("sample-cluster.node.us-east-1.docdb.amazonaws.com") failed: nodename nor servname provided, or not known 2018-11-14T17:21:18.537-0800 E QUERY [thread1] Error: couldn't initialize connection to host sample-cluster.node.us-east-1.docdb.amazonaws.com, address is invalid : connect@src/mongo/shell/mongo.js:237:13@(connect):1:6 exception: connect failed

Para obtener el punto de conexión válido de un clúster, utilice el comando siguiente:

aws docdb describe-db-clusters \ --db-cluster-identifier sample-cluster \ --query 'DBClusters[*].[Endpoint,Port]'

Para obtener el punto de conexión válido de una instancia, utilice el comando siguiente:

aws docdb describe-db-instances \ --db-instance-identifier sample-instance \ --query 'DBInstances[*].[Endpoint.Address,Endpoint.Port]'

Para obtener más información, consulte Descripción de los puntos de conexión de Amazon DocumentDB.

La configuración del controlador afecta al número de conexiones

Al utilizar el controlador de cliente para conectarse a un clúster de Amazon DocumentDB, es importante tener en cuenta el parámetro de maxPoolSize configuración. La maxPoolSize configuración determina el número máximo de conexiones que el controlador del cliente mantendrá en su grupo de conexiones.