Probleme mit dem DNS und dem Routing von EC2 Elastic Load Balancer

19

Wir versuchen, ein relativ einfaches Setup auf Amazon EC2 auszuführen - mehrere HTTP-Server, die sich hinter einem Amazon Elastic Load Balancer (ELB) befinden.

Unsere Domain wird in Route53 verwaltet, und wir haben einen CNAME-Datensatz eingerichtet, der auf die ELB verweist.

Es sind einige Probleme aufgetreten, bei denen einige - aber nicht alle - Standorte zeitweise keine Verbindung zum Load Balancer herstellen können. Es scheint, dass dies die Auflösung des ELB-Domainnamens sein kann.

Der Amazon-Support teilte uns mit, dass sich die zugrunde liegende elastische IP-Adresse des Lastenausgleichs geändert hat und dass das Problem darin besteht, dass die DNS-Server einiger ISPs die TTL nicht einhalten. Mit dieser Erklärung geben wir uns nicht zufrieden, da wir das Problem mithilfe von Amazon-eigenen DNS-Servern aus einer EC2-Instanz sowie auf lokalen ISPs in Australien und über den DNS-Server von Google ( 8.8.8.8) repliziert haben .

Amazon bestätigte auch, dass in der Zeit, in der wir an einigen Standorten Ausfallzeiten bemerkten, der durch die ELB fließende Datenverkehr erheblich abnahm - das Problem liegt also nicht bei unseren Endpunkten.

Interessanterweise scheint die Domäne auf den Servern, die keine Verbindung herstellen können, die richtige IP-Adresse zu erhalten - aber der Versuch, eine TCP-Verbindung herzustellen, schlägt fehl.

Alle mit dem ELB verbundenen Instanzen waren zu jeder Zeit fehlerfrei. Sie sind alle

Weiß jemand, wie wir dieses Problem genauer diagnostizieren können? Hat jemand dieses Problem mit dem Elastic Load Balancer erlebt?

Vielen Dank,

Cera
quelle
Ich möchte als weiteren Hinweis hinzufügen - obwohl dies anscheinend möglicherweise mit DNS oder dem Routing zusammenhängt, soweit wir feststellen können, dass unsere Domain immer das richtige EIP hostauflöst -, wird das Dienstprogramm auf Systemen, auf denen eine Verbindung hergestellt werden kann, und auf Systemen, auf denen eine Verbindung hergestellt werden kann, unter derselben Adresse ausgeführt wir können nicht.
Cera

Antworten:

21

Ich habe diese Frage beim Durchsuchen der Diagnose von Amazon Elastic Load Balancers (ELBs) gefunden und möchte sie für alle anderen Personen wie mich beantworten, die diese Probleme ohne viel Anleitung hatten.

ELB-Eigenschaften

ELBs haben einige interessante Eigenschaften. Zum Beispiel:

  • ELBs bestehen aus einem oder mehreren Knoten
  • Diese Knoten werden als A-Datensätze für den ELB-Namen veröffentlicht
  • Diese Knoten können ausfallen oder heruntergefahren werden, und die Verbindungen werden nicht ordnungsgemäß geschlossen
  • Oft ist eine gute Beziehung zum Amazon-Support ($$$) erforderlich, um jemanden dazu zu bringen, sich mit ELB-Problemen zu befassen

ANMERKUNG: Eine weitere interessante, aber etwas weniger relevante Eigenschaft ist, dass ELBs nicht für plötzliche Verkehrsspitzen ausgelegt sind. Sie benötigen in der Regel 15 Minuten starken Datenverkehrs, bevor sie skaliert werden können, oder sie können auf Anfrage über ein Support-Ticket vorgewärmt werden

Fehlerbehebung bei ELBs (manuell)

Update: AWS hat seitdem alle ELBs migriert, um Route 53 für DNS zu verwenden. Darüber hinaus verfügen alle ELBs jetzt über einen all.$elb_nameDatensatz, der die vollständige Liste der Knoten für die ELB zurückgibt. Wenn Ihr ELB-Name beispielsweise lautet elb-123456789.us-east-1.elb.amazonaws.com, erhalten Sie die vollständige Liste der Knoten, indem Sie wie folgt vorgehen dig all.elb-123456789.us-east-1.elb.amazonaws.com. Funktioniert auch für IPv6-Knoten all.ipv6.$elb_name. Darüber hinaus kann Route 53 bis zu 4 KB an Daten zurückgeben, die noch UDP verwenden, sodass die Verwendung des +tcpFlags möglicherweise nicht erforderlich ist.

Wenn Sie dies wissen, können Sie ein wenig selbstständig Fehler beheben. Lösen Sie zunächst den ELB-Namen in eine Liste von Knoten (als A-Datensätze) auf:

$ dig @ns-942.amazon.com +tcp elb-123456789.us-east-1.elb.amazonaws.com ANY

Das tcpFlag wird vorgeschlagen, da Ihre ELB möglicherweise zu viele Datensätze enthält, um in ein einzelnes UDP-Paket zu passen. Ich habe auch erfahren, aber noch nicht persönlich bestätigt, dass Amazon nur bis zu 6 Knoten anzeigt, sofern Sie keine ANYAbfrage durchführen. Wenn Sie diesen Befehl ausführen, erhalten Sie eine Ausgabe, die ungefähr so ​​aussieht (der Kürze halber gekürzt):

;; 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

AVerwenden Sie nun für jeden curlDatensatz z. B. zum Testen einer Verbindung zur ELB. Natürlich möchten Sie Ihren Test auch nur auf die ELB beschränken, ohne eine Verbindung zu Ihren Backends herzustellen. Eine letzte Eigenschaft und wenig bekannte Tatsache über ELBs:

  • Die maximale Größe der Anforderungsmethode (Verb), die über eine ELB gesendet werden kann, beträgt 127 Zeichen . Jeder größere und der ELB antwortet mit einem HTTP 405 - Methode nicht erlaubt .

