Problemas de conexão - Amazon DocumentDB

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Problemas de conexão

Está tendo problemas para se conectar? Aqui estão alguns cenários comuns e como resolvê-los.

Tópicos

Não é possível conectar-se a um endpoint do Amazon DocumentDB

Quando você tentar se conectar ao Amazon DocumentDB, a mensagem de erro a seguir é uma das mais comuns que você pode receber.

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

O que essa mensagem de erro normalmente significa é que seu cliente (o shell do mongo, nesse exemplo) não pode acessar o endpoint do Amazon DocumentDB. Este pode ser o caso por vários motivos:

Conectar de endpoints públicos

Você está tentando se conectar a um cluster do Amazon DocumentDB diretamente do seu laptop ou máquina de desenvolvimento local.

Tentar se conectar a um cluster do Amazon DocumentDB diretamente de um endpoint público, como seu laptop ou máquina de desenvolvimento local, falhará. O Amazon DocumentDB é apenas uma nuvem privada virtual (VPC) e não oferece suporte a endpoints públicos no momento. Assim, você não poderá se conectar diretamente ao seu cluster do Amazon DocumentDB do seu laptop nem do ambiente de desenvolvimento local fora da sua VPC.

Para se conectar a um cluster do Amazon DocumentDB de fora de uma Amazon VPC, você pode usar o túnel SSH. Para ter mais informações, consulte Conectando-se a um cluster do Amazon DocumentDB de fora de uma Amazon VPC. Além disso, se o ambiente de desenvolvimento estiver em outra Amazon VPC, você também poderá usar o VPC Peering e conectar-se ao seu cluster do Amazon DocumentDB de outra na mesma região ou em uma região diferente.

Conexões inter-regionais

Você está tentando se conectar a um cluster do Amazon DocumentDB em outra região.

Se você tentar se conectar a um cluster do Amazon DocumentDB a partir de uma instância do Amazon EC2 em uma região diferente daquela do cluster — por exemplo, tentando se conectar a um cluster na região Leste dos EUA (Norte da Virgínia) (us-east-1) a partir da região Oeste dos EUA (Oregon) (us-west-2) - a conexão fracassará.

Para verificar a região do seu cluster do Amazon DocumentDB, execute o comando a seguir. A região está no endpoint.

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

A saída dessa operação é semelhante à seguinte.

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

Para verificar a região da sua instância do EC2, execute o comando a seguir.

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

A saída dessa operação é semelhante à seguinte.

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

Conectar a partir de diferentes Amazon VPCs

Você está tentando se conectar a um cluster do Amazon DocumentDB a partir de uma VPC diferente da Amazon VPC na qual seu cluster está implantado.

Se o cluster do Amazon DocumentDB e a instância do Amazon EC2 estiverem no Região da AWS mesmo, mas não no mesmo Amazon VPC, você não poderá se conectar diretamente ao seu cluster do Amazon DocumentDB, a menos que o emparelhamento de VPC esteja ativado entre os dois Amazon VPCs.

Para verificar a Amazon VPC de sua instância do Amazon DocumentDB, execute o comando a seguir.

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

Para verificar a Amazon VPC da sua instância do Amazon EC2, execute o comando a seguir.

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

O grupo de segurança bloqueia as conexões de entrada.

Você está tentando se conectar a um cluster do Amazon DocumentDB e o grupo de segurança do cluster não permite conexões de entrada na porta do cluster (porta padrão: 27017).

Suponha que o cluster do Amazon DocumentDB e a instância do Amazon EC2 estejam na mesma região e Amazon VPC e usem o mesmo grupo de segurança da Amazon VPC. Se você não conseguir se conectar ao cluster do Amazon DocumentDB, a causa provável é que o grupo de segurança (ou seja, firewall) do cluster não permite conexões de entrada na porta escolhida para o cluster do Amazon DocumentDB (a porta padrão é 27017 ).

Para verificar a porta do seu cluster do Amazon DocumentDB, execute o comando a seguir.

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

Para obter o seu grupo de segurança do Amazon DocumentDB para o seu cluster, execute o seguinte comando.

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

Para verificar as regras de entrada do seu grupo de segurança, consulte os seguintes tópicos na documentação do Amazon EC2:

Problema de preferência de leitura do driver Java Mongo

As preferências de leitura do cliente não são respeitadas e alguns clientes não podem gravar no Amazon DocumentDB após o failover, a menos que sejam reinicializados.

Esse problema, descoberto pela primeira vez no Java Mongo Driver 3.7.x, ocorre quando um cliente estabelece uma conexão com o Amazon DocumentDB usando MongoClientSettings e, especificamente, ao encadear o método. applyToClusterSettings As configurações do MongoClient cluster podem ser definidas usando alguns métodos diferenteshosts(), comorequiredReplicaSetName(), mode() e.

Quando o cliente especifica apenas um host no método hosts(), o modo é definido como em ClusterConnectionMode.SINGLE vez de ClusterConnectionMode.MULTIPLE Isso faz com que o cliente desconsidere a preferência de leitura e se conecte apenas ao servidor configurado em hosts(). Portanto, mesmo que as configurações do cliente sejam inicializadas como abaixo, todas as leituras ainda irão para a primária em vez da secundária.

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 failover

Usando as configurações de conexão do cliente acima, se houver um failover e uma atualização atrasada do registro DNS para o endpoint do gravador do cluster, o cliente ainda tentará emitir gravações no gravador antigo (agora leitor após o failover). Isso resulta em um erro do lado do servidor (não principal) que não é tratado adequadamente pelo driver Java (isso ainda está sob investigação). Assim, o cliente pode ficar em mau estado até que o servidor do aplicativo seja reinicializado, por exemplo.

Há duas soluções alternativas para isso:

  • Clientes que se conectam ao Amazon DocumentDB por meio de uma cadeia de conexão não terão esse problema, pois ClusterConnectionMode serão configurados como MULTIPLE ao definir a preferência de leitura.

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

    Ou usando o construtor MongoClientSettings com o métodoapplyConnectionString.

    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);
  • Definido explicitamente de ClusterConnectionMode para MULTIPLE. Isso só é necessário ao usar applyToClusterSettings e 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);

Testar uma conexão com uma instância do Amazon DocumentDB

Você pode testar sua conexão com um cluster usando ferramentas comuns do Linux ou Windows.

Em um terminal Linux ou Unix, teste a conexão inserindo o seguinte (substitua cluster-endpoint pelo endpoint e port pela porta da sua instância):

nc -zv cluster-endpoint port

Veja a seguir um exemplo de operação e o valor de retorno:

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!

Conectar a um endpoint inválido

Ao conectar-se a um cluster do Amazon DocumentDB e usar um endpoint de cluster inválido, um erro semelhante ao seguinte será exibido.

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

O resultado se parece com:

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 obter o endpoint válido para um cluster, execute o seguinte comando:

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

Para obter o endpoint válido para uma instância, execute o seguinte comando:

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

Para ter mais informações, consulte Entendendo os endpoints do Amazon DocumentDB.

A configuração do driver afeta o número de conexões

Ao usar o driver do cliente para se conectar a um cluster Amazon DocumentDB, é importante considerar o parâmetro de maxPoolSize configuração. A maxPoolSize configuração determina o número máximo de conexões que o driver do cliente manterá em seu pool de conexões.