Elastic Load Balancing
사용 설명서

Elastic Load Balancing의 작동 방식

로드 밸런서는 클라이언트에서 오는 트래픽을 허용하고, 하나 이상의 가용 영역에서 등록된 대상(예: EC2 인스턴스)으로 요청을 라우팅합니다. 또한, 로드 밸런서는 등록된 대상의 상태를 모니터링하고 정상 대상으로만 트래픽이 라우팅되도록 합니다. 로드 밸런서는 비정상 상태의 대상이 감지되면 해당 대상으로의 트래픽 라우팅을 중지하고 대상이 다시 정상 상태가 된 것이 감지될 때 이 대상으로의 트래픽 라우팅을 재개합니다.

하나 이상의 리스너를 지정하여 들어오는 트래픽을 허용하도록 로드 밸런서를 구성합니다. 리스너는 연결 요청을 확인하는 프로세스입니다. 리스너는 클라이언트에서 로드 밸런서로의 연결을 위한 프로토콜 및 포트 번호와 로드 밸런서에서 대상으로의 연결을 위한 프로토콜 및 포트 번호로 구성됩니다.

Elastic Load Balancing은 Application Load Balancer, Network Load Balancer, Classic Load Balancer 등 세 가지 유형의 로드 밸런서를 지원합니다. 이러한 로드 밸런서를 구성하는 방법에는 주요 차이점이 있습니다. Application Load Balancer 및 Network Load Balancer에서는 대상을 대상 그룹에 등록하고 대상 그룹에 트래픽을 라우팅합니다. Classic Load Balancer에서는 로드 밸런서에 인스턴스를 등록합니다.

가용 영역 및 로드 밸런서 노드

로드 밸런서에서 가용 영역을 활성화하면 Elastic Load Balancing가 해당 가용 영역에서 로드 밸런서 노드를 생성합니다. 가용 영역에 대상을 등록하지만 가용 영역은 활성화하지 않는 경우 이러한 등록된 대상은 트래픽을 수신하지 않습니다. 로드 밸런서의 효과를 극대화하려면 활성화된 각 가용 영역에 하나 이상의 등록된 대상이 있어야 합니다.

여러 개의 가용 영역을 활성화하는 것이 좋습니다. (Application Load Balancer에서는 여러 개의 가용 영역을 활성화하는 것이 필수입니다.) 이 구성에서 가용 영역 하나가 사용할 수 없는 상태가 되거나 정상 상태 대상을 가지고 있지 않은 경우, 로드 밸런서가 다른 가용 영역에 있는 정상 상태의 대상으로 트래픽을 계속 라우팅할 수 있습니다.

가용 영역을 비활성화하면 해당 가용 영역의 대상은 로드 밸런서에 등록된 상태로 유지되지만 로드 밸런서는 대상으로 트래픽을 라우팅하지 않습니다.

교차 영역 로드 밸런싱

로드 밸런서의 노드는 클라이언트로부터 요청을 가져와서 등록된 대상에 분산합니다. 교차 영역 로드 밸런싱을 활성화하면 각 로드 밸런서 노드가 활성화된 모든 가용 영역에 있는 등록된 대상 간에 트래픽을 분산합니다. 교차 영역 로드 밸런싱을 비활성화하면 각 로드 밸런서 노드가 해당 가용 영역에 있는 등록된 대상 간에 트래픽을 분산합니다.

다음 다이어그램은 교차 영역 로드 밸런싱의 효과를 보여 줍니다. 활성화된 2개의 가용 영역이 있는데 가용 영역 A에는 2개의 대상이 있고 가용 영역 B에는 8개의 대상이 있습니다. 클라이언트는 요청을 보내며, Amazon Route 53은 로드 밸런서 노드 중 하나의 IP 주소를 통해 각 요청에 응답합니다. 이렇게 하면 각 로드 밸런서 노드가 클라이언트가 보내는 트래픽의 50%를 수신하도록 트래픽이 분산됩니다. 각 로드 밸런서 노드는 공유 트래픽을 해당 범위의 등록된 대상에만 분산합니다.

