Como depurar problemas de conexão

Introdução

Geralmente, os problemas de conexão se enquadram em uma destas três áreas:

  • Conexão: você consegue acessar a instância na rede?
  • Autorização: você está autorizado a se conectar à instância?
  • Autenticação: o banco de dados aceita as credenciais do banco de dados?

Cada uma delas pode ser dividida em caminhos diferentes para investigação. A seção a seguir inclui exemplos de perguntas que você pode fazer para resolver o problema:

Lista de verificação de problemas de conexão

Mensagens de erro

Para ver mensagens de erro específicas da API, consulte a página de referência Mensagens de erro.

Solução de problemas de conectividade adicional

Para outros problemas de conexão, consulte a seção Conectividade na página de solução de problemas.

Problemas comuns de conexão

Verificar se o aplicativo está encerrando as conexões corretamente

Erros contendo "Aborted connection nnnn to db:" costumam indicar que o aplicativo não está interrompendo as conexões corretamente. Problemas de rede também podem causar esse erro. O erro não significa que há problemas com sua instância do Cloud SQL. Também recomendamos que você execute tcpdump para inspecionar os pacotes e rastrear a origem do problema.

Para ver exemplos de práticas recomendadas de gerenciamento de conexões, consulte Como gerenciar conexões de banco de dados.

Verificar se os certificados expiraram

Se a instância estiver configurada para usar SSL, acesse a página "Instâncias" do Cloud SQL no Console do Cloud e abra a instância. Abra a página Conexões correspondente e verifique se o certificado do servidor é válido. Se ele tiver expirado, você precisará adicionar um novo e fazer a rotação dos certificados.

Verificar se você está autorizado a se conectar

Caso não esteja conseguindo se conectar, verifique sua autorização:

  • Se você estiver com problemas para se conectar usando um endereço IP (por exemplo, você está se conectando do ambiente local com o cliente psql), confirme se o endereço IP do qual você está se conectando está autorizado a se conectar à instância o Cloud SQL.

    As conexões com uma instância do Cloud SQL usando um endereço IP privado são autorizadas automaticamente para intervalos de endereços RFC 1918. Dessa forma, todos os clientes particulares podem acessar o banco de dados sem passar pelo proxy do Cloud SQL Auth. Os intervalos de endereços não RFC 1918 precisam ser configurados como redes autorizadas.

    Por padrão, o Cloud SQL não aprende as rotas de sub-rede não RFC 1918 da sua VPC. É necessário atualizar o peering de rede para o Cloud SQL para exportar rotas que não sejam RFC 1918. Exemplo:

    gcloud compute networks peerings update cloudsql-postgres-googleapis-com \
    --network=NETWORK \
    --export-subnet-routes-with-public-ip \
    --project=PROJECT_ID
    
  • Veja aqui o endereço IP atual.

  • Tente usar o comando gcloud sql connect para se conectar à instância. Esse comando autoriza seu endereço IP por um curto período. É possível executar esse comando em um ambiente com o SDK do Cloud e o cliente psql instalados. Também é possível executar esse comando no Cloud Shell, que está disponível no Console do Google Cloud e tem o SDK do Cloud e o cliente psql pré-instalados. É fornecida uma instância do Compute Engine para você se conectar ao Cloud SQL.
  • Permite temporariamente que todos os endereços IP se conectem a uma instância autorizando 0.0.0.0/0.

Verifique como você está se conectando

Se você receber uma mensagem de erro como:

FATAL: database `user` does not exist.

O comando gcloud sql connect --user só funciona com o usuário padrão (postgres). A solução é se conectar usando o usuário padrão e, em seguida, usar o comando "\c" do psql para reconectar como o usuário diferente.

Determinar como as conexões são iniciadas

Para ver informações sobre as conexões atuais, conecte-se ao banco de dados e execute o seguinte comando:

SELECT * from pg_stat_activity ;

As conexões que mostram um endereço IP, como 1.2.3.4, são feitas usando IP. As conexões com cloudsqlproxy~1.2.3.4 usam o proxy do Cloud SQL Auth. Caso contrário, elas são originadas do App Engine. As conexões de localhost podem ser usadas por alguns processos internos do Cloud SQL.

Como entender os limites da conexão

Não há limite de QPS para instâncias do Cloud SQL. No entanto, há limites específicos em relação à conexão, ao tamanho e ao App Engine. Consulte Cotas e limites.

