Problemi di connessione - Amazon DocumentDB

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Problemi di connessione

Hai problemi di connessione? Ecco alcuni scenari comuni e come risolverli.

Argomenti

Impossibile connettersi a un endpoint Amazon DocumentDB

Quando tenti di connetterti ad Amazon DocumentDB, il seguente è uno dei messaggi di errore più comuni che potresti ricevere.

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

Ciò che questo messaggio di errore in genere significa è che il tuo client (la shell mongo in questo esempio) non può accedere all'endpoint Amazon DocumentDB. Questo potrebbe accadere per vari motivi:

Connessione da endpoint pubblici

Stai tentando di connetterti a un cluster Amazon DocumentDB direttamente dal tuo laptop o macchina di sviluppo locale.

Il tentativo di connettersi a un cluster Amazon DocumentDB direttamente da un endpoint pubblico, come un laptop o una macchina di sviluppo locale, avrà esito negativo. Amazon DocumentDB è disponibile solo su cloud privato virtuale (VPC) e attualmente non supporta endpoint pubblici. Pertanto, non è possibile connettersi direttamente al cluster Amazon DocumentDB dal laptop o dall'ambiente di sviluppo locale al di fuori del VPC.

Per connetterti a un cluster Amazon DocumentDB dall'esterno di un Amazon VPC, puoi utilizzare un tunnel SSH. Per ulteriori informazioni, consulta Connessione a un cluster Amazon DocumentDB dall'esterno di un Amazon VPC. Inoltre, se il tuo ambiente di sviluppo si trova in un altro Amazon VPC, puoi anche utilizzare VPC Peering e connetterti al tuo cluster Amazon DocumentDB da un altro Amazon VPC nella stessa regione o in una regione diversa.

Connessioni tra regioni

Stai tentando di connetterti a un cluster Amazon DocumentDB in un'altra regione.

Se tenti di connetterti a un cluster Amazon DocumentDB da un'istanza Amazon EC2 in una regione diversa dalla regione del cluster, ad esempio, provando a connetterti a un cluster nella regione Stati Uniti orientali (Virginia settentrionale) (us-east-1) dalla regione Stati Uniti occidentali (Oregon) (us-west-2), la connessione avrà esito negativo.

Per verificare la regione del cluster Amazon DocumentDB, esegui il comando seguente. La regione è nell'endpoint.

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

L'aspetto dell'output di questa operazione è simile al seguente.

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

Per verificare la regione dell'istanza EC2, esegui il comando seguente.

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

L'aspetto dell'output di questa operazione è simile al seguente.

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

Connessione da diversi Amazon VPC

Stai tentando di connetterti a un cluster Amazon DocumentDB da un VPC diverso da quello su cui è distribuito il cluster.

Se il cluster Amazon DocumentDB e l'istanza Amazon EC2 si trovano nello stesso cluster Amazon DocumentDB ma non Regione AWS nello stesso Amazon VPC, non è possibile connettersi direttamente al cluster Amazon DocumentDB a meno che non sia abilitato il peering VPC tra i due Amazon VPC.

Per verificare l'Amazon VPC della tua istanza Amazon DocumentDB, esegui il comando seguente.

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

Per verificare l'Amazon VPC della tua istanza Amazon EC2, esegui il comando seguente.

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

Il gruppo di sicurezza blocca le connessioni in entrata

Stai tentando di connetterti a un cluster Amazon DocumentDB e il gruppo di sicurezza del cluster non consente connessioni in entrata sulla porta del cluster (porta predefinita: 27017).

Supponiamo che il cluster Amazon DocumentDB e l'istanza Amazon EC2 si trovino entrambi nella stessa regione e Amazon VPC e utilizzino lo stesso gruppo di sicurezza Amazon VPC. Se non riesci a connetterti al cluster Amazon DocumentDB, la causa probabile è che il gruppo di sicurezza (ovvero il firewall) del cluster non consente connessioni in entrata sulla porta scelta per il cluster Amazon DocumentDB (la porta predefinita è 27017).

Per verificare la porta per il tuo cluster Amazon DocumentDB, esegui il comando seguente.

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

Per impostare il gruppo di sicurezza Amazon DocumentDB per il cluster, esegui il comando seguente.

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

Per verificare le regole in entrata per il tuo gruppo di sicurezza, consulta i seguenti argomenti nella documentazione di Amazon EC2:

Problema relativo alle preferenze di lettura del driver Java Mongo

Le preferenze di lettura del client non vengono rispettate e alcuni client non possono scrivere su Amazon DocumentDB dopo il failover a meno che non vengano riavviati.

Questo problema, scoperto per la prima volta in Java Mongo Driver 3.7.x, si verifica quando un client stabilisce una connessione ad Amazon DocumentDB utilizzando MongoClientSettings e, in particolare, durante il concatenamento del metodo. applyToClusterSettings Le impostazioni del MongoClient cluster possono essere definite utilizzando diversi metodi, ad esempio, e. hosts() requiredReplicaSetName() mode()

Quando il client specifica un solo host nel hosts() metodo, la modalità viene impostata su ClusterConnectionMode.SINGLE anziché su ClusterConnectionMode.MULTIPLE Ciò fa sì che il client ignori la preferenza di lettura e si connetta solo al server configurato in. hosts() Quindi, anche se le impostazioni del client sono inizializzate come di seguito, tutte le letture andrebbero comunque al primario anziché al secondario.

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 di failover

Utilizzando le impostazioni di connessione client di cui sopra, in caso di failover e aggiornamento ritardato del record DNS per l'endpoint del cluster writer, il client proverebbe comunque a inviare scritture al vecchio writer (ora lettore dopo il failover). Ciò si traduce in un errore sul lato server (non principale) che non viene gestito in modo appropriato dal driver Java (questo è ancora oggetto di indagine). Pertanto, il client può rimanere in cattivo stato fino al riavvio del server delle applicazioni, ad esempio.

A tale scopo sono disponibili due soluzioni alternative:

  • I client che si connettono ad Amazon DocumentDB tramite una stringa di connessione non avranno questo problema, poiché ClusterConnectionMode verrà impostato su MULTIPLE quando si imposta la preferenza di lettura.

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

    Oppure usando MongoClientSettings builder con il applyConnectionString metodo.

    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);
  • Impostato esplicitamente suClusterConnectionMode. MULTIPLE È necessario solo quando si utilizza applyToClusterSettings ehosts().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);

Test di una connessione a un'istanza Amazon DocumentDB

Puoi verificare la connessione a un cluster utilizzando strumenti comuni di Linux o Windows.

Da un terminale Linux o Unix, puoi eseguire il test della connessione immettendo quanto segue (sostituisci cluster-endpoint con l'endpoint e port con la porta dell'istanza database):

nc -zv cluster-endpoint port

Di seguito è riportata un'operazione di esempio e il valore restituito:

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!

Connessione a un endpoint non valido

Quando ci si connette a un cluster Amazon DocumentDB e si utilizza un endpoint del cluster non valido, viene visualizzato un errore simile al seguente.

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

L'output sarà il seguente:

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

Per ottenere l'endpoint valido per un cluster, esegui il comando seguente:

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

Per ottenere l'endpoint valido per un'istanza, esegui il comando seguente:

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

Per ulteriori informazioni, consulta Comprendere gli endpoint di Amazon DocumentDB.

Configurazione del driver che influisce sul numero di connessioni

Quando si utilizza il driver client per connettersi a un cluster Amazon DocumentDB, è importante considerare il parametro di maxPoolSize configurazione. L'maxPoolSizeimpostazione determina il numero massimo di connessioni che il driver client manterrà nel proprio pool di connessioni.