Debug dei problemi di connessione

Introduzione

In genere, i problemi di connessione rientrano in una delle seguenti tre aree:

  • Connessione in corso: riesci a raggiungere la tua istanza sulla rete?
  • Autorizzazione: hai l'autorizzazione a connetterti all'istanza?
  • Autenticazione: il database accetta le credenziali del database?

Ognuno di questi può essere ulteriormente suddiviso in diversi percorsi per l'indagine. La sezione seguente include alcuni esempi di domande che puoi porti per aiutarti a circoscrivere ulteriormente il problema:

Elenco di controllo per i problemi di connessione

Messaggi di errore

Per messaggi di errore specifici dell'API, consulta la pagina di riferimento Messaggi di errore.

Risolvere altri problemi di connettività

Per altri problemi, consulta la sezione Connettività della pagina per la risoluzione dei problemi.

Problemi comuni di connessione

Verifica che la tua applicazione stia chiudendo correttamente le connessioni

Se visualizzi errori che contengono "Aborted connection nnnn to db:", in genere significa che l'applicazione non interrompe le connessioni correttamente. Questo errore può essere causato anche da problemi di rete. L'errore non significa che ci sono problemi con la tua istanza Cloud SQL. Ti consigliamo inoltre di eseguire tcpdump per ispezionare i pacchetti per individuare l'origine del problema.

Per esempi di best practice per la gestione delle connessioni, consulta Gestire le connessioni ai database.

Verifica che i certificati non siano scaduti

Se l'istanza è configurata per utilizzare SSL, vai alla pagina Istanze Cloud SQL in Cloud Console e apri l'istanza. Apri la pagina Connessioni, seleziona la scheda Sicurezza e assicurati che il certificato del tuo server sia valido. Se è scaduto, devi aggiungere un nuovo certificato e ruotare il certificato.

Verifica di avere l'autorizzazione a connettersi

Se le connessioni non funzionano, verifica di avere l'autorizzazione a connettersi:

  • Se hai difficoltà a connetterti utilizzando un indirizzo IP, ad esempio, il tuo ambiente on-premise si connette con il client psql, quindi assicurati che l'indirizzo IP da cui esegui la connessione sia autorizzato a connettersi all'istanza Cloud SQL.

    Le connessioni a un'istanza Cloud SQL che utilizza un indirizzo IP privato vengono autorizzate automaticamente per gli intervalli di indirizzi RFC 1918. In questo modo, tutti i client privati possono accedere al database senza passare attraverso il proxy di Cloud SQL Auth. Gli intervalli di indirizzi non RFC 1918 devono essere configurati come reti autorizzate.

    Per impostazione predefinita, Cloud SQL non impara le route di subnet non RFC 1918 dal VPC. Devi aggiornare il peering di rete a Cloud SQL per esportare eventuali route non RFC 1918. Ad esempio:

    gcloud compute networks peerings update cloudsql-postgres-googleapis-com \
    --network=NETWORK \
    --export-subnet-routes-with-public-ip \
    --project=PROJECT_ID
    
  • Ecco il tuo indirizzo IP corrente.

  • Prova il comando gcloud sql connect per connetterti all'istanza. Questo comando autorizza il tuo indirizzo IP per un breve periodo di tempo. Puoi eseguire questo comando in un ambiente con gcloud e il client psql installato. Puoi anche eseguire questo comando in Cloud Shell, disponibile in Google Cloud Console, su cui è preinstallato gcloud e il client psql. Cloud Shell fornisce un'istanza di Compute Engine che puoi utilizzare per connetterti a Cloud SQL.
  • Consenti temporaneamente a tutti gli indirizzi IP di connettersi a un'istanza autorizzando 0.0.0.0/0.

Verificare la modalità di connessione

Se ricevi un messaggio di errore come:

FATAL: database `user` does not exist.

Il comando gcloud sql connect --user funziona solo con l'utente predefinito (postgres). La soluzione alternativa è connettersi con l'utente predefinito, quindi utilizzare il comando psql "\c" per riconnettersi come utente diverso.

Determinare il modo in cui le connessioni vengono avviate

Per visualizzare le informazioni sulle connessioni attuali, connettiti al tuo database e esegui il seguente comando:

SELECT * from pg_stat_activity ;