As conexões do banco de dados consomem recursos no servidor e no aplicativo conectado. Sempre use boas práticas de gerenciamento de conexão para minimizar o espaço ocupado pelo seu aplicativo e reduzir a probabilidade de exceder os limites de conexão do Cloud SQL. Para mais informações, consulte Como gerenciar conexões de banco de dados.

Exibir conexões e threads

Para ver os processos em execução no banco de dados, use a tabela pg_stat_activity:

select * from pg_stat_activity;

Tempo limite das conexões (do Compute Engine)

As conexões com uma instância do Compute Engine expiram após dez minutos de inatividade, o que pode afetar conexões de longa duração não usadas entre a instância do Compute Engine e a instância do Cloud SQL. Para mais informações, consulte Rede e firewalls na documentação do Compute Engine.

Para manter ativas as conexões com inatividade de longa duração, configure o TCP keepalive. Os comandos a seguir definem o valor TCP keepalive para um minuto e tornam a configuração permanente em reinicializações de instância.

Exiba o valor tcp_keepalive_time atual.

cat /proc/sys/net/ipv4/tcp_keepalive_time

Defina tcp_keepalive_time como 60 segundos e torne-o permanente durante as reinicializações.

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

Aplique a alteração.

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

Exiba o valor tcp_keepalive_time para verificar se a alteração foi aplicada.

cat /proc/sys/net/ipv4/tcp_keepalive_time

Ferramentas para depurar a conectividade

As ferramentas mais básicas são ping e traceroute.

Ping

Ping realiza um teste básico para determinar se o destino ("instância do Cloud SQL") está disponível na origem. Ping envia um pacote ICMP Echo Request a uma instância do Cloud SQL e espera que um ICMP Echo Reply seja retornado. Se ping não tiver êxito, isso significa que não há rota da origem até o destino. O caso de êxito, no entanto, não significa que os pacotes podem ser enviados, mas que, em geral, a instância do Cloud SQL pode ser alcançada.

Embora ping possa dizer se um host está ativo e respondendo, não é garantido que ele seja confiável. Alguns provedores de rede bloqueiam ICMP por medida de segurança, o que pode dificultar a depuração da conectividade.

Traceroute

Traceroute testa a rota completa que pacotes de rede usam de um host para outro. Ele mostra todas as etapas ("saltos") que o pacote percorre ao longo do tempo e quanto tempo cada etapa leva. Se o pacote não for até o destino, traceroute não será concluído, mas terminará com uma série de asteriscos. Nesse caso, procure o último endereço IP que foi alcançado ao longo do caminho. Ele será onde a conectividade caiu.

Traceroute pode expirar. Ele também não será concluído se um gateway no caminho não estiver configurado corretamente para transmitir o pacote para o próximo salto.

Quando o traceroute não for concluído, é possível descobrir onde ele parou. Encontre o último endereço IP listado na saída traceroute e faça uma pesquisa por who owns [IP_ADDRESS] com o navegador. Os resultados podem ou não mostrar o proprietário do endereço, mas vale a pena tentar.

mtr

A ferramenta mtr é uma forma de traceroute que permanece ativa e atualizada continuamente, da mesma forma que o comando top funciona para processos locais.

tcpdump

O tcpdump é uma ferramenta para capturar pacotes. É altamente recomendável executar tcpdump para capturar e inspecionar os pacotes entre seu host e as instâncias do CloudSQL ao depurar os problemas de conectividade.

Localizar o endereço IP local

Se você não souber o endereço local do host, execute o comando ip -br address show. No Linux, isso mostra a interface de rede, o status da interface, o IP local e os endereços MAC. Por exemplo, eth0 UP 10.128.0.7/32 fe80::4001:aff:fe80:7/64.

Se preferir, execute ipconfig ou ifconfig para ver o status das interfaces de rede.

Como testar com o teste de conectividade

Os testes de conectividade são uma ferramenta de diagnóstico que permite verificar a conectividade entre os endpoints na sua rede. Ele analisa sua configuração e, em alguns casos, executa a verificação de ambiente de execução. Agora, ele é compatível com o Cloud SQL. Siga estas instruções para executar testes com instâncias do Cloud SQL.

Como testar sua conexão

