EC2 Elastic Load Balancer DNS 및 라우팅 관련 문제


19

Amazon EC2 (Amazon Elastic Load Balancer (ELB) 뒤에있는 여러 HTTP 서버)에서 Amazon EC2에 대해 매우 간단한 설정을 실행하려고합니다.

도메인은 Route53에서 관리되며 ELB를 가리 키도록 설정된 CNAME 레코드가 있습니다.

일부 위치 (일부는 아니지만)가 간헐적으로로드 밸런서에 연결할 수없는 문제가 발생했습니다. 이것이 ELB 도메인 이름의 확인 일 수 있습니다.

Amazon 지원팀은로드 밸런서의 기본 탄력적 IP가 변경되었으며 일부 ISP의 DNS 서버가 TTL을 준수하지 않는 것이 문제라고 조언했습니다. EC2 인스턴스뿐만 아니라 호주의 로컬 ISP 및 Google의 DNS 서버 ( 8.8.8.8) 를 통해 Amazon의 자체 DNS 서버를 사용하여 문제를 복제했기 때문에이 설명에 만족하지 않습니다 .

아마존은 또한 일부 지역에서 가동 중지 시간이 감지 된 기간 동안 ELB를 통과하는 트래픽이 현저히 감소 했으므로 엔드 포인트에 문제가 없음을 확인했습니다.

흥미롭게도 도메인은 연결할 수없는 서버에서 올바른 IP로 확인되는 것처럼 보이지만 TCP 연결을 설정하려는 시도는 실패합니다.

ELB에 연결된 모든 인스턴스는 항상 건강합니다. 그들은 모두

이 문제를 더 깊이 진단하는 방법을 아는 사람이 있습니까? 다른 사람이 Elastic Load Balancer에서이 문제를 경험 했습니까?

감사,


도메인 또는 도메인이 항상 올바른 EIP로 해석된다는 사실을 알 수있는 한 DNS 또는 라우팅과 관련이있는 것처럼 보이지만 host유틸리티를 실행하면 연결할 수있는 시스템 및 우리는 할 수 없습니다.
Cera

답변:


21

Goleling을 통해 Amazon Elastic Load Balancer (ELB)를 진단하는 방법에 대해이 질문을 발견했으며 많은 도움없이이 문제를 겪고있는 다른 사람을 위해 답변하고 싶습니다.

ELB 속성

ELB에는 몇 가지 흥미로운 특성이 있습니다. 예를 들어 :

  • ELB는 하나 이상의 노드로 구성됩니다
  • 이 노드는 ELB 이름에 대한 A 레코드로 게시됩니다.
  • 이러한 노드는 실패하거나 종료 될 수 있으며 연결이 정상적으로 닫히지 않습니다 .
  • 누군가가 ELB 문제를 파헤 치려면 종종 Amazon 지원 ($$$)과 좋은 관계가 필요합니다.

참고 : ELB가 갑자기 급증하는 트래픽을 처리하도록 설계되지 않았다는 또 다른 흥미로운 속성이지만 약간 덜 관련성이 있습니다. 규모가 커지기 전에 15 분 동안 많은 트래픽이 필요하거나 요청시 지원 티켓을 통해 예열 할 수 있습니다.

ELB 문제 해결 (수동)

업데이트 : AWS는 DNS에 Route 53을 사용하도록 모든 ELB를 마이그레이션했습니다. 또한 모든 ELB에는 이제 ELB에 all.$elb_name대한 전체 노드 목록을 리턴 하는 레코드가 있습니다. 예를 들어 ELB 이름이 인 elb-123456789.us-east-1.elb.amazonaws.com경우 다음과 같은 작업을 수행하여 전체 노드 목록을 가져옵니다 dig all.elb-123456789.us-east-1.elb.amazonaws.com. IPv6 노드의 경우 all.ipv6.$elb_name에도 작동합니다. 또한 Route 53은 여전히 ​​UDP를 사용하여 최대 4KB의 데이터를 반환 할 수 있으므로 +tcp플래그를 사용 하지 않아도됩니다.

이것을 알면 약간의 문제 해결을 스스로 할 수 있습니다. 먼저 ELB 이름을 노드 목록 (A 레코드)으로 확인하십시오.

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

tcp당신의 ELB는 하나의 UDP 패킷의 맞춤 내부에 너무 많은 레코드를 가질 수로 플래그가 좋습니다. 또한 쿼리 를 수행 하지 않는 한 Amazon이 최대 6 개의 노드 만 표시한다는 것을 개인적으로 확인하지는 않았습니다 ANY. 이 명령을 실행하면 다음과 같은 출력이 표시됩니다 (간결하게 트리밍).

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

이제 각 A레코드 에 대해 예 curl를 들어 ELB에 대한 연결을 테스트하는 데 사용합니다. 물론 백엔드에 연결하지 않고 ELB로만 테스트를 분리하려고합니다. ELB에 대한 하나의 최종 속성 및 알려진 사실 :

  • ELB를 통해 보낼 수있는 요청 메소드 (동사)의 최대 크기는 127 자 입니다. 더 큰 ELB는 HTTP 405-Method not allowed로 응답 합니다.

