로드 밸런싱?
로드 밸런싱이라는 단어 자체는 뜻이 넓다. 기본적으로 부하를 나누는 것이다. 여러 대의 컴퓨터에 작업을 나눠서 주는 것.
로드 밸런서는 로드 밸런싱을 하는 프로그램/장치다. (소프트웨어일 수도 있고, 하드웨어일 수도 있다.)
일반적으로 로드 밸런서라고 하면 서버 앞단에 위치하여 클라이언트 측의 요청을 분산해주는 프로그램을 칭한다.
로드 밸런싱 알고리즘
요청을 분산하는 방법은 다양하다.
- Round Robin: 요청이 들어올 때 마다 일정한 순서대로 요청을 넘긴다. A, B, C, D, E 5대의 서버거 있다고 가정하면 첫 번째로 들어온 요청은 A서버, 2번째로 들어온 요청은 B서버... 6번째 요청은 다시 A서버에게 주는 식이다. 서버의 사양이 모두 동일하며 persistent connection이 별로 없을 때 적합하다. 서버 부하에 대한 고려는 없기 때문에 상황에 따라 비효율적인 부하 분산이 발생할 수도 있다.
- Weighed Round Robin: 각 서버에 가중치를 매겨서 가중치가 높은 서버에 요청을 우선적으로 배분한다. A가 가중치 100, B가 가중치 400이라면 100개의 요청 중 20개는 A서버로, 80개는 B서버로 간다.
- Least Connection Method: 가장 적은 active connection이 있는 서버로 요청을 보낸다. 서버들이 persistent connection을 불균등하게 갖고 있을 때 유용하다. 서버의 부하 상태가 고려되는 장점이 있다. 하지만 서버 1대를 새로 투입할 경우 해당 서버는 persistent connection이 0이기 때문에(갓 뜬 서버니까) 요청이 몰릴 수도 있다.
- Least Response Time Method: active connection이 가장 적고, 가장 낮은 평균 응답 시간을 보이는 서버에 요청을 전달한다.
- IP Hash: 해시 함수와 IP 주소를 이용하여 서버를 결정한다. 동일한 IP는 동일한 서버로 가게 된다.
L2, L4, L7 로드밸런싱?
여기서 L은 OSI model(Open Systems Interconnection)의 층(Layer)을 말한다.
OSI model은 컴퓨터가 소통할 때 사용하는 기능들을 추상화하여 설명한 개념적 모형이다.
(혹시 Data Link의 llcr가 뭔지 궁금하다면 이 링크로)
L2 로드 밸런싱
- Layer 2(Data Link 계층)에서 정의된 정보를 바탕으로 로드 밸런싱을 하는 것이다.
- MAC 주소를 이용하여 전달할 서버를 결정한다. L4, L7 로드밸런서 대비 부하 분산 전략이 제한적이다.
아래와 같은 예시는 L2 로드 밸런싱으로는 불가능하다.
- Ex1) /image 엔드포인트로 오는 요청들은 용량 큰 이미지들을 보내줘야되는데, 이미지 파일들만 모아둔 서버한테 넘겨주고 싶다.
- Ex2) n번 포트로 들어오는 요청들을 m번 포트로 보내고 싶다.
- L2DSR 전략에서 로드밸런서는 inbound 패킷의 MAC 주소를 서버의 MAC 주소로 변환한 뒤 서버에게 전달한다.
이 전략을 사용하기 위해서는 로드밸런서와 서버가 반드시 같은 네트워크에 속해야 한다. 로드밸런서가 알 수 있는 게 MAC 주소 밖에 없는데, 패킷의 MAC 주소를 서버의 MAC 주소로 변경을 했을 때 이 패킷이 바로 서버로 가야 한다. IP는 그대로인데 MAC 주소만 바꿔서 서버에 도달해야 하는데, 이를 위해서 서버와 로드 밸런서 모두 VIP가 설정되어야 하는 등 이런 저런 제약이 있다. (자세한 내용은 이 문서 참고)
L4 로드 밸런싱
- Layer 4(Transport 계층)의 정보를 바탕으로 부하를 분산한다. IP 주소와 port 번호를 이용한다.
- L3의 정보도 활용하니까 정확히는 L3 and L4 로드 밸런싱이 맞겠지만, n번 레이어를 활용한다는 것은 n - 1 이하의 레이어들도 활용할 수 있다는 것이며 통상 L4 로드 밸런싱이라 불리므로 우리도 L4 로드 밸런싱이라고 부르자.
- L4 로드 밸런서는 패킷 헤더의 source IP와 destination IP를 NAT(Network Address Translation)을 통해 바꿔서 서버에게 전달한다. 반대로 클라이언트로 패킷이 갈 때도 source IP와 destination IP를 바꿔서 클라이언트에게 잘 전달되도록 한다. (표로 그리는 게 이해하기 쉬울 듯.)
- L2보다는 비용이 더 비싸지만 IP와 포트번호를 활용하여 상대적으로 더 섬세한 라우팅이 가능하다.
- 내용물을 보지 않기 때문에 TLS termination이 없다.
L7 로드 밸런싱
- Layer 7(Application 계층)의 정보를 바탕으로 부하를 분산한다. TLS termination이 일어난다.
- 소프트웨어적인 로드밸런싱이 필요하다. L2, L4 로드 밸런싱은 물리적 단계에서 충분하지만 L7은 소프트웨어를 사용해야 하기 때문에 비용이 더 비싸다.
- 가장 섬세한 라우팅이 가능하다. endpoint 별로 각기 다른 서버로 라우팅하거나, 라우팅한 서버에서 특정 http status code를 받았을 때 핸들링하는 등.
참고링크
https://avinetworks.com/what-is-load-balancing/
https://tech.kakao.com/2014/05/28/l3dsr/
'프로그래밍' 카테고리의 다른 글
cert-manager 삽질기 : propagation check failed... returned REFUSED for _acme-challenge ... (0) | 2020.10.27 |
---|---|
[토막팁] Using git submodule with specific branch / git submodule 특정 브랜치만 이용하기 (0) | 2020.07.09 |
[단상] 5/18 단상 (0) | 2020.05.18 |
[토막팁] 알아두면 유용한 Goland 단축키 (0) | 2020.05.18 |
Graceful Shutdown과 SIGINT/SIGTERM/SIGKILL (0) | 2020.05.17 |