Este tópico ajuda você a identificar e resolver problemas de health check no Classic Load Balancer (CLB).
Este tópico responde às seguintes perguntas:
|
Categoria |
Perguntas frequentes |
|
Princípios e configuração |
|
|
Solução de problemas |
|
|
Logs |
Como funcionam os health checks?
Os health checks confirmam o status do servidor enviando solicitações periódicas.
O CLB opera em um cluster. Os nós desse cluster realizam tanto o encaminhamento de dados quanto os health checks. Se um servidor de backend falhar em um health check, o CLB para de distribuir novas solicitações de clientes para esse servidor com problema.
O CLB usa o bloco CIDR 100.64.0.0/10 para os health checks. Seus servidores de backend não devem bloquear o tráfego desse intervalo de endereços. Não é necessário adicionar uma regra de permissão no grupo de segurança do ECS, mas se você configurou outras políticas de segurança, como iptables, é preciso permitir o tráfego desse bloco CIDR. O intervalo 100.64.0.0/10 é um espaço de endereços reservado do Alibaba Cloud e não apresenta risco de segurança.
Para mais informações, consulte Health checks do CLB.
Quais são as configurações de health check recomendadas?
Recomendamos as seguintes configurações de health check.
|
Parâmetro |
Listener TCP/HTTP/HTTPS |
Listener UDP |
|
Health check response timeout |
5 segundos |
10 segundos |
|
Health check interval |
2 segundos |
5 segundos |
|
Healthy threshold |
3 |
3 |
|
Unhealthy threshold |
3 |
3 |
Para evitar que mudanças frequentes de status afetem a disponibilidade do sistema, o health check só altera seu status após obter sucesso ou falha múltiplas vezes consecutivas dentro de uma janela de tempo. Para mais informações, consulte Configurar e gerenciar health checks do CLB.
Para detectar falhas mais rapidamente, reduza o tempo de resposta do health check. No entanto, certifique-se de que seu serviço consiga responder dentro desse período.
Posso desativar os health checks?
Sim. Para mais informações, consulte Desativar health checks.
-
Se você desativar os health checks, o CLB encaminha solicitações para todas as instâncias ECS de backend, incluindo as que estão com problema, o que pode causar interrupções no serviço.
-
Se seus serviços forem sensíveis à carga, health checks de alta frequência podem afetar o acesso normal ao serviço. Reduza o impacto diminuindo a frequência do health check, aumentando o intervalo ou alternando para health checks de camada 4. No entanto, para garantir a disponibilidade contínua do serviço, não recomendamos desativar os health checks.
Como escolher o método de health check para um listener TCP?
Os listeners TCP suportam os métodos de health check HTTP e TCP:
-
O método TCP verifica se a porta do servidor está ativa enviando pacotes SYN para realizar um handshake básico de três vias.
-
O método HTTP envia solicitações HEAD ou GET para simular o acesso de um navegador e verificar se a aplicação no servidor está íntegra.
Os health checks TCP consomem menos recursos do servidor. Se seus servidores de backend forem muito sensíveis à carga e você precisar apenas confirmar a disponibilidade da porta, use o método TCP. Se precisar confirmar com mais precisão o status de integridade da aplicação, use o método HTTP.
O que acontece se eu definir o peso de uma instância ECS como zero?
Definir o peso de uma instância ECS de backend como 0 faz com que o CLB pare de encaminhar tráfego para ela, embora os health checks continuem sendo aprovados. Essa prática é comum durante manutenções programadas, como reinicializações ou alterações de configuração.
Método padrão para health checks HTTP
O método HEAD.
Se o serviço em uma instância ECS de backend tiver o método HEAD desativado, os health checks falham. Recomendamos testar localmente na instância ECS enviando uma solicitação HEAD para seu endereço IP privado:
curl -v -0 -I -H "Host:" -X HEAD http://IP:port
Endereços IP de origem do health check
Os health checks do CLB usam o bloco CIDR 100.64.0.0/10. Certifique-se de que seus servidores de backend não bloqueiem esse bloco CIDR. Não é necessário adicionar uma regra de permissão específica no grupo de segurança do ECS, mas se você usar outras políticas de segurança como iptables, é preciso permitir o tráfego desse bloco. O bloco CIDR 100.64.0.0/10 é um espaço de endereços reservado usado pelo Alibaba Cloud e não apresenta risco de segurança.
Quando o health check do CLB é iniciado?
O health check do CLB inicia imediatamente após você configurá-lo para um listener, enviando solicitações periódicas no intervalo de health check especificado.
Falha de health check por banco de dados com defeito
-
Sintoma
Uma instância ECS hospeda dois sites:
www.example.com(um site estático) ealiyundoc.com(um site dinâmico), ambos configurados com balanceamento de carga. Um problema no serviço de banco de dados de backend causa um erro 502 ao acessarwww.example.com. -
Causa
O health check está configurado com o domínio de health check
aliyundoc.com. Uma falha na instância do ApsaraDB RDS de backend ou em um banco de dados autogerenciado tornaaliyundoc.cominacessível, o que causa a falha do health check para todo o servidor de backend. -
Solução
Altere o domínio de health check na configuração do listener do CLB para um domínio estático que não dependa do banco de dados, como
www.example.com.
Erros de conexão mesmo com health checks TCP aprovados
-
Sintoma
Após configurar um listener TCP no CLB, os logs da aplicação de backend mostram frequentemente erros de conexão de rede. A análise de captura de pacotes indica que as solicitações se originam dos servidores do CLB, que enviam pacotes RST ativamente para encerrar a conexão.
java.io.IOException Connection reset by peer at sun.nio.ch.FileDispatcherImpl.read0(Native Method) at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:39) at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223) at sun.nio.ch.IOUtil.read(IOUtil.java:192) at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:379) at io.netty.buffer.UnpooledUnsafeDirectByteBuf.setBytes(UnpooledUnsafeDirectByteBuf.java:446) at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:871) at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:225) at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:115) at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:507) at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:464) at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:378) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:350) at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:116) at java.lang.Thread.run(Thread.java:745) -
Causa
Esse problema ocorre devido ao mecanismo de health check TCP. O CLB verifica a integridade da porta de um listener TCP completando um handshake de três vias e, em seguida, enviando imediatamente um pacote RST para fechar a conexão. O processo funciona da seguinte forma:
-
O servidor do CLB envia um pacote SYN para o servidor de backend.
-
O servidor de backend responde com um pacote SYN+ACK.
-
Ao receber a resposta, o servidor do CLB considera a porta íntegra e marca o health check como bem-sucedido.
-
O servidor do CLB envia um pacote RST para encerrar a conexão, sem enviar dados da aplicação.
Como a conexão é encerrada imediatamente após um health check bem-sucedido, alguns frameworks de aplicação (como um pool de conexões Java) podem interpretar isso como uma conexão anormal, gerando erros como
Connection reset by peer. -
-
Solução
-
Altere o protocolo de health check do listener de TCP para HTTP.
-
No nível da aplicação, filtre as entradas de log originadas do bloco CIDR de health check do CLB (100.64.0.0/10) para ignorar esses erros esperados.
-
Falhas de health check em um servidor íntegro
-
Sintoma
Os health checks HTTP do listener do CLB falham consistentemente, mas testar o servidor de backend diretamente com o comando
curlretorna um código de status normal. -
Causa
Um health check falha se o código de resposta HTTP do servidor não corresponder aos códigos de status esperados na configuração do listener. Por exemplo, se você configurar
http_2xxcomo código de status esperado, qualquer resposta que não seja 2xx do servidor de backend é considerada uma falha de health check.Em uma configuração do Tengine/Nginx, o comando
curlfunciona sem problemas, mas o comandoechocorresponde ao site padrão, fazendo com que o arquivo de teste test.html retorne um erro 404.[root@iZ28sxxxZ home]# echo -e "HEAD /test.html HTTP/1.0\r\n\r\n" | nc -t 10.161.93.136 80 HTTP/1.1 404 Not Found Server: Tengine/2.1.0 Date: Mon, 16 Feb 2015 07:29:32 GMT Content-Type: text/html Content-Length: 585 Connection: close [root@iZ28sxxxZ home]# curl -I http://10.161.93.136/test.html HTTP/1.1 200 OK Server: Tengine/2.1.0 Date: Mon, 16 Feb 2015 07:29:41 GMT Content-Type: text/html Content-Length: 5 Last-Modified: Mon, 16 Feb 2015 07:27:00 GMT Connection: keep-alive ETag: "54e19bc4-5" Accept-Ranges: bytes -
Solução
-
No arquivo de configuração principal do seu servidor web, comente ou configure corretamente o host virtual padrão.
-
Especifique um domínio de health check na configuração de health check do listener do CLB para garantir que as solicitações sejam roteadas para o host virtual correto.
-
Incompatibilidade de frequência de health check nos logs
O serviço de health check do CLB opera em um cluster de nós para evitar pontos únicos de falha. Cada nó do cluster realiza health checks de forma independente. Essa arquitetura aumenta o número total de solicitações de health check enviadas aos seus servidores de backend. Como resultado, a frequência de entradas de health check nos logs do servidor web será maior que a frequência configurada no console. Esse comportamento é esperado.
Como separar os logs de health check dos logs da aplicação?
-
Sintoma
Os logs de solicitações de health check ficam misturados com os logs de tráfego normal da aplicação, tornando os arquivos de log grandes e difíceis de analisar.
-
Causa
Os health checks enviam solicitações HTTP, TCP ou UDP para testar a disponibilidade do servidor de backend. O serviço de backend registra essas solicitações como qualquer outro tráfego, misturando-as com os logs da aplicação.
-
Solução
-
Reduza a frequência do health check: Aumente o intervalo de health check para gerar menos entradas de log de health check.
-
Use um caminho dedicado para health check (para health checks HTTP): Defina o caminho de health check para um caminho dedicado, fora do fluxo de negócio, como
/health. Em seguida, filtre seus logs pelo caminho da solicitação para separar o tráfego de health check. -
Desative os health checks (não recomendado): Se você tiver certeza de que os health checks não são necessários para o seu caso de uso, desative-os para parar de gerar logs de health check.
-
Como solucionar uma falha de health check?
Os health checks determinam se os servidores de backend estão funcionando corretamente. Quando um health check falha, isso geralmente indica um problema no servidor de backend, mas uma configuração de health check incorreta também pode causar falhas. Siga estas etapas para solucionar o problema.
-
Etapa 1: Verifique se o bloco CIDR
100.64.0.0/10não está bloqueado.Certifique-se de que seus servidores de backend não bloqueiem o bloco CIDR
100.64.0.0/10usando iptables ou outro firewall ou software de segurança de terceiros. O CLB usa endereços IP do bloco CIDR reservado interno100.64.0.0/10para se comunicar com os servidores de backend. Se esse bloco CIDR estiver bloqueado, ocorrerão exceções de health check. -
Etapa 2: Teste o serviço de backend de acordo com o protocolo do listener.
Escolha o método de teste apropriado de acordo com o tipo de listener:
Camada 4 (TCP/UDP)
No console do CLB, acesse a página de detalhes do listener e verifique a configuração de health check. Confirme a Health Check Port, que por padrão é a porta do servidor de backend. Em seguida, a partir de uma máquina com acesso ao servidor, execute o comando
telnetpara tentar uma conexão com a porta de health check:telnet 172.17.58.131 80Substitua
172.17.58.131pelo endereço IP privado do servidor de backend e80pela porta de health check real.-
Caso normal: Retorna
Connected to xxx.xxx.xxx.xxx, indicando que a porta especificada no servidor de backend está funcionando corretamente e o health check está normal. -
Resultado inesperado: O comando falha com uma mensagem "Connection refused" ou "Unable to connect". Isso indica que nenhum processo está escutando nessa porta. Verifique se o serviço de backend está em execução e se está escutando na mesma porta especificada na configuração de health check.
Se um listener de camada 4 usar o método HTTP para health checks, consulte as etapas de solução de problemas na aba "Camada 7 (HTTP/HTTPS)".
Camada 7 (HTTP/HTTPS)
No console do CLB, acesse a página de detalhes do listener para visualizar a configuração de health check de camada 7 e confirme a Health Check Port, o Health Check Domain Name e o Health Check Path. Em seguida, a partir de um servidor de backend (por exemplo, um sistema Linux), execute o comando
ncoucurlpara testar o serviço HTTP de backend. O caminho, a porta e o domínio de health check devem corresponder à configuração real no servidor de backend. Caso contrário, os health checks falharão.Exemplo usando o comando nc:
echo -e "HEAD /test.html HTTP/1.0\r\nHost: www.slb-test.com\r\n\r\n" | nc -t 172.17.58.131 80Substitua o caminho, o domínio, o IP e a porta pelos valores do seu ambiente.
-
Caso normal: É retornado um código de status
200ou outro código2xx/3xx, indicando que o serviço HTTP de backend está íntegro e o health check foi bem-sucedido. -
Situação anormal: É retornado um código de erro como
404, que não corresponde aos códigos de status2xx/3xxconfigurados para o listener do CLB. Verifique se o recurso no caminho de health check existe, se o domínio de health check está configurado no servidor de backend e se a porta de health check está correta.
-
Por que não consigo encontrar registros de falha de health check do CLB no console?
Os logs de health check são gerados uma vez por hora e retidos por apenas 3 dias por padrão. Se o status de health check de um listener do CLB não mudar dentro de 3 dias, nenhum log de health check é gerado. Você pode armazenar logs de health check no OSS para uma retenção mais longa.