이는 ELB가 응답하는지 테스트하기 위해이 동작을 활용할 수 있음을 의미합니다.

$ 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

표시되면 HTTP/1.1 405 METHOD_NOT_ALLOWEDELB가 응답하는 것입니다. curl의 시간 초과를 허용 가능한 값으로 조정할 수도 있습니다.

Elbping을 사용하여 ELB 문제 해결

물론 이렇게하면 꽤 지루할 수 있으므로 elbping 이라는 자동화 도구를 만들었습니다 . 루비 젬으로 제공되므로 루비 젬이 있으면 간단히 다음을 수행하여 설치할 수 있습니다.

$ gem install elbping

이제 다음을 실행할 수 있습니다.

$ 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

당신이 볼 경우, 기억 code=405ELB가 응답하는지 그 방법을.

다음 단계

어떤 방법을 선택하든 최소한 ELB 노드가 응답하는지 알 수 있습니다. 이 지식으로 무장 한 경우 스택의 다른 부분에 대한 문제 해결에 중점을 두거나 무언가 잘못되었다는 것을 AWS에 상당히 합리적으로 제시 할 수 있습니다.

도움이 되었기를 바랍니다!


1
큰 답변 주셔서 감사합니다. 우리는 원래 시행 착오를 통해 대부분의 것을 알아 냈지만 이것은 편리한 참조가 될 것입니다.
Cera

7

해결 방법은 실제로 간단합니다. Route53 A대신 레코드를 사용하십시오 CNAME.

AWS Management Console에서 "A record"를 선택한 다음 "Alias"라는 라디오 버튼을 "Yes"로 이동하십시오. 그런 다음 드롭 다운 메뉴에서 ELB를 선택하십시오.


1
이 수정에 대한 근거를 이해하지 못합니다. ELB에 대한 아마존의 문서에는 구체적으로 CNAME레코드를 사용해야한다고 명시되어 있습니다. A기록 의 이점은 무엇입니까? 여기서 변경되는 내용은 무엇입니까?
Cera

3
DNS가 Route53 이외의 다른 곳에서 호스팅 된 경우 CNAME을 사용해야합니다. 그러나 레코드 별칭은 Route53에만 해당되는 기능으로, 발생한 정확한 문제를 해결하기위한 것입니다. Route53 워드 프로세서는 더 큰 깊이를 설명한다.
jamieb

@jamieb 해당 문서에 대한 링크를 제공 할 수 있습니까?
까지

1
A 레코드와 달리 "Alias ​​Target"이라고합니다. docs.aws.amazon.com/Route53/latest/DeveloperGuide/…
Jonny07

0

이 AWS 개발자 포럼에서 시도 할 수있는 몇 가지 솔루션이 있습니다. https://forums.aws.amazon.com/message.jspa?messageID=387552 .

예를 들면 다음과 같습니다.

잠재적 수정 # 1

ELB로 옮길 때 비슷한 문제가 발생하여 ELB의 이름을 단일 문자로 줄여서 해결했습니다. ELB의 2 자 이름조차도 네트워크 솔루션 DNS 확인에 임의의 문제가 발생했습니다.

ELB의 DNS 이름은-> X. <9chars> .us-east-1.elb.amazonaws.com과 같아야합니다.

잠재적 수정 # 2

나는 원래 포스터입니다. 모든 답변에 감사드립니다. TTL을 매우 높게 설정하여 DNS 문제가 발생하는 빈도를 줄일 수있었습니다 (비 네트워크 솔루션 서버에 의해 캐시 됨). 그러나 우리는 여전히 더 이상 네트워크 솔루션을 유지할 수 없었던 충분한 문제를 겪고있었습니다. 우리는 서비스에 대한 좋은 보고서를 바탕으로 UltraDNS로 전환 할 생각을했지만 Route 53 (UltraDNS를 사용하는 표지)은 더 저렴할 것 같습니다. Route 53으로 전환 한 이후 더 이상 DNS 문제가 없으며 ELB 이름도 길고 길 수 있습니다.

그 게시물에서 시도해야 할 다른 것들이 있었지만 최고의 리드 인 것 같습니다.


제안 해 주셔서 감사합니다. 불행히도 문제는 ELB에 대한 호스트 이름의 DNS 확인에 전적으로 달려있는 것으로 보입니다. 우리의 기록은 항상 ELB의 호스트 이름으로 올바르게 확인됩니다.
Cera

@jaimieb의 수정으로 문제가 해결 되었습니까?
slm

올바르게 이해하면 문제는 CNAME / ANAME 레코드 ELB로 해석되는 CNAME / ANAME 레코드가 있고 성능 문제가없는 상태에서 문제가 해결되지만 ELB의 DNS 레코드에 도달하면 성능 문제가 있다는 것입니다. 나타나다?
slm

@slm-잠재적 수정 # 1이 도움이되지 않습니다. 게시물에서 삭제하는 것이 좋습니다.
Ursus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.