업무를 하면서 LDAP, SSO서버, WAS(WebSphere) 등등을 N중화 해 보면서 L4, L7과 꽤나 친해졌다고 생각했는데 업무 중 과장님께서
"우리가 사용하는 LB는 무슨 알고리즘을 사용하고 있을까요? ㅎㅎ"
라고 물으셨는데 대답할 수 없어서 공부하며 정리해보는 글이다.
하나의 인터넷 서비스가 발생하는 트래픽이 많을 때 트래픽을 분산처리하여 서버의 로드율 증가 및 부하량 증가, 속도저하 등을 고려하여 트래픽을 적절히 분산처리 하여 작업 및 부하를 나누어 주는 장치 및 애플리케이션을 뜻한다.
인터넷을 사용하여 웹 서핑을 하고 뉴스를 보고 책을 읽고 업무를 하는 등 현재 인터넷 서비스는 현재 실생활에 있어 꼭 필요한 존재가 되었다. 그로 인해 인터넷 서비스 들은 트래픽과의 싸움이 되었다.
내가 다루고 있는 솔루션들의 경우에도 업무에 사용하는 경우가 많다. 업무를하다가 서버가 터져 급한 업무를 처리하지 못하면 얼마나 화가 나겠는가?
트래픽이 많은 서비스는 클라이언트의 수많은 동시 요청을 빠르고 안정적인 방식으로 처리해야 한다.
이러한 대규모 트래픽이 발생하는 서비스들은 서버를 확장해서 운영하는 것이 일반적이다. 서버를 확장하는 방법은 scale-up
, scale-out
2가지가 있다.
scale-up
: 기존 서버의 사양을 높이는 것scale-out
: 서버의 개수를 늘리는 것scale-out 방식으로 여러 서버를 운영 중이더라도 설계에 따라 수 많은 Client의 요청이 하나의 서버로 몰릴 수 있다.
이렇게 여러 서버를 두더라도 하나의 서버에 집중적으로 부하가 발생할 수 있다는 것이다.
특정 서버로의 트래픽 쏠림 현상을 해결하기 위해 로드 밸런싱은 반드시 필요한 기술이다.
로드밸런서는 OSI 7 Layer와 관련이 매우 깊다.
Load Balancer의 종류에는 L2, L3, L4, L7이 있지만 그 중에 L4 로드 밸런서부터 Port 번호를 바탕으로 부하를 분산하는 것이 가능하기 때문에 L4와 L7이 가장 많이 사용된다.
L4
: Layer4(TCP와 UDP)에서 IP와 Port를 활용하여 서버 부하분산을 하는 것을 의미한다.
L7
: Layer7의 프로토콜(ex. HTTP, HTTPS, FTP 등) 헤더나 쿠키 등과 같은 사용자의 요청을 분석하여 로드밸런싱을 실시하는 것을 의미한다. URL에 따라 분산시키거나, HTTP 헤더의 쿠키값에 따라 부하를 분산하는 등 Client의 요청을 보다 세분화 해 서버에 전달할 수 있다. 또, L7 Load Balancer는 서버의 응답까지도 알고 분석할 수 있다. 서버들로부터 필요한 정보를 응답 받아 Client의 요청을 전달하기 전에 서버의 상태를 파악한 후 Load Balancing을 진행할 수 있다.
라운드 로빈(Round Robin, RR)방식
시분할 시스템을 위해 설계된 방법 중 하나로서, 우선순위를 두지 않고 순서대로 할당하는 방식이다.
첫 번째 요청은 첫 번째 서버, 두 번째 요청은 두 번째 서버, 세 번째 요청은 세 번째 서버에 할당한다.
들어온 요청을 빠르게 서버에 분산해 전송하는 1차원적인 주 기능에 focus를 맞춘 방식이기 때문에 가장 많이 사용되는 Load Balancing 기법 중 하나라고 한다.
Load Balancing 대상 서버의 성능이 동일하고 처리 시간이 짧은 Application의 경우 균등하게 분산이 이루어지기 때문에 이 방식을 사용한다.
가중 라운드 로빈(Weighted Round Robin)방식
각 서버에 처리량(가중치, weight)를 지정한 후, 가중치가 높은 서버에 클라이언트 요청을 우선적으로 전달하는 방식이다. 주로 서버의 트래픽 처리 용량이 다를 경우(즉, 특정 서버의 스펙(사양)이 더 좋을 경우) 사용된다.
예를들어 A 서버(weight 3)와 B 서버(weight 1)가 있고 Load Balancer가 Client로 부터 8개의 요청을 받았다면 A서버에는 6개, B서버에는 2개의 요청이 전달된다.
IP 해시(IP HASH)방식
Client의 IP 주소가 어떤 서버로 요청이 전달 될지를 결정하는 방식이다. Client의 IP 주소가 바뀌지 않으면 동일한 서버로 요청이 보내지는 것을 보장한다. RR 방식과 달리, 서버에 Session Clustering이 구성되어 있지 않은 경우에 주로 사용한다.
최소 연결(Least Connection)방식
요청이 들어온 시점에 가장 적게 연결 되어 있는 서버에 요청을 전송하는 방식이다. 서버에 분배된 트래픽이 일정하지 않을 경우에 주로 사용한다.
최소 응답 시간(Least Response Time)방식
서버의 현재 연결 상태와 응답 시간을 모두 고려하여 가장 적은 연결 수와 가장 짧은 응답 시간을 가지는 서버에 우선적으로 요청을 보내는 방식이다.
다시 위의 질문으로 돌아가면
"우리가 사용하는 LB는 무슨 알고리즘을 사용하고 있을까요? ㅎㅎ"
지금 업무에서 사용하고있는 SSO 솔루션 앞에는 Hash 알고리즘을 채택하여 사용하고 있다고 한다.
여기서 의문점이 하나 들었는데, SSO 솔루션 자체에서 DSC(Distributed Session Cache)분산 세션 캐시를 지원하고 있는데 왜 Hash방식을 채택하여 Client IP에 따라 동일하게 요청을 보내는지 명확한 이유가 궁금했다.
그 이유는 SSO 에서 DSC를 지원하고는 있지만 매번 요청이 다른 서버로 가고 어떤 서버로 어떤 Client 요청이 갈지 예측할 수 없고 트래픽이 점점 많아진다면 서버에 당연히 부담이 가서 좋지 않을 것이기 때문에 Hash 방식을 채택한 Load Balancer를 사용하며, 그 외에 여러가지 변수 대비를 위하여 DSC 설정도 따로 가지고 간다고 한다.