Ho trovato questa domanda mentre cercavo su Google come diagnosticare Amazon Elastic Load Balancers (ELB) e voglio rispondere a chiunque come me abbia avuto questo problema senza troppe indicazioni.
Proprietà ELB
Gli ELB hanno alcune proprietà interessanti. Per esempio:
- Gli ELB sono costituiti da 1 o più nodi
- Questi nodi sono pubblicati come record A per il nome ELB
- Questi nodi possono fallire o essere chiusi e le connessioni non verranno chiuse con grazia
- Richiede spesso una buona relazione con il supporto Amazon ($$$) per indurre qualcuno a scavare nei problemi ELB
NOTA: un'altra proprietà interessante ma leggermente meno pertinente è che gli ELB non sono stati progettati per gestire improvvisi picchi di traffico. In genere richiedono 15 minuti di traffico intenso prima di aumentare o possono essere preriscaldati su richiesta tramite un ticket di supporto
Risoluzione dei problemi relativi agli ELB (manualmente)
Aggiornamento: da allora AWS ha migrato tutti gli ELB per utilizzare Route 53 per DNS. Inoltre, tutti gli ELB hanno ora un all.$elb_name
record che restituirà l'elenco completo dei nodi per ELB. Ad esempio, se il tuo nome ELB è elb-123456789.us-east-1.elb.amazonaws.com
, allora otterrai l'elenco completo dei nodi facendo qualcosa di simile dig all.elb-123456789.us-east-1.elb.amazonaws.com
. Per i nodi IPv6, all.ipv6.$elb_name
funziona anche. Inoltre, Route 53 è in grado di restituire fino a 4KB di dati che utilizzano ancora UDP, quindi +tcp
potrebbe non essere necessario utilizzare il flag.
Sapendo questo, puoi fare un po 'di risoluzione dei problemi da solo. Innanzitutto, risolvi il nome ELB in un elenco di nodi (come record A):
$ dig @ns-942.amazon.com +tcp elb-123456789.us-east-1.elb.amazonaws.com ANY
Il tcp
flag è suggerito poiché l'ELB potrebbe contenere troppi record per adattarsi all'interno di un singolo pacchetto UDP. Mi è stato anche detto, ma non ho confermato personalmente, che Amazon mostrerà solo fino a 6 nodi a meno che tu non esegua una ANY
query. L'esecuzione di questo comando ti darà un output simile al seguente (tagliato per brevità):
;; 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
Ora, per ciascuno dei A
record utilizzare ad esempio curl
per testare una connessione all'ELB. Naturalmente, vuoi anche isolare il tuo test solo sull'ELB senza collegarti ai tuoi backend. Un'ultima proprietà e fatti poco noti sugli ELB:
- La dimensione massima del metodo di richiesta (verbo) che può essere inviato tramite un ELB è di 127 caratteri . Più grande e ELB risponderà con un HTTP 405 - Metodo non consentito .
Ciò significa che possiamo sfruttare questo comportamento per testare solo che ELB sta rispondendo:
$ 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 vedi, HTTP/1.1 405 METHOD_NOT_ALLOWED
ELB sta rispondendo correttamente. Potresti anche voler regolare i timeout del ricciolo su valori che sono accettabili per te.
Risoluzione dei problemi relativi agli ELB mediante elbping
Naturalmente, farlo può diventare piuttosto noioso, quindi ho creato uno strumento per automatizzare questo chiamato elbping . È disponibile come gemma rubino, quindi se hai rubygem puoi installarlo semplicemente facendo:
$ gem install elbping
Ora puoi eseguire:
$ 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
Ricorda, se vedi, code=405
ciò significa che l'ELB sta rispondendo.
Prossimi passi
Qualunque metodo tu scelga, almeno saprai se i nodi del tuo ELB stanno rispondendo o meno. Grazie a questa conoscenza, puoi focalizzare la tua attenzione sulla risoluzione dei problemi di altre parti del tuo stack o essere in grado di fornire ad AWS un caso abbastanza ragionevole che qualcosa non va.
Spero che sia di aiuto!
host
dell'utilità si risolve allo stesso indirizzo su sistemi in cui possiamo connetterci e sistemi in cui non possiamo.