Encontrei essa pergunta enquanto pesquisava como diagnosticar os ELBs (Amazon Elastic Load Balancers) e quero respondê-la para qualquer outra pessoa como eu que teve esse problema sem muita orientação.
Propriedades de ELB
Os ELBs possuem algumas propriedades interessantes. Por exemplo:
- ELBs são compostos de 1 ou mais nós
- Esses nós são publicados como registros A para o nome do ELB
- Esses nós podem falhar ou ser desligados, e as conexões não serão fechadas com graça
- Geralmente, é necessário um bom relacionamento com o suporte da Amazon ($$$) para que alguém consiga resolver problemas de ELB
NOTA: Outra propriedade interessante, mas um pouco menos pertinente, é que os ELBs não foram projetados para lidar com picos súbitos de tráfego. Eles normalmente exigem 15 minutos de tráfego pesado antes de aumentar ou podem ser pré-aquecidos mediante solicitação por meio de um ticket de suporte
Solucionando problemas de ELBs (manualmente)
Atualização: A AWS desde então migrou todos os ELBs para usar o Route 53 para DNS. Além disso, todos os ELBs agora têm um registro all.$elb_name
que retornará a lista completa de nós para o ELB. Por exemplo, se seu nome de ELB for elb-123456789.us-east-1.elb.amazonaws.com
, você obterá a lista completa de nós fazendo algo como dig all.elb-123456789.us-east-1.elb.amazonaws.com
. Para nós do IPv6, all.ipv6.$elb_name
também funciona. Além disso, o Route 53 é capaz de retornar até 4 KB de dados ainda usando UDP, portanto, usar o sinalizador +tcp
pode não ser necessário.
Sabendo disso, você pode fazer um pouco de solução de problemas por conta própria. Primeiro, resolva o nome do ELB para uma lista de nós (como registros A):
$ dig @ns-942.amazon.com +tcp elb-123456789.us-east-1.elb.amazonaws.com ANY
O tcp
sinalizador é sugerido como seu ELB pode ter muitos registros para caber dentro de um único pacote UDP. Também me disseram, mas não confirmei pessoalmente, que a Amazon exibirá somente até 6 nós a menos que você execute uma consulta ANY
. A execução desse comando fornecerá uma saída semelhante a essa (reduzida para brevidade):
;; ANSWER SECTION:
elb-123456789.us-east-1.elb.amazonaws.com. 60 IN SOA ns-942.amazon.com. root.amazon.com. 1376719867 3600 900 7776000 60
elb-123456789.us-east-1.elb.amazonaws.com. 600 IN NS ns-942.amazon.com.
elb-123456789.us-east-1.elb.amazonaws.com. 60 IN A 54.243.63.96
elb-123456789.us-east-1.elb.amazonaws.com. 60 IN A 23.21.73.53
Agora, para cada um dos registros A
, use, e. curl
para testar uma conexão com o ELB. Claro, você também quer isolar seu teste apenas para o ELB sem conectar-se aos seus backends. Uma propriedade final e pouco fato conhecido sobre ELBs:
- O tamanho máximo do método de solicitação (verbo) que pode ser enviado por meio de um ELB é 127 caracteres . Qualquer tamanho maior e o ELB responderão com um HTTP 405 - Método não permitido .
Isso significa que podemos aproveitar esse comportamento para testar apenas se o ELB está respondendo:
$ curl -X $(python -c 'print "A" * 128') -i http://ip.of.individual.node
HTTP/1.1 405 METHOD_NOT_ALLOWED
Content-Length: 0
Connection: Close
Se você vir HTTP/1.1 405 METHOD_NOT_ALLOWED
, o ELB está respondendo com êxito. Você também pode querer ajustar os tempos limite da onda a valores aceitáveis para você.
Solucionando problemas de ELBs usando o elbping
É claro que fazer isso pode ser entediante, então eu criei uma ferramenta para automatizar isso chamado elbping . Está disponível como uma jóia rubi, por isso, se tiver rubygems, pode instalá-lo simplesmente fazendo:
$ gem install elbping
Agora você pode executar:
$ elbping -c 4 http://elb-123456789.us-east-1.elb.amazonaws.com
Response from 54.243.63.96: code=405 time=210 ms
Response from 23.21.73.53: code=405 time=189 ms
Response from 54.243.63.96: code=405 time=191 ms
Response from 23.21.73.53: code=405 time=188 ms
Response from 54.243.63.96: code=405 time=190 ms
Response from 23.21.73.53: code=405 time=192 ms
Response from 54.243.63.96: code=405 time=187 ms
Response from 23.21.73.53: code=405 time=189 ms
--- 54.243.63.96 statistics ---
4 requests, 4 responses, 0% loss
min/avg/max = 187/163/210 ms
--- 23.21.73.53 statistics ---
4 requests, 4 responses, 0% loss
min/avg/max = 188/189/192 ms
--- total statistics ---
8 requests, 8 responses, 0% loss
min/avg/max = 188/189/192 ms
Lembre-se, se vir code=405
, significa que o ELB está respondendo.
Próximos passos
Qualquer que seja o método escolhido, você pelo menos saberá se os nós do seu ELB estão respondendo ou não. Armado com esse conhecimento, você pode voltar seu foco para a solução de outras partes da sua pilha ou ser capaz de fazer um caso bem razoável para a AWS de que algo está errado.
Espero que isso ajude!