Problemy z DNS i routingiem modułu elastycznego równoważenia obciążenia EC2

19

Próbujemy uruchomić dość prostą konfigurację na Amazon EC2 - kilka serwerów HTTP siedzących za Amazon Elastic Load Balancer (ELB).

Nasza domena jest zarządzana w Route53 i mamy ustawiony rekord CNAME wskazujący na ELB.

Wystąpiły problemy, w których niektóre - ale nie wszystkie - lokalizacje nie są w stanie sporadycznie połączyć się z modułem równoważenia obciążenia; wydaje się, że może to być rozdzielczość nazwy domeny ELB.

Wsparcie Amazon poinformowało nas, że elastyczny adres IP modułu równoważenia obciążenia zmienia się, a problemem jest to, że serwery DNS niektórych dostawców usług internetowych nie honorują TTL. Nie jesteśmy zadowoleni z tego wyjaśnienia, ponieważ powieliliśmy problem przy użyciu własnych serwerów DNS Amazon z instancji EC2, a także lokalnych dostawców usług internetowych w Australii i serwera DNS Google ( 8.8.8.8).

Amazon potwierdził również, że w okresie, w którym zauważyliśmy przestoje z niektórych lokalizacji, ruch przechodzący przez ELB był znacznie zmniejszony - więc problem nie dotyczy naszych punktów końcowych.

Co ciekawe, domena wydaje się rozpoznawać poprawny adres IP na serwerach, które nie mogą się połączyć - ale próba nawiązania połączenia TCP kończy się niepowodzeniem.

Wszystkie instancje dołączone do ELB były przez cały czas zdrowe. Oni wszyscy są

Czy ktoś wie, jak możemy głębiej zdiagnozować ten problem? Czy ktoś jeszcze doświadczył tego problemu z Elastic Load Balancer?

Dzięki,

Cera
źródło
Powinienem dodać jako kolejną notatkę - pomimo tego, że pozornie jest to potencjalnie związane z DNS lub routingiem, o ile możemy stwierdzić, że nasza domena zawsze rozpoznaje poprawny EIP - uruchomienie hostnarzędzia rozwiązuje ten sam adres w systemach, do których możemy się łączyć i systemach, w których nie możemy.
Cera,

Odpowiedzi:

21

Znalazłem to pytanie podczas korzystania z Googling, dotyczące diagnozowania równoważników obciążenia elastycznego Amazon (ELB) i chcę odpowiedzieć na to pytanie dla wszystkich osób takich jak ja, które miały takie problemy bez większych wskazówek.

Właściwości ELB

ELB mają kilka interesujących właściwości. Na przykład:

  • ELB składają się z 1 lub więcej węzłów
  • Te węzły są publikowane jako rekordy A dla nazwy ELB
  • Te węzły mogą ulec awarii lub zostać zamknięte, a połączenia nie zostaną zamknięte z wdziękiem
  • Często wymaga dobrych relacji ze wsparciem Amazon ($$$), aby skłonić kogoś do zgłębienia problemów z ELB

UWAGA: Inną interesującą właściwością, ale nieco mniej istotną, jest to, że ELB nie zostały zaprojektowane do obsługi nagłych skoków ruchu. Zwykle wymagają 15 minut dużego natężenia ruchu, zanim zwiększą skalę lub mogą zostać wstępnie rozgrzane na żądanie za pomocą biletu pomocy technicznej

Rozwiązywanie problemów z ELB (ręcznie)

Aktualizacja: od tego czasu AWS przeprowadziła migrację wszystkich ELB, aby używać trasy 53 dla DNS. Ponadto wszystkie ELB mają teraz all.$elb_namerekord, który zwróci pełną listę węzłów dla ELB. Na przykład, jeśli masz nazwę ELB elb-123456789.us-east-1.elb.amazonaws.com, to uzyskasz pełną listę węzłów, robiąc coś podobnego dig all.elb-123456789.us-east-1.elb.amazonaws.com. W przypadku węzłów IPv6 all.ipv6.$elb_namedziała również. Ponadto Route 53 jest w stanie zwrócić do 4KB danych nadal przy użyciu UDP, więc użycie +tcpflagi może nie być konieczne.

Wiedząc o tym, możesz samodzielnie rozwiązać problem. Najpierw przetłumacz nazwę ELB na listę węzłów (jako rekordy A):

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

tcpFlaga jest sugerowane jako swoją ELB może mieć zbyt wiele rekordów aby zmieścić wewnątrz pojedynczego pakietu UDP. Powiedziano mi również, ale osobiście nie potwierdziłem, że Amazon wyświetli tylko do 6 węzłów, chyba że wykonasz ANYzapytanie. Uruchomienie tej komendy da ci wynik, który wygląda mniej więcej tak (przycięty dla zwięzłości):

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

Teraz dla każdego z Arekordów użyj np. curlDo przetestowania połączenia z ELB. Oczywiście, chcesz również izolować test tylko na ELB bez łączenia się z backendami. Jedna ostateczna właściwość i mało znany fakt na temat ELB:

  • Maksymalny rozmiar metody żądania (czasownika), który można wysłać przez ELB, wynosi 127 znaków . Każda większa, a ELB odpowie HTTP 405 - Metoda niedozwolona .