교차 영역 로드 밸런싱이 활성화된 경우 각 10개의 대상이 트래픽의 10%를 수신합니다. 이는 각 로드 밸런서 노드가 클라이언트 트래픽의 50%를 10개의 대상 모두에게 라우팅할 수 있기 때문입니다.

 교차 영역 로드 밸런싱이 항상 활성화되어 있는 경우

교차 영역 로드 밸런싱이 비활성화된 경우 가용 영역 A에 있는 각 2개의 대상은 25%의 트래픽을 수신하고 가용 영역 B에 있는 각 8개의 대상은 트래픽의 6.25%를 수신합니다. 이는 각 로드 밸런서 노드가 클라이언트 트래픽의 50%를 가용 영역에 있는 대상에만 라우팅할 수 있기 때문입니다.

 교차 영역 로드 밸런싱이 항상 비활성화되어 있는 경우

Application Load Balancer에서는 교차 영역 로드 밸런싱이 항상 활성화되어 있습니다.

Network Load Balancer에서는 교차 영역 로드 밸런싱이 기본적으로 비활성화되어 있습니다. Network Load Balancer를 생성하면 언제든지 교차 영역 로드 밸런싱을 활성화 또는 비활성화할 수 있습니다. 자세한 내용은 Network Load Balancer 사용 설명서교차 영역 로드 밸런싱 단원을 참조하십시오.

Classic Load Balancer를 생성하면 교차 영역 로드 밸런싱에 대한 기본값은 로드 밸런서 생성 방법에 따라 달라집니다. API 또는 CLI에서는 교차 영역 로드 밸런싱이 기본적으로 비활성화되어 있습니다. AWS Management 콘솔에서는 교차 영역 로드 밸런싱을 활성화하는 옵션이 기본적으로 선택되어 있습니다. Classic Load Balancer를 생성하면 언제든지 교차 영역 로드 밸런싱을 활성화 또는 비활성화할 수 있습니다. 자세한 내용은 Classic Load Balancer 사용 설명서교차 영역 로드 밸런싱 활성화 단원을 참조하십시오.

라우팅 요청

클라이언트는 로드 밸런서에 요청을 보내기 전에 로드 밸런서는 DNS(도메인 이름 시스템) 서버를 사용하여 로드 밸런서의 도메인 이름을 해석합니다. 로드 밸런서가 amazonaws.com 도메인에 있기 때문에 DNS 항목은 Amazon에서 제어합니다. Amazon DNS 서버는 하나 이상의 IP 주소를 클라이언트로 반환하고, 로드 밸런서에서 이 주소가 로드 밸런서 노드의 IP 주소가 됩니다. Network Load Balancer에서는 Elastic Load Balancing이 사용자가 활성화하는 각 가용 영역에 대해 네트워크 인터페이스를 만듭니다. 가용 영역의 각 로드 밸런서 노드는 이 네트워크 인터페이스를 사용하여 고정 IP 주소를 가져옵니다. 로드 밸런서를 생성할 때 필요에 따라 탄력적 IP 주소 하나를 각 네트워크 인터페이스에 연결할 수 있습니다.

애플리케이션에 대한 트래픽이 시간에 따라 변화하므로 Elastic Load Balancing은 로드 밸런서를 확장하고 DNS 항목을 업데이트합니다. 또한 DNS 항목에 TTL(Time-To-Live)이 60초로 지정되어 있기 때문에 변화하는 트래픽에 응답하여 신속하게 IP 주소를 재매핑할 수 있습니다.

클라이언트는 로드 밸런서로 요청을 전송하는 데 사용할 IP 주소를 결정합니다. 요청을 수신한 로드 밸런서 노드는 등록된 대상 중 상태가 양호한 대상을 선택하고 프라이빗 IP 주소를 사용하여 해당 대상으로 요청을 전송합니다.

라우팅 알고리즘