É possível usar o cliente psql para testar sua capacidade de se conectar do seu ambiente local. Para saber mais, consulte Como conectar o cliente psql usando endereços IP e Como conectar o cliente psql usando o proxy do Cloud SQL Auth.

Como determinar o endereço IP do aplicativo

Para determinar o endereço IP de um computador que executa seu aplicativo com o objetivo de autorizar o acesso à sua instância do Cloud SQL desse endereço, use uma das seguintes opções:

  • Se o computador não estiver por trás de um proxy, faça login no computador e use este link (em inglês) para determinar o endereço IP.
  • Se o computador estiver por trás de um proxy, faça login no computador e use uma ferramenta ou serviço como o whatismyipaddress.com (em inglês) para determinar o endereço IP verdadeiro.

Abrir portas locais

Para verificar se o host está detectando nas portas que você acredita que estejam, execute o comando ss -tunlp4. Isso informa quais portas estão abertas e detectando. Por exemplo, se você tiver um banco de dados PostgreSQL em execução, a porta 5432 estará ativa e detectando. Para o SSH, será a porta 22.

Toda a atividade da porta local

Use o comando netstat para ver toda a atividade da porta local. Por exemplo, netstat -lt mostra todas as portas ativas no momento.

Conectar-se à instância do Cloud SQL usando telnet

Para verificar se é possível se conectar à instância do Cloud SQL usando TCP, execute o comando telnet. O telnet tenta se conectar ao endereço IP e à porta fornecidos por você.

Se a instância do Cloud SQL estiver executando um banco de dados PostgreSQL, por exemplo, será possível fazer o telnet para ele na porta 5432: telnet 35.193.198.159 5432.

Se o processo for bem-sucedido, você verá o seguinte:

Trying 35.193.198.159...

Connected to 35.193.198.159.

Em caso de falha, você verá que telnet trava até que você force o encerramento da tentativa:

Trying 35.193.198.159...

^C.

Autenticação do cliente

A autenticação do cliente é controlada por um arquivo de configuração, chamado pg_hba.conf (HBA significa autenticação baseada em host).

Verifique se a seção de conexões de replicação do arquivo pg_hba.conf no banco de dados de origem está atualizada para aceitar conexões do intervalo de endereços IP da VPC do Cloud SQL.

Cloud Logging

O Cloud SQL usa o Cloud Logging. Consulte a documentação do Cloud Logging para informações completas e revise as consultas de amostra do Cloud SQL.

Ver registros

É possível ver os registros das instâncias do Cloud SQL e de outros projetos do Google Cloud, como as instâncias do Cloud VPN ou do Compute Engine. Para ver as entradas de registro da instância do Cloud SQL, faça o seguinte:

Console

  1. No Console do Google Cloud, acesse a página do Cloud Logging.

    Acessar o Cloud Logging

  2. Selecione um projeto do Cloud SQL na parte superior da página.
  3. No criador de consultas, adicione o seguinte:
    • Recurso: selecione Banco de dados do Cloud SQL. Na caixa de diálogo, selecione uma instância do Cloud SQL.
    • Nomes de registro: vá até a seção do Cloud SQL e selecione os arquivos de registro correspondentes à instância. Exemplo:
      • cloudsql.googleapis.com/postgres.log
    • Gravidade: selecione um nível de registro.
    • Período: selecione um valor predefinido ou crie um período personalizado.

gcloud

Use o comando gcloud logging para visualizar as entradas de registro. No exemplo abaixo, substitua PROJECT_ID. A sinalização limit é um parâmetro opcional que indica o número máximo de entradas a serem retornadas.

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

Endereços IP particulares

As conexões com uma instância do Cloud SQL usando um endereço IP privado são autorizadas automaticamente para intervalos de endereços RFC 1918. Os intervalos de endereços não RFC 1918 precisam ser configurados no Cloud SQL como redes autorizadas. É necessário atualizar o peering de rede para o Cloud SQL exportar rotas que não sejam RFC 1918. Exemplo:

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

O intervalo de IP 172.17.0.0/16 é reservado para a rede de ponte do Docker. Todas as instâncias do Cloud SQL criadas com um IP nesse intervalo ficarão inacessíveis. As conexões vindas de qualquer endereço IP dentro desse intervalo para instâncias do Cloud SQL que usam endereço IP particular falharão.

Solução de problemas de VPN

Consulte a página Solução de problemas do Cloud VPN.