Dies bedeutet, dass wir dieses Verhalten nutzen können, um nur zu testen, ob der ELB reagiert:

$ 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

Wenn Sie sehen, HTTP/1.1 405 METHOD_NOT_ALLOWEDreagiert die ELB erfolgreich. Möglicherweise möchten Sie auch die Zeitüberschreitungen für die Wellung an Werte anpassen, die für Sie akzeptabel sind.

Fehlerbehebung bei ELBs mithilfe von Elbping

Natürlich kann dies ziemlich mühsam werden, daher habe ich ein Tool zur Automatisierung dieses Problems namens Elbping entwickelt . Es ist als Rubin-Edelstein erhältlich. Wenn Sie also Rubin-Edelsteine ​​haben, können Sie diese installieren, indem Sie einfach Folgendes tun:

$ gem install elbping

Jetzt können Sie laufen:

$ 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

Denken Sie daran, wenn Sie sehen code=405, bedeutet dies, dass die ELB antwortet.

Nächste Schritte

Unabhängig davon, für welche Methode Sie sich entscheiden, wissen Sie zumindest, ob die ELB-Knoten reagieren oder nicht. Mit diesem Wissen können Sie sich entweder auf die Fehlerbehebung anderer Teile Ihres Stapels konzentrieren oder AWS auf vernünftige Weise mitteilen, dass etwas nicht in Ordnung ist.

Hoffe das hilft!

Charles Hooper
quelle
1
Danke für die tolle Antwort. Das meiste haben wir ursprünglich durch Ausprobieren herausgefunden, aber dies wird eine nützliche Referenz sein.
Cera
7

Die Lösung ist eigentlich einfach: Verwenden Sie einen ADatensatz anstelle eines CNAMEin Route53.

Wählen Sie in der AWS Management Console "Ein Datensatz" und setzen Sie das Optionsfeld "Alias" auf "Ja". Wählen Sie dann Ihre ELB aus dem Dropdown-Menü.

Jamieb
quelle
1
Ich verstehe die Gründe für dieses Update nicht. In der Dokumentation von Amazon für die ELB heißt es ausdrücklich, dass ein CNAMEDatensatz verwendet werden sollte. Was wäre der Vorteil einer ASchallplatte / was ändert sich hier?
Cera
3
Sie müssten einen CNAME verwenden, wenn Ihr DNS an einem anderen Ort als Route53 gehostet wurde. Ein Record Aliasing ist jedoch eine Funktion, die speziell für Route53 gilt und das genaue Problem lösen soll, auf das Sie stoßen. In den Route53-Dokumenten wird dies ausführlicher erläutert.
Jamieb
@jamieb Können Sie einen Link zu dieser Dokumentation bereitstellen?
Bis zum
1
Es heißt "Alias ​​Target" im Gegensatz zu einem A-Datensatz. docs.aws.amazon.com/Route53/latest/DeveloperGuide/…
Jonny07
0

In diesem AWS-Entwicklerforum können Sie einige mögliche Lösungen ausprobieren. https://forums.aws.amazon.com/message.jspa?messageID=387552 .

Beispielsweise:

potenzielle Lösung Nr. 1

Wir hatten ein ähnliches Problem, als wir zu ELB wechselten. Wir haben dieses Problem gelöst, indem wir den Namen unserer ELB auf ein einzelnes Zeichen reduziert haben. Sogar ein 2-stelliger Name für ELB verursachte zufällige Probleme mit DNS-Auflösungen für Netzwerklösungen.

Der DNS-Name Ihrer ELB sollte ungefähr so ​​lauten: -> X. <9 Zeichen> .us-east-1.elb.amazonaws.com

potenzielle Lösung Nr. 2

Ich bin das Originalplakat. Vielen Dank für alle Antworten. Wir konnten die Häufigkeit von DNS-Problemen reduzieren, indem wir die TTL sehr hoch einstellten (sodass sie von Servern zwischengespeichert wurden, die nicht von Network Solutions stammen). Wir bekamen jedoch immer noch genug Probleme, bei denen wir einfach nicht länger bei Network Solutions bleiben konnten. Wir dachten, basierend auf guten Berichten über den Dienst zu UltraDNS zu wechseln, aber es sah so aus, als ob Route 53 (die offenbar UltraDNS unter der Decke verwendet) für uns billiger wäre. Seit dem Umstieg auf Route 53 gibt es keine DNS-Probleme mehr, und unsere ELB-Namen können auch schön und lang sein.

In diesem Beitrag gab es noch andere Dinge zu versuchen, aber diese scheinen die besten Hinweise zu sein.

slm
quelle
Danke für die Vorschläge. Leider scheint das Problem nur in der DNS-Auflösung des Hostnamens für die ELB zu liegen, nicht in unserem Datensatz, der als Aliase dafür dient. Unser Datensatz wird immer korrekt in den Hostnamen der ELB aufgelöst.
Cera
Hat @ jaimieb's Fix das Problem gelöst?
Slm
Wenn ich Sie richtig verstehe, besteht das Problem darin, dass Sie CNAME / ANAME-Datensätze haben, die sich in eine CNAME / ANAME-Datensatz-ELB auflösen, und Ihr Teil ist in Ordnung, es gibt keine Leistungsprobleme, aber sobald Sie die DNS-Datensätze der ELB erreichen, werden die Leistungsprobleme aufgezeichnet erscheinen?
Slm
@slm - potenzielle Lösung Nr. 1 hilft nicht. Ich würde empfehlen, es von der Post zu entfernen.
Ursus