로드 밸런싱을 이해하기 위해서는 스케일 업과 스케일 아웃에 대해서 먼저 인지해야 한다.
만약 서비스에 사용자가 몰려들어 현재 내 서버에 부하가 크게 왔다고 생각해 보자. 그렇다면 먼저 들 수 있는 생각은 “서버의 하드웨어 성능을 높이면 되지 않을까?” 와 같은 것이다.
따라서 단순히 서버의 하드웨어 성능을 높이는 것을 “스케일 업” 이라 한다. cpu나 램 등의 리소스를 추가해서 더 좋은 서버를 구매해 쓰는 것이다.
하지만 서버의 성능은 무한으로 확장시킬 수 없고 분명 한계가 존재한다. 스케일업을 때려박아서 람보르기니같은 고급서버를 가져도 유입자가 죽 늘어단다면 한계점을 견디지 못하고 터질 수 밖에 없다.
하지만 서버를 여러 대 증설해서 부하를 분산할 수는 있을 것이다. 이처럼 여러 대의 서버를 증설시키는 방법이 “스케일 아웃”이다.
결국 스케일 아웃을 통해 서버의 부하를 나누는 것이 “로드 밸런싱”이다. 그런데 서버를 대충 늘려놓기만 한다고 능사가 아니라, 무언가가 그 서버들이 각 요청을 나눌 수 있도록 지정하는 역할을 해줘야 할 것이다. 이 역할을 하는 것이 로드밸런서이다. 로드밸런서에는 여러 종류가 있지만 크게 하드웨어를 사용하는 방법과 소프트웨어를 사용하는 방법으로 나눌 수 있다.
하드웨어를 통한 방법에는 L4 스위치와 L7 스위치가 대표적으로 존재한다. L4 스위치와 L7 스위치의 이름이 왜 L4 스위치와 L7 스위치일까? 걍 단순하게 생각하면 된다. 4계층(전송 계층)에서 사용되니까 L4 스위치고, 7계층(애플리케이션 계층)에서 쓰니까 L7 스위치다.
방금 4계층(전송 계층)에서 사용하는 스위치라고 표현했음을 기억하자. 전송 계층에서 무엇을 하는가? ip와 포트 번호를 기준으로 패킷의 목적지를 판단한다.
따라서 ip와 포트 레벨을 기준으로 로드밸런싱을 수행하는 스위치가 L4 스위치다. 예를 들어 80포트의 요청을 8080과 8082 포트로 나눠서 처리한다던지, www.naver.com에 대한 요청을 두 개의 ip서버가 나눠서 처리한다던지와 같은 동작이다. (후자는 L3 스위치로도 처리할 수 있을 것이다.)
하지만 L4 스위치는 IP 주소와 포트 번호만을 보고 트래픽을 분산하기 때문에, 요청의 내용에는 직접적으로 접근하지 않는다. 따라서 만약 특정 요청의 내용을 기준으로 서버로의 분배를 조절할 수 없다.
L7 스위치 역시 7계층(애플리케이션 계층)에서 사용하는 스위치라고 언급했다. 애플리케이션 계층은 http와 같은 프로토콜을 사용하여 데이터를 전송한다. 따라서 L7 스위치는 로드밸런싱 또한 http 프로토콜을 활용하여 수행할 수 있다.
L7 스위치는 아래와 같이 요청의 특정 내용을 기반으로 서버 분배를 조절할 수 있다는 장점이 있다.
리버스 프록시를 활용하면 소프트웨어를 활용하여 로드 밸런싱을 수행할 수 있다. 리버스 프록시인 nginx를 로드밸런서로 활용한 로드 밸런싱이 대표적인 소프트웨어를 활용한 로드 밸런싱이다. nginx 역시 l4 스위치와 l7 스위치의 기능을 모두 제공할 수 있다.
nginx는 소프트웨어이므로 설치가 쉽고 비용적으로 저렴하다. 또 설정 변경도 쉬워서 유연하게 로드 밸런싱과 리버스 프록시 설정을 조절할 수 있다. http https 등 다양한 프로토콜을 지원하는 장점도 있다.
하지만 하드웨어 기반의 스위치보다 성능이 제한적이라 대규모 트래픽 처리에는 스위치가 더 적합할 수 있다. 스위치가 가용성과 안정성 측면에서 더 낫다고 볼 수 있다. 또 nginx는 결국 백엔드 서버를 활용하는데, 스위치는 네트워크 스위치 자체에서 로드 밸런싱을 수행해 서버의 부담이 덜하다고 한다.
좋은 글 감사합니다.