Le connessioni che mostrano un indirizzo IP, ad esempio 1.2.3.4, si connettono utilizzando l'IP. Le connessioni con cloudsqlproxy~1.2.3.4 utilizzano il proxy Cloud SQL Auth o hanno avuto origine da App Engine. Alcune connessioni Cloud SQL interne potrebbero utilizzare le connessioni da localhost.

Limiti di connessione

Non sono previsti limiti di QPS per le istanze Cloud SQL. Tuttavia, esistono limiti specifici per connessione, dimensioni e App Engine. Vedi Quote e limiti.

Le connessioni di database consumano risorse sul server e sull'applicazione di connessione. Utilizza sempre buone prassi di gestione delle connessioni per ridurre al minimo l'impatto della tua applicazione e ridurre la probabilità di superare i limiti di connessione di Cloud SQL. Per ulteriori informazioni, consulta Gestione delle connessioni ai database.

Mostra connessioni e thread

Per vedere i processi in esecuzione nel database, utilizza la tabella pg_stat_activity:

select * from pg_stat_activity;

Timeout connessioni (da Compute Engine)

Connessioni con un timeout dell'istanza Compute Engine dopo 10 minuti di inattività, che possono interessare le connessioni inutilizzate di lunga durata tra l'istanza di Compute Engine e l'istanza Cloud SQL. Per ulteriori informazioni, consulta la sezione Networking e firewall nella documentazione di Compute Engine.

Per mantenere attive le connessioni inutilizzate di lunga durata, puoi impostare il keepalive TCP. I seguenti comandi impostano il valore keepalive TCP su 1 minuto e rendono permanente la configurazione tra i riavvii delle istanze.

Mostra il valore corrente tcp_keepalive_time.

cat /proc/sys/net/ipv4/tcp_keepalive_time

Imposta tcp_keepalive_time su 60 secondi e rendilo permanente tra i riavvii.

echo 'net.ipv4.tcp_keepalive_time = 60' | sudo tee -a /etc/sysctl.conf

Applica la modifica.

sudo /sbin/sysctl --load=/etc/sysctl.conf

Visualizza il valore tcp_keepalive_time per verificare che la modifica sia stata applicata.

cat /proc/sys/net/ipv4/tcp_keepalive_time

Strumenti per la connettività di debug

TCP

tcpdump è uno strumento per acquisire pacchetti. Ti consigliamo di eseguire tcpdump per acquisire e ispezionare i pacchetti tra l'host e le istanze Cloud SQL quando esegui il debug dei problemi di connettività.

Individuare l'indirizzo IP locale

Se non conosci l'indirizzo locale del tuo host, esegui il comando ip -br address show. Su Linux, vengono mostrati l'interfaccia di rete, lo stato dell'interfaccia, l'IP locale e gli indirizzi MAC. Ad esempio: eth0 UP 10.128.0.7/32 fe80::4001:aff:fe80:7/64.

In alternativa, puoi eseguire ipconfig o ifconfig per visualizzare lo stato delle tue interfacce di rete.

Test con connettività

Testivity è uno strumento di diagnostica che consente di controllare la connettività tra gli endpoint nella rete. Analizza la configurazione e in alcuni casi esegue la verifica del tempo di esecuzione. Ora supporta Cloud SQL. Segui queste istruzioni per eseguire i test con le istanze Cloud SQL.

Esegui il test della connessione

Puoi utilizzare il client psql per testare la tua capacità di connessione dal tuo ambiente locale. Per ulteriori informazioni, consulta le informazioni relative alla connessione del client psql mediante gli indirizzi IP e alla connessione del client psql mediante il proxy Cloud SQL Auth.

Determina l'indirizzo IP della tua applicazione

Per determinare l'indirizzo IP di un computer che esegue l'applicazione in modo da poter autorizzare l'accesso all'istanza Cloud SQL da tale indirizzo, utilizza una delle seguenti opzioni:

  • Se il computer non è protetto da un proxy o da un firewall, accedi al computer e utilizza Qual è il mio IP? per determinare il suo indirizzo IP.
  • Se il computer è protetto da un proxy o da un firewall, accedi al computer e usa uno strumento o servizio come whatismyipaddress.com per determinarne il vero indirizzo IP.