Application Load Balancer에서는 요청을 수신한 로드 밸런서 노드가 우선 순위에 따라 리스너 규칙을 평가하여 적용할 규칙을 결정한 다음, 라운드 로빈 라우팅 알고리즘을 사용하여 규칙 작업의 대상 그룹에서 대상을 선택합니다. 대상이 여러 개의 대상 그룹에 등록이 된 경우에도 각 대상 그룹에 대해 독립적으로 라우팅이 수행됩니다.

Network Load Balancer에서는 연결을 수신하는 로드 밸런서 노드가 프로토콜, 원본 IP 주소, 원본 포트, 대상 IP 주소 및 대상 포트, TCP 시퀀스 번호에 따라 흐름 해시 알고리즘을 사용하여 대상 그룹에서 기본 규칙을 위한 대상을 선택합니다. 클라이언트로부터의 TCP 연결은 소스 포트와 시퀀스 번호가 서로 다르므로 다른 대상에 라우팅될 수 있습니다. 각 TCP 연결은 연결 수명 동안 하나의 대상에 라우팅됩니다.

Classic Load Balancer에서는 요청을 수신한 로드 밸런서 노드가 TCP 리스너를 위한 라운드 로빈 라우팅 알고리즘과 HTTP 및 HTTPS 리스너를 위한 최소 미해결 요청 라우팅 알고리즘을 사용하여 등록 인스턴스를 선택합니다.

HTTP 연결

Classic Load Balancer는 사전 개방 연결을 사용하지만 Application Load Balancer는 그렇지 않습니다. Classic Load Balancer와 Application Load Balancer는 모두 연결 멀티플렉싱을 사용합니다. 즉, 여러 프런트 엔드 연결에 있는 여러 클라이언트의 요청을 단일 백엔드 연결을 통해 지정된 대상으로 라우팅할 수 있습니다. 연결 멀티플렉싱은 지연 시간을 최소화하고 애플리케이션의 로드를 줄입니다. 연결 멀티플렉싱을 하지 않으려면 HTTP응답에 Connection: close 헤더를 설정하여 HTTP 연결 유지를 비활성화합니다.

Classic Load Balancer는 프런트 엔드 연결(클라이언트에서 로드 밸런서)에서 HTTP/0.9, HTTP/1.0, HTTP/1.1 등의 프로토콜을 지원합니다.

Application Load Balancer는 프런트 엔드 연결에서 HTTP/0.9, HTTP/1.0, HTTP/1.1, HTTP/2 등의 프로토콜을 지원합니다. HTTPS 리스너에서만 HTTP/2를 사용할 수 있고, 하나의 HTTP/2 연결을 이용해 최대 128개의 요청을 동시에 전송할 수 있습니다. 또한 Application Load Balancer는 HTTP에서 Websockets으로 연결을 업그레이드할 수 있도록 지원합니다.

Application Load Balancer와 Classic Load Balancer는 모두 백 엔드 연결(로드 밸런서에서 등록된 대상)에서 HTTP/1.1을 사용합니다. 백 엔드 연결에서는 연결 유지 기능이 기본적으로 지원됩니다. 호스트 헤더가 없는 클라이언트로부터 오는 HTTP/1.0 요청의 경우, 로드 밸런서가 백 엔드 연결로 전송된 HTTP/1.1 요청에 대한 호스트 헤더를 생성합니다. Application Load Balancer의 경우, 호스트 헤더에 로드 밸런서의 DNS 이름이 포함되어 있습니다. Classic Load Balancer의 경우, 호스트 헤더에 로드 밸런서 노드의 IP 주소가 포함되어 있습니다.

Application Load Balancer와 Classic Load Balancer 모두에 대해 유휴 시간 초과 횟수 값을 설정할 수 있습니다. 기본 값은 60초입니다. Application Load Balancer에서는 유휴 제한 시간 값이 프런트 엔드 연결에만 적용됩니다. Classic Load Balancer에서는 프런트 엔드 연결이나 백 엔드 연결이 유휴 제한 시간 값을 초과하여 유휴 상태에 있으면 연결이 끊어지면서 클라이언트가 오류 응답을 수신하게 됩니다. 등록된 대상은 연결 유지 제한 시간을 사용하여 연결을 종료할 준비가 될 때까지 백 엔드 연결을 열린 상태로 유지할 수 있습니다.