Oznacza to, że możemy wykorzystać to zachowanie do przetestowania tylko tego, że ELB odpowiada:

$ 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

Jeśli widzisz, HTTP/1.1 405 METHOD_NOT_ALLOWEDELB odpowiada pomyślnie. Możesz także dostosować limity czasu curl do wartości, które są do zaakceptowania.

Rozwiązywanie problemów ELB za pomocą elbping

Oczywiście robienie tego może być dość nużące, dlatego stworzyłem narzędzie do automatyzacji tego, co nazywa się elbping . Jest dostępny jako rubinowy klejnot, więc jeśli masz rubygemy, możesz go zainstalować, wykonując:

$ gem install elbping

Teraz możesz uruchomić:

$ 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

Pamiętaj, jeśli widzisz code=405, oznacza to, że ELB odpowiada.

Następne kroki

Niezależnie od wybranej metody, będziesz przynajmniej wiedział, czy węzły Twojego ELB odpowiadają, czy nie. Uzbrojeni w tę wiedzę, możesz albo skoncentrować się na rozwiązywaniu problemów z innymi częściami stosu, albo być w stanie uzasadnić AWS, że coś jest nie tak.

Mam nadzieję że to pomoże!

Charles Hooper
źródło
1
Dzięki za świetną odpowiedź. Początkowo ustaliliśmy większość z nich metodą prób i błędów, ale będzie to przydatne odniesienie.
Cera,
7

Poprawka jest w rzeczywistości prosta: użyj Arekordu zamiast CNAMEw Route53.

W konsoli zarządzania AWS wybierz „Rekord”, a następnie przesuń przycisk opcji „Alias” na „Tak”. Następnie wybierz ELB z menu rozwijanego.

jamieb
źródło
1
Nie rozumiem uzasadnienia tej poprawki. Dokumentacja Amazon dla ELB wyraźnie mówi, że CNAMEnależy użyć zapisu. Jaka byłaby korzyść z Azapisu / co się tutaj zmienia?
Cera,
3
Musisz użyć CNAME, jeśli Twój DNS był hostowany w innym miejscu niż Route53. Ale aliasing rekordów jest funkcją specyficzną dla Route53 i ma na celu rozwiązanie dokładnie napotkanego problemu. Dokumenty Route53 wyjaśniają to bardziej szczegółowo.
jamieb
@jamieb Czy możesz podać link do tego dokumentu?
Do
1
Nazywa się to „Alias ​​Target” w przeciwieństwie do rekordu A. docs.aws.amazon.com/Route53/latest/DeveloperGuide/…
Jonny07
0

Istnieje kilka potencjalnych rozwiązań, które możesz wypróbować na tym forum programistów AWS. https://forums.aws.amazon.com/message.jspa?messageID=387552 .

Na przykład:

potencjalna poprawka nr 1

Mieliśmy podobny problem, kiedy przeprowadziliśmy się do ELB, rozwiązaliśmy ten problem, redukując nazwę naszego ELB do jednego znaku. Nawet 2-znakowa nazwa ELB powodowała przypadkowe problemy z rozwiązaniami DNS rozwiązań sieciowych.

Nazwa DNS twojego ELB powinna być podobna do -> X. <9chars> .us-east-1.elb.amazonaws.com

potencjalna poprawka # 2

Jestem oryginalnym plakatem. Dziękuję za wszystkie odpowiedzi. Byliśmy w stanie zmniejszyć częstotliwość występowania problemów z DNS, ustawiając bardzo wysoką wartość TTL (aby były buforowane przez serwery inne niż Network Solutions). Nadal mieliśmy jednak dość problemów, w których nie mogliśmy dłużej pozostać przy rozwiązaniach sieciowych. Myśleliśmy o przejściu na UltraDNS na podstawie dobrych raportów na temat usługi, ale wyglądało na to, że Route 53 (jak się wydaje, używa UltraDNS pod przykryciem) byłaby dla nas tańsza. Od czasu przejścia na Trasę 53 nie mamy już problemów z DNS, a nasze nazwy ELB mogą być ładne i długie.

W tym poście można było wypróbować inne rzeczy, ale te wydają się być najlepszymi potencjalnymi klientami.

slm
źródło
Dziękuję za sugestie. Niestety wydaje się, że problem leży wyłącznie w rozwiązaniu DNS nazwy hosta dla ELB, a nie w naszym zapisie, który do niego pseudonim. Nasz rekord zawsze rozwiązuje poprawnie nazwę hosta ELB.
Cera,
Czy poprawka @ jaimieb rozwiązała problem?
slm
Jeśli dobrze cię rozumiem, problem polega na tym, że masz rekordy CNAME / ANAME, które są rozwiązywane do rekordu ELB rekordu CNAME / ANAME, a Twoja część rozwiązuje się dobrze, nie ma problemów z wydajnością, ale po przejściu do DNS ELB rejestruje problemy z wydajnością pokazać się?
slm
@slm - potencjalna poprawka nr 1 nie pomaga. Polecam usunięcie go z postu.
Ursus