ELB(Elastic Load Balancer)란 애플리케이션 트래픽을 여러 대상에 자동으로 분산시켜 안정적인 AWS서버 환경을 운용하는데에 도움을 주는 서비스다. EC2뿐만 아니라 컨테이너(ECS), AWS Lambda 등으로 다양한 서비스와 연계하여 부하를 분배할수 있다.
ELB는 서로 다른 EC2 인스턴스에 대한 하나의 엔드포인트를 제공한다. 그래서 사용자는 실제 요청이 처리되는 백엔드 인스턴스에 대한 고려 없이, 동일한 엔드포인트로 요청을 전송할 수 있다.
거기다 부하분산뿐만 아니라 부하 분산 대상에 대한 헬스 체크(Health Check), 고정 세션(Sticky), SSL Offload(SSL 암복호화), 헬스 체크를 통한 다운 서버 제외 등이 가능하다.
오토 스케일링을 이해하기위해 스케일링이 무엇인지 알아봤었던 것 처럼, ELB를 이해하기위해 우선 로드 밸런싱이 무슨 역할을 하는지 부터 알아보자.
Load(부하) Balancing(분산)이란 컴퓨터 네트워크 기술의 일종으로 둘 혹은 셋이상의 중앙처리장치 혹은 저장장치와 같은 컴퓨터 자원들에게 작업을 나누는 것을 의미한다.
말그대로 부하를 분산해 트래픽이 과도하게 몰려 서비스가 중단되는 현상을 막기 위한 기술이다. 그래야 지연 없이 작업을 처리하고 속도를 낼 수 있다.
회사에서 팀장이 외부로부터 받아 처리해야 할 업무를 팀원들에게 나누어 주어 기간안에 일을 처리하는 행위 또한 부하 분산으로 볼 수 있다.
로드 밸런서는 이런 부하를 분산하는 것 뿐만 아니라, 스케일 아웃에 대한 하나의 엔드포인트를 제공하기도 한다.
우리는 오토스케일링 그룹을 통해 다수의 인스턴스를 생성(스케일 아웃)하고 관리함으로써 고가용성을 확보할 수있고 안정적인 서비스를 제공할 수 있게 되었다.
그렇지만 이것을 사용하는 유저 입장에서는 증설된 각각의 인스턴스는 모두 다 일종의 컴퓨터이니 IP 주소를 갖고 있을테고, 이들을 관리하기 위해선 일일히 주소를 백업해 하나하나 접속하면서 관리해야 된다.
뿐만아니라, 만약 인스턴스 하나가 떨어지고 다시 새로 인스턴스가 올라가게 된다면, IP주소가 바뀌게 되고 이에 대해 별도의 조치를 취해야한다.
더군다나 만약에 인스턴스가 8개가 아니라 엄청 많을 때는 관리비용이 엄청 증가 하게 된다.
따라서, 오토스케일링 그룹 자체는 혁신적인 방법이지만 별도의 로드 밸런싱, 부하를 분산해주는 서비스 없이는 활용 불가이기 때문에 그래서 나온 서비스가 Elastic Load Balancing 인 것이다.
참고
ELB(Elastic Load Balancing)는 AWS에서 운용하는 로드 밸런서(Load Balancer)를 지칭 하는 것으로 보면 된다.
로드 밸런서(Load Balancer)에서 트래픽을 하나의 경로로 받아서 다수의 인스턴스에 분산하게 되어, 유저 입장에서는 각각의 인스턴스에 일일히 접근해서 관리하는게 아닌 하나의 주소로 접속해서 관리할 수 있게 된다.
인스턴스가 떨어져나가거나 오류가 나서 트래픽을 수신하지 못할 때에도 로드밸런서가 스마트하게(health check / monitoring) 알아서 트래픽을 전송하지 않게 하고, 새로운 인스턴스가 등록이 되면 자동으로 분산을 시켜준다.
오토 스케일링은 트래픽을 몰릴때 인스턴스(컴퓨터) 수를 자동으로 늘림으로서 서버 사이즈를 조절해 서비스가 원할히 유지되게 하며, 또한 트래픽이 적을경우 인스턴스를 감소시켜 비용 낭비를 막아주는 서비스이며,
ELB(Elastic 로드 밸런서)는 트래픽을 오토 스케일링을 통해 늘린 수만개의 인스턴스들에게 부하(트래픽)를 분산하는 서비스 이다.
즉, 이 둘은 형제자매 처럼 뗄레야 뗄수야 없는 관계이며, 같이 유기적으로 연동되어 EC2를 보다 효과적이게 이용 할 수 있게 한다. 그리고 실제로 이둘은 AWS 매니저에서 같이 설정하는 편이다.
ELB는 Virtual Private Network(VPC)에 탑재되며, 사용자의 요청을 받고 이를 VPC 내의 리소스(EC2 등)에 적절히 부하 분산한다.
ELB는 외부의 요청을 받아들이는 리스너(Listener)와 요청을 분산/전달할 리소스의 집합인 대상 그룹(Target Group)으로 구성되며 ELB는 다수의 리스너와 대상 그룹을 거느릴 수 있다.
부하 분산 대상인 대상 그룹 내 리소스들은 헬스 체크(Health Check)를 활용해 끊임없이 상태를 확인받게 된다.
리스너는 외부의 요청을 받아들이기 때문에 서비스 포트(Service Port)를 보유하고 있으며 외부의 요청은 서비스 포트로 접속하는 요청만을 처리한다.
대상 그룹 또한 서비스 포트를 보유하고 있으며 부하 분산 대상인 EC2는 해당 포트가 열려있어야 한다.
그리고 대상그룹의 포트는 꼭 리스너와 포트가 같은 필요는 없다. (뒤의 실습에서 자세히 다룬다)
요청을 검토한 리스너가 요청이 적합한 경우 대상그룹에게 이를 전달할 때 대상 그룹의 포트로 'Port Translation'을 실시하기 때문이다.
리스너는 프로토콜과 포트를 기반으로 요청을 받아 검사하고 이를 적절한 타겟으로 전달하는 기능을 수행한다.
그래서 이름에 'Listen' 이 붙는 것이다.
모든 로드 밸런서는 최소 1개 이상의 리스너를 필요로 하며, 최대 10개까지 설정할 수 있다.
뿐만 아니라 SSL 인증서를 게시하여 SSL Offload를 실시할 수도 있다.
Elastic Load Balancer-ELB
리스너 룰은 리스너와 타겟 그룹 사이의 트래픽 분배를 위한 라우팅 규칙에 해당한다.
룰은 우선순위, 액션, 조건 등의 정보를 담고 있으며, 조건이 만족되었을 때, 지정된 액션을 수행하는 방식으로 작동한다.
리스너 룰에는 path, host, HTTP header, source IP, query parameter 등의 다양한 조건을 제공한다.
리스너는 최초 생성 시, default rule을 포함하고 있다. 디폴트 룰은 별도의 조건을 가질 수 없으며, 다른 룰로 처리되지 않고 남은 모든 요청에 적용된다.
대상그룹은 리스너가 전달한 요청을 처리하기 위한 부하분산 대상들의 모임이다.
즉, ELB가 분산을 할 때 어디로 분산할 것이냐를 모은 그룹들이 대상그룹 이다. (만일 dashboard.mydomain.com으로 요청이 오면 대시보드 대상그룹으로 트래픽을 전송)
그렇기에 대상 그룹에 등록된 EC2의 각종 정보(인스턴스 ID, Port, AZ)가 적혀있고, 이 EC2가 전달받은 요청을 처리할 수 있는지를 체크하는 '헬스 체크(Health Check)' 기능과, 이 대상 그룹에 요청 처리가 가능한 EC2가 몇 개인지, 불가능한 EC2는 몇 개인지를 확인하는 요청 처리에 관련된 '모니터링(Monitoring)' 기능이 있다.
즉, 오토스케일링을 하기위해서 인스턴스들을 그룹으로 묶어 오토스케일링 그룹으로 만든 것처럼, 로드 밸런싱 하기위 해서 대상 인스턴스들을 묶어 놓은 그룹이라고 이해 하면된다.
그리고 이 대상그룹을 오토스케일링 그룹으로도 만들 수 있다. (ELB + Auto Scaling 조합)
사용자가 ELB를 거쳐 EC2에 접근하여 서비스를 접속하면 'Connection(이하 커넥션)'이 생성 되게 된다.
그리고 이 커넥션을 통해 사용자와 EC2가 통신을 하는 것이다.
만일 더 이상의 통신이 없을 땐, 유휴 제한 시간이 작동하게 되고, 그 시간(60초)이 지나면 커넥션이 사라진다.
즉, 유휴 제한 시간이란, 일정 시간동안 통신이 없을 때 커넥션을 삭제할 것인가를 뜻하는 것이다.
[ELB의 요청 처리 과정]
- 사용자가 로드밸런서에 접근하기 위해 Amazon의 DNS 서버에 로드밸런서의 도메인 해석을 요청
- Amazon의 DNS 서버가 로드밸런서 노드 IP 리스트를 사용자에게 전달
- 사용자는 전달받은 IP 중 하나를 선택하여 로드밸런서에 접근(+ Port 입력)
- 사용자는 로드밸런서의 (Port가 일치하는) 리스너에 접근하게 되며 리스너는 이 요청을 받아들여 적절한 대상그룹으로 전달
- 리스너로부터 전달받은 요청을 EC2가 처리한 후 다시 사용자에게 반환
위 그림에서는 각 AZ마다 탑재되어있는 로드밸런서 노드와 로드밸런서 노드에 연결된 다수의 EC2로 구성 되어있다.
문제없이 각 인스턴스에 로드 밸런서가 붙어있어 잘 부하 분산을 시켜줄 것 같지만 아니다.
로드밸런서 노드와 EC2 사이의 각각의 선에 숫자가 적혀 는데, 저 숫자를 모두 합쳐보면 100이라는 숫자가 나온다.
즉, 요청이 100개라면 각 EC2에 할당된 요청의 비율을 뜻하는 것이다. (AZ A에 각각 25개를, AZ B에 각각 6.25개를 전달)
부하 분산이란 트래픽을 대상들에게 고르게 트래픽을 전달하는 것을 말한다.
하지만 위의 구성에서는 AZ에따라 부하가 고르게 요청이 전달되지 않고 있다. 이렇게 된다면 AZ A의 EC2들에게 부하가 심하게 걸리게 된다.
이 대상 그룹에 요청 처리가 가능한 EC2가 몇 개인지, 불가능한 EC2는 몇 개인지를
이를 보완하기 위한 기능이 바로 교차 영역 로드밸런싱(Cross Zone Load Balancing)이다.
교차 영역 로드밸런싱을 활성화하면 위 그림과 같이 AZ를 가리지 않고 고르게 부하를 분산한다.
다음에 배울 ELB 종류중에 하나인 Application Load Balancer의 경우 기본적으로 교차 영역 로드밸런싱이 활성화되어있으며, Network Load Balancer는 기본적으로 비활성화 되어있다.
참고
정리하자면, 교차 영역 로드밸런싱은 Zone별로 사용하는 EC2 개수에 차이가 있는 경우 사용하면 좋은 기능이다.
헬스 체크 방법은 해당 포트의 Listen 상태를 감시하는 포트 감시, HTTP 또는 HTTPS의 경우 실제 HTML 파일 접근 가능 여부를 확인하는 서비스 감시라는 두가지 종류가 있다.
[HTTP/HTTPS 체크 방식]
[포트 감시 방식]
임계값(Threashold) 만큼 Health check가 실패하면 load balancer를 서비스에서 Target을 제외시키고, 다시 해당 Target이 Healthy 상태가 되면 서비스에 추가시킨다. (자동)
유형 | 정책 |
---|---|
CLB | 실행된 각 시간 또는 한 시간 미만, 그리고 로드 밸런서를 통해 전송된 각 GB 단위 데이터에 대해 비용이 청구 |
NLB | 실행된 시간 또는 부분 시간 그리고 시간당 Network Load Balancer에서 사용된 로드 밸런서 용량 단위(LCU)에 대해 요금이 부과 |
ALB | 실행된 시간 또는 부분 시간 그리고 시간당 사용된 로드 밸런서 용량 단위(LCU)에 대해 요금이 부과 |
ELB는 대표적으로 4가지의 로드밸런서가 존재한다.
aws에서 설정할때 이 셋 중 하나를 선택하여 로드밸런서를 생성하고 그 기능을 사용하게 된다.
Classic Load Balancer는 가장 기본적인 형태이자 초기에 제공되던 서비스이다.
가장 기본적인 로드 밸런서의 역할을 수행하지만, CLB의 단점은 서버의 기본주소가 바뀌면 Load Balancer를 새로 생성해야하며 하나의 주소에 하나의 대상 그룹으로 밖에 못 보낸다.
또한, 데이터를 수정/변경할 수 없어 포트, 헤더 등의 변경을 하지 못한다.
이러한 구조는 서버의 구성과 아키텍처가 커지고 복잡해진다. 따라서 Load Balancer의 필요 개수, 비용이 증가하게 된다.
현재에는 CLB(Classic LoadBalancer)를 많이 사용하지 않아 레거시로 분류되었고, 주로 NLB 또는 ALB를 사용하여 구성하는 추세이다.
Info
쿠팡에서 회원관리(shop) 인스턴스와 주문(order) 인스턴스가 따로 존재한다고 하자.
로그인 후 주문을 하기 위해서는 그림 처럼 각각 다른 Load Balancer를 거쳐 해당 인스턴스로 접속해야 하므로 서버 개수, 비용이 증가하게 된다.
Application Load Balancer는 OSI 7 Layer에서 최상단 일곱 번째 계층에 해당하는 Application Layer를 다루는 로드밸런서 이다.
사용자와 직접 접하는 계층으로서 여러분이 브라우저를 통해 이 블로그를 접속할 수 있도록 사용하는 프로토콜 역시 Application Layer에 해당하는 HTTP/HTTPS인 것이다.
Application Layer에는 HTTP/HTTPS뿐만 아니라 FTP, DNS, DHCP, WebSocket 등 다양한 프로토콜이 존재한다.
ALB는 단순 부하분산뿐만 아니라 HTTP/HTTPS의 헤더 정보를 이용해 부하분산을 실시할 수 있다. (지능적인 라우팅 기능)
즉, HTTP 헤더의 값들을 보고 이 요청은 어느 대상그룹으로 보낼지 저 요청은 어느 대상 그룹으로 보낼지를 판단할 수 있다는 뜻이다.
예를들어 위의 구식 CLB같은경우는 각 대상 그룹 주소 마다 로드 밸런서를 각각 두었다.
하지만 ALB는 로드 밸런서 하나만 설정하면, 트래픽을 모니터링하여 각 대상그룹에 라우팅을 하게 해준다.
/user path 경로로 오면 람다 대상그룹에 보내주고, /shop path로 오면 회원관리 대상그룹에 보내주는 식이다.
이처럼 유저가 어떤 서버로 접속함에 따라서 다른 경로로 스마트하게 라우팅이 가능하다.
따라서 로드밸런서의 갯수를 줄일수 있고 이는 곧 비용 절감으로 이어진다.
ALB는 path(경로) 뿐만 아니라 port(포트)에 따라 다른 대상그룹으로 맵핑할 수도 있다.
각각의 포트에 따라 다르게 구성할 수 있으며 동일한 포트라도 path(경로)등에 따라 다르게 분기할 수도 있다
특히 포트 단위로 연결해줄 수 있는 것은 도커 컨테이너 환경에서 아주 유용하게 작동할 수 있고 하나의 대상그룹에 더 많은 컨테이너를 넣어 비용을 최적화할 수 있다.
ALB는 대상을 EC2 인스턴스 뿐만 아니라 람다, IP로도 연결이 가능하며 특정한 요청에 대해서는 서버없이 직접 응답메세지를 작성할 수 있기때문에 마이크로아키텍쳐를 구성하기에 좋다.
그리고 SSL 인증서를 탑재할 수 있어 대상 그룹의 EC2를 대신하여 SSL 암호화/복호화를 대신 진행할 수 있다.
위의 내용을 종합해보면 Application Load Balancer는 TCP를 기반으로 하는 HTTP, HTTPS, WebSocket 등을 활용하며, HTTP의 주요 특징인 HTTP Header, Host Header, 요청 메서드 등에 기준을 적용하여 기준에 맞는 적절한 대상그룹으로 라우팅 할 수 있는 로드밸런서 이다.
Netowrk Load Balancer(이하 NLB)는 AWS에서 제공하는 4가지 로드밸런서 중 하나로 OSI 7 Layer에서 네 번째 계층에 해당하는 Transport Layer를 다루는 로드밸런서이다.
따라서 NLB는 TCP와 UDP를 사용하는 요청을 받아들여 부하분산을 실시한다.
단, HTTP가 아닌 하위 Layer인 TCP Layer에서 처리하므로 HTTP 헤더를 해석하지 못한다.
TCP 세션은 350초 유지한다고 한다.
로드 밸런서가 연결 요청을 받으면 기본 규칙의 대상 그룹에서 대상을 선택하고 리스너 구성에 지정된 포트에서 선택한 대상에 대한 TCP 연결을 열려고 시도한다.
네트워크 로드 밸런서는 고성능을 요구하는 환경에서의 부하분산에 적합한 솔루션이다.
낮은 레이턴시로 초당 수백만 건의 요청을 처리할 수 있으며 갑작스러운 트래픽 증대 및 변화에도 최적화 되어있다.
ALB과 비교하여 NLB의 가장 큰 특징은 바로 EIP로 공인 IP를 고정 할 수 있다는 점이다.
그래서 ALB와 달리 로드밸런서에 접글 할때 아이피나 DNS 둘다 사용이 가능하다.
정리하자면 ALB처럼 똑똑하게 주소로 보내주는게 아닌 단순한 라우팅이 필요하고, 트래픽이 극도로 많은 경우에는 ALB 보다는 NLB를 사용하는 것이 적합하다고 할 수 있다.
참고
ALB : 클라이언트가 웹화면을 요청하는 상황일때 (HTTP,HTTPS 프로토콜을 사용해서 어플리케이션 레벨 접근할때
NLB : 내부로 들어온 트래픽을 처리하고, 내부의 인스턴스로 트래픽을 전송할때
GWLB(Gateway Load Balancer)는 OSI(Open Systems Interconnection) 모델의 3 번째 계층인 네트워크 계층에서 작동한다.
GWLB를 사용하면 방화벽, 침입 탐지 및 방지 시스템, 심층 패킷 검사 시스템과 같은 가상 어플라이언스를 배포, 확장 및 관리할 수 있다.
즉, 트래픽을 EC2에 도달하기전에 먼저 트래픽을 검사하거나 분석하거나 인증하거나 로깅하는 작업을 먼저 수행할 수 있게 하는 서비스이다.
위에서 배운 일반적인 로드밸런스 역할과는 다르니, 그냥 트래픽을 체크하는 녀석이라고 이해하고 넘어가도 된다.