Aprire le porte locali

Per verificare che l'host sia in ascolto sulle porte che ritieni si trovino, esegui il comando ss -tunlp4. Indica quali porte sono aperte e ascoltano. Ad esempio, se hai un database PostgreSQL in esecuzione, la porta 5432 deve essere attiva e in ascolto. Per SSH, dovresti vedere la porta 22.

Tutta l'attività locale sul porto

Utilizza il comando netstat per visualizzare tutte le attività locali relative alle porte. Ad esempio, netstat -lt mostra tutte le porte attualmente attive.

Connettiti alla tua istanza Cloud SQL utilizzando telnet

Per verificare la tua connessione all'istanza Cloud SQL utilizzando TCP, esegui il comando telnet. Telnet tenta di connettersi all'indirizzo IP e alla porta specificata.

Se l'istanza Cloud SQL esegue un database PostgreSQL, ad esempio, dovresti essere in grado di eseguire il telnet sulla porta 5432: telnet 35.193.198.159 5432.

Se l'operazione ha esito positivo, noterai quanto segue:

Trying 35.193.198.159...

Connected to 35.193.198.159. .

In caso di errore, vedrai che telnet si blocca fino a quando non forza la chiusura del tentativo:

Trying 35.193.198.159...

^C. .

Autenticazione client

L'autenticazione client è controllata da un file di configurazione, denominato pg_hba.conf (HBA è l'acronimo di autenticazione basata su host).

Assicurati che la sezione delle connessioni di replica del file pg_hba.conf nel database di origine sia aggiornata per accettare connessioni dall'intervallo di indirizzi IP del VPC di Cloud SQL.

Cloud Logging

Cloud SQL e Cloud SQL utilizzano Cloud Logging. Per informazioni complete, consulta la documentazione di Cloud Logging ed esamina le query di esempio di Cloud SQL.

Visualizza i log

Puoi visualizzare i log per le istanze Cloud SQL e per altri progetti Google Cloud come istanze Cloud VPN o Compute Engine. Per visualizzare i log per le voci di log della tua istanza Cloud SQL:

Console

  1. In Google Cloud Console, vai alla pagina Cloud Logging.

    Vai a Cloud Logging

  2. Seleziona un progetto Cloud SQL esistente nella parte superiore della pagina.
  3. In Query Builder, aggiungi quanto segue:
    • Risorsa: Database Cloud SQL. Nella finestra di dialogo, seleziona un'istanza di Cloud SQL.
    • Nomi dei log: scorri fino alla sezione Cloud SQL e seleziona i file di log appropriati per la tua istanza. Ad esempio:
      • cloudsql.googleapis.com/postgres.log
    • Gravità: seleziona un livello di log.
    • Intervallo di tempo: seleziona un preset o crea un intervallo personalizzato.

gcloud

Utilizza il comando gcloud logging per visualizzare le voci di log. Nell'esempio riportato di seguito, sostituisci PROJECT_ID. Il flag limit è un parametro facoltativo che indica il numero massimo di voci da restituire.

gcloud logging read "projects/PROJECT_ID/logs/cloudsql.googleapis.com/postgres.log" \
--limit=10

Indirizzi IP privati

Le connessioni a un'istanza Cloud SQL che utilizza un indirizzo IP privato vengono autorizzate automaticamente per gli intervalli di indirizzi RFC 1918. In Cloud SQL gli intervalli di indirizzi non RFC 1918 devono essere configurati come reti autorizzate. Devi anche aggiornare il peering di rete a Cloud SQL per esportare le route non RFC 1918. Ad esempio:

gcloud compute networks peerings update cloudsql-postgres-googleapis-com 
--network=NETWORK
--export-subnet-routes-with-public-ip
--project=PROJECT_ID

L'intervallo IP 172.17.0.0/16 è riservato alla rete bridge Docker. Qualsiasi istanza Cloud SQL creata con un indirizzo IP in questo intervallo sarà non raggiungibile. Le connessioni da qualsiasi indirizzo IP compreso in tale intervallo alle istanze Cloud SQL che utilizzano l'indirizzo IP privato non riusciranno.

Risoluzione dei problemi relativi alla VPN

Consulta la pagina della risoluzione dei problemi di Cloud VPN.