Application Load Balancer와 Classic Load Balancer는 프런트 엔드 연결에서 파이프라인 HTTP를 지원합니다. 백 엔드 연결에서는 파이프라인 HTTP를 지원하지 않습니다.

HTTP 헤더

Application Load Balancer와 Classic Load Balancer는 X-Forwarded-For, X-Forwarded-ProtoX-Forwarded-Port 헤더를 지원합니다.

HTTP/2를 사용하는 프런트 엔드 연결의 경우, 헤더 이름이 소문자입니다. HTTP/1.1을 사용하여 대상에 요청이 전송되기 전에 X-Forwarded-For, X-Forwarded-Proto, X-Forwarded-Port, Host, X-Amzn-Trace-Id, Upgrade, Connection과 같이 헤더 이름이 대/소문자 혼용으로 변환됩니다. 기타 모든 헤더 이름은 소문자입니다.

Application Load Balancer와 Classic Load Balancer는 클라이언트로 다시 응답을 프록시한 후에 들어오는 클라이언트 요청에서 연결 헤더를 인식합니다.

Application Load Balancer를 위한 HTTP/1.x 헤더는 다음과 같이 크기 제한이 있습니다.

  • 요청 라인: 16K

  • 단일 헤더: 16K

  • 전체 헤더: 64K

Application Load Balancer를 위한 HTTP/2 헤더는 다음과 같이 크기 제한이 있습니다.

  • 요청 라인: 8K

  • 단일 헤더: 8K

  • 전체 헤더: 64K

로드 밸런서 체계

로드 밸런서를 생성할 때 로드 밸런서를 내부 로드 밸런서 또는 인터넷 경계 로드 밸런서로 생성할지 여부를 선택해야 합니다. EC2-Classic에서 Classic Load Balancer를 생성할 때는 반드시 인터넷 경계 로드 밸런서여야 합니다.

인터넷 경계 로드 밸런서의 노드는 퍼블릭 IP 주소를 가집니다. 인터넷 경계 로드 밸런서의 DNS 이름은 노드의 퍼블릭 IP 주소로 공개적으로 확인이 가능합니다. 따라서 인터넷 경계 로드 밸런서는 인터넷을 통해 클라이언트의 요청을 라우팅할 수 있습니다.

내부 로드 밸런서의 노드는 오직 프라이빗 IP 주소만 가집니다. 내부 로드 밸런서의 DNS 이름은 노드의 프라이빗 IP 주소로 공개적으로 확인이 가능합니다. 따라서 내부 로드 밸런서는 로드 밸런서를 위한 VPC에 액세스하여 클라이언트의 요청만 라우팅할 수 있습니다.

인터넷 경계 및 내부 로드 밸런서는 모두 프라이빗 IP 주소를 사용하여 대상으로 요청을 라우팅합니다. 따라서 대상이 퍼블릭 IP 주소 없이도 내부 또는 인터넷 경계 로드 밸런서에서 요청을 수신할 수 있습니다.

애플리케이션에 여러 개의 티어가 있는 경우(예: 인터넷에 반드시 연결되어야 하는 웹 서버와 웹 서버에만 연결되는 데이터베이스 서버) 내부 및 인터넷 경계 로드 밸런서를 모두 사용하는 아키텍처를 설계할 수 있습니다. 인터넷 경계 로드 밸런서를 생성하고 여기에 웹 서버를 등록합니다. 내부 로드 밸런서를 생성하고 여기에 데이터베이스 서버를 등록합니다. 웹 서버는 인터넷 경계 로드 밸런서에서 요청을 수신하고 데이터베이스 서버에서 내부 로드 밸런서로 요청을 전송합니다. 데이터베이스 서버는 내부 로드 밸런서에서 요청을 수신합니다.