ELB(Elastic Load Balancer)는 AWS의 로드 벨런서 서비스이다.
Load Balancer는 트래픽을 하나의 경로로 받아 다수의 인스턴스(서버)에 분산하는 역할을 한다. 즉, 네트워크 상에서 서버에 부하(Load)가 몰리지 않도록 적절히 분산(Balancing)해준다.
ELB란 애플리케이션에서 발생하는 트래픽을 여러 대상에 자동으로 분산하여 안정적인 서버 환경을 운용하는데 도움을 주는 서비스이다. EC2, 컨테이너, 람다 등 다양한 서비스와 연계하여 부하를 분배할 수 있다.
ELB는 VPC(AWS의 사용자 정의 네트워크)에 탑재되며, 사용자의 요청을 받고 이를 VPC 내의 리소스(EC2 등)에 적절히 분산한다. 그래서 ELB는 외부 요청을 받는 리스너와 요청을 분산/전달할 리소스의 집합인 대상 그룹으로 구성되며, ELB는 다수의 리스너와 대상 그룹을 가질 수 있다.
리스너(Listener)는 사용자의 요청을 받아 적절한 대상 그룹으로 라우팅하는 역할을 한다.
TLS(SSL) Offload 는 애플리케이션 서버에서 TLS 핸드쉐이크를 수행하지 않고, 트래픽이 서버로 전달되기 전 로드밸런서에서 SSL 인증서를 관리하고 TLS 핸드쉐이크를 수행하는 것을 말한다. (ELB에서 인증서를 등록 -> 클라이언트와 TLS 핸드쉐이크를 수행 -> 트래픽이 EC2 인스턴스 또는 컨테이너로 전달)
리스너가 전달한 요청을 처리하기 위한 부하/분산 대상들의 모임이다.
사용자가 ELB를 거쳐 EC2에 접근하고 서비스에 접속하여 커넥션을 맺고 통신을 한다. 그러다가 더 이상 통신이 없을 때, Connection Time Out(유휴 제한 시간)이 작동하게 되고, 이 시간이 지나면 커넥션이 사라진다.
ELB는 여러 가용 영역에 있는 리소스에 트래픽을 분산시켜 대량의 트래픽에도 병목 현상이 거의 일어나지 않으며, 정상 상태의 인스턴스에만 트래픽을 수신하게 하기 때문에 고가용성을 확보할 수 있다.
고가용성(High Availability)이란 애플리케이션 시스템이 오랫동안 지속적으로 정상 운영이 가능한 특성을 의미한다.
ELB는 네트워크 트래픽 변화에 빠르게 대처가 가능하다. Auto Scaling과 연동하여 사용하면, 트래픽의 변화에 따라 자동으로 리소스를 확장/축소할 수 있다.
ELB는 자동 확장/축소 함에 따라 ELB 접근 IP가 변경된다. 때문에 ELB에 접근하는 경우 ELB를 생성할 때에 생성되는 도메인 이름을 사용해 접근하도록 구성해야 한다.
위와 같이 각 가용 영역(AZ) 별로 로드 밸런서 노드와 EC2를 연결했다. 이 상태에서 AZ 별로 부하를 분산하면 이렇듯 부하가 불균형하다는 것을 알 수 있다.
이를 보완하기 위한 기능이 교차 영역 로드밸런싱(Cross Zone Load Balancing)이다. 위와 같이 AZ 별 부하/분산 대상의 수가 불균형할 때, 교차 영역 로드 밸런싱을 활성화하면 AZ를 가리지 않고 고르게 트래픽을 분산한다.
(ALB의 경우 기본적으로 활성화, NLB의 경우 기본적으로 비활성화)
대상 그룹 안에 있는 인스턴스들의 상태를 확인하는 것을 말한다. 대상 그룹에 연결된 인스턴스에 직접 트래픽을 발생시켜 인스턴스가 정상 작동하는지 체크하며, 상태 체크에 통과하지 못한 인스턴스는 더 이상 요청을 받지 못하게 된다.
이렇게 인스턴스의 상태를 자동으로 감지해 문제가 있는 것들은 배제하고, 인스턴스가 회복되면 자동으로 감지하여 다시 인스턴스에 트래픽을 보내준다.
이를 통해 장애가 전파되는 것을 방지하여 고가용성을 확보할 수 있다.
ELB 안에서 SSL 암호화를 간편하게 구성하여 지원한다. 따라서 SSL 증명서를 ELB 내부의 인스턴스들에 하나하나 설정할 필요가 없다. HTTPS 통신의 암호화/복호화 과정을 각 인스턴스에서 수행할 필요가 없으므로, 인스턴스의 부하를 낮출 수 있다. 또한 SSL 증명서를 ELB에서만 관리하면 되기 때문에 운용 측면에서도 장점을 가진다.
ALB는 OSI 7 Layer의 Applicaiton Layer에서 작동하는 로드 밸런서이다. HTTP, HTTPS 등의 트래픽 로드 밸런싱에 적합하며, HTTP의 주요 특징인 HTTP Header, 요청 메서드 등에 기준을 적용하여 기준에 맞는 적절한 대상 그룹을 라우팅할 수 있는 로드 벨런서이다.
NBL는 OSI 7 Layer의 Transport Layer에서 작동하는 로드 벨런서로, TCP/UDP를 사용하는 요청을 받아 부하/분산을 실시한다. 그래서 ALB보다 더 빠르다. 다만 HTTP가 아닌 TCP에서 처리하므로 HTTP 헤더를 해석하지 못한다. 따라서 복잡한 라우팅이 필요하지 않고, 트래픽이 극도로 많은 경우 사용하는 것이 적합하다.
CLB는 AWS에서 초기에 제공하던 ELB 서비스이다. 기본적인 로드 밸런서의 역할을 수행하지만, 서버의 기본 주소가 바뀌면 로드 벨런서를 새로 생성해야 하며, 하나의 주소에 하나의 대상 그룹만을 가진다. 또한 데이터를 수정할 수 없어 포트, 헤더 등의 정보를 변경하지 못한다. 지금은 레거시로 분류되어 있다.
GWLB는 인스턴스에 도달하기 전에 먼저 트래픽을 체크하여 트래픽 분석, 인증, 로깅 등의 작업을 수행한다.
Reference
https://inpa.tistory.com/entry/AWS-%F0%9F%93%9A-ELB-Elastic-Load-Balancer-%EA%B0%9C%EB%85%90-%EC%9B%90%EB%A6%AC-%EA%B5%AC%EC%B6%95-%EC%84%B8%ED%8C%85-CLB-ALB-NLB-GLB
https://aws-hyoh.tistory.com/128
https://www.youtube.com/watch?v=mqtUMduyKjk&list=PLfth0bK2MgIan-SzGpHIbfnCnjj583K2m&index=14&t=1745s
https://kdevkr.github.io/tls-offload/