현대 모든 웹 서비스들은 인터넷을 기반으로 서비스되고 있습니다. 인터넷의 발달로 모든 것이 편리해졌고 많은 사용자들을 인터넷을 사용할 수 있도록 도와주었지만 이는 트래픽의 폭발적인 증가의 요인이 되기도 했습니다. 아무리 성능이 좋은 서버라도 엄청난 양의 트래픽을 감당하기엔 한계가 반드시 존재합니다. 무수히 쏟아지는 트래픽을 여러 대의 서버로 분산해주는 기술이 없다면 한 서버로 모든 트래픽이 몰리게 되어 서비스 장애가 발생할 수도 있습니다. 이에 대한 해결 방안인 로드 밸런싱에 대해 정리해 보겠습니다.
1. 로드 밸런싱(Load Balancing)
1-1. 정의
(1) 로드 밸런싱은 네트워크 또는 서버에 가해지는 부하 트래픽을 분산시켜주는 기술을 의미합니다.
1-2. 로드 밸런싱의 필요성
(1) 웹 비즈니스가 복잡하지 않았단 과거의 웹 서비스는 한 대의 서버를 운영하여 클라이언트의 요청을 모두 처리했습니다. 하지만 현대의 웹 서비스 애플리케이션은 사용자의 요구가 점차 늘어나고 비즈니스 복잡도도 크게 증가하여 상당히 무거운 웹 애플리케이션으로 변화되었고 이에 따라 클라이언트의 수도 기하급수적으로 늘게 되어 기존보다 서버의 부하가 크게 증가하였습니다.
(2) 이에 따라 서버의 부하를 줄일 기술이 필요해졌고, 로드 밸런싱은 여러 대의 서버를 두고 서비스를 제공하는 분산 처리 시스템에서 반드시 필요한 기술입니다.
2. 서버를 확장하는 방법 : Scale up, Scale out
(1) 서버의 부담을 줄이기 위해 서버를 확장할 때 아래와 같은 2가지 방법을 사용할 수 있습니다.
2-1. Scale-up / 장점과 단점
(1) Scale-up의 경우 기존 서버의 자체 사양을 높이는 것을 말합니다.
(2) 기존 서버의 자원이 한계에 도달한 경우 하드웨어적으로는 서버에 디스크를 추가하거나 CPU나 RAM과 같은 자원을 업그레이드 시키는 것을 의미합니다.
(3) 소프트웨어적으로는 AWS와 같은 클라우드 서비스의 인스턴스 사양을 높일 수 있습니다.
(4) 기존 서버의 성능을 확장하는 것이기 때문에 Vertical scaling이라고도 부릅니다.
(5) 장점
- 추가적인 네트워크 연결 없이 서버의 자원을 늘릴 수 있습니다.
- 수평적 확장(Scale-out, Horizontal scaling) 방식보다 관리 비용이나 운영 이슈가 적고 확장 방식이 비교적 간단합니다.
- 서버의 개수가 1대이므로 데이터의 일관성이 유지됩니다.
(6) 단점
- 하드웨어적인 비용(Cost) 부담이 크고 업그레이드 범위가 정해져 있기 때문에 성능 향상에 한계점이 존재합니다.
- 서버 한 대가 모든 부하를 감당해야 하고 만약 서버가 터진다면 바로 서비스 장애로 이어질 수 있습니다.
2-2. Scale-out / 장점과 단점
(1) Scale-out의 경우 서버의 개수를 늘리는 것을 말합니다.
(2) 기존 서버의 자원이 한계에 도달한 경우 비슷한 사양의 서버를 추가로 연결해 트래픽을 분산시켜 기존 서버의 부하를 줄이는 로드 밸런싱 기술을 사용할 수 있습니다.
(3) 클라우드 서비스의 경우 리소스 사용량을 별도로 모니터링하여 자동으로 서버를 증설할 수 있는 Auto scaling 기술도 지원하고 있습니다.
(4) 서버의 개수를 늘리는 것으로 Horizontal scaling이라고도 부릅니다.
(5) 장점
- 유연한 확장성을 가집니다.
- 서버 한 대가 다운되더라도 나머지 서버로 서비스를 운용/유지할 수 있습니다.
- 필요한만큼 서버의 개수를 증설할 수 있어서 확장에 대한 제한 사항이 없습니다.
(6) 단점
- 여러 노드를 연결해 병렬 컴퓨팅 환경을 구성해야 하기 때문에 관련 아키텍처에 대한 높은 이해도가 요구됩니다.
- 여러 서버가 존재하기 때문에 데이터 일관성이 깨질 수 있습니다. (아키텍처 설계 과정이 중요)
- 여러 노드에 균등하게 부하를 분산시키기 위해 로드 밸런서(Load Balancer)가 필요합니다.
3. 로드 밸런서(Load Balancer)의 정의와 역할, 종류
3-1. 정의와 역할
(1) 클라이언트와 서버 Pool(서버 그룹들) 사이에 위치해서 서버의 부하를 분산시키는 하드웨어나 소프트웨어를 의미합니다.
(2) 이러한 로드 밸런서는 네트워크 트래픽과 클라이언트의 요청을 여러 서버에 적절하게 분배시킵니다.
(3) 정상적으로 운영되고 있는 서버에게만 요청을 전송합니다. (다운된 서버가 있을 경우 유연하게 다른 서버로 Redirection한다.)
(4) 서비스의 직접적인 중단 없이 서버를 추가하거나 뺄 수 있습니다.
3-2. 로드 밸런서의 종류 : L4 Load Balancer
(1) OSI 7 Layer에서 4계층인 전송 계층을 기반으로 해서 포트 번호를 바탕으로 부하를 분산시키는 로드 밸런서를 L4 로드 밸런서라고 합니다. 4계층 이하의 모든 정보를 갖고 있기 때문에 IP 주소와 포트 번호 등을 로드 밸런싱의 데이터로 활용합니다.
(2) 한 대의 서버가 각각 다른 포트 번호를 부여하여 다수의 서버 프로그램을 운영하고 있다면 최소 L4 이상의 로드 밸런서를 사용해야 합니다.
3-3. 로드 밸런서의 종류 : L7 Load Balancer
(1) OSI 7 Layer에서 7계층인 응용 프로그램 계층을 기반으로 하기 때문에 HTTP 헤더, 쿠키와 같은 사용자의 요청 정보를 기준으로 특정 서버에 대한 부하를 분산시키는 로드 밸런서를 L7 로드 밸런서라고 합니다.
(2) URL에 따라 트래픽을 분산시키거나, HTTP 헤더의 쿠키 값에 따라 트래픽을 각 서버로 분산하는 등의 클라이언트의 요청을 보다 세분화하여 서버로 전달할 수 있습니다.
(3) 또한 7계층을 기반으로 한 로드 밸런서이기 때문에 서버의 응답까지 확인하고 분석할 수 있다는 특징을 가지고 있습니다. 서버들로부터 필요한 정보를 응답으로 받아서 클라이언트의 요청을 전달하기 전에 서버 상태를 미리 파악해서 로드 밸런싱을 할 수 있다는 장점이 있습니다.
4. 로드 밸런싱 알고리즘(Load Balancing Algorithm)
4-1. 라운드 로빈(Round Robin)
(1) 로드 밸런싱에서 가장 많이 사용되는 알고리즘으로 클라이언트의 요청을 여러 대의 서버에 순차적으로 분배하는 방식입니다. 추가적인 연산 과정 없이 들어온 요청을 빠르게 서버로 분산하는 작업에 포커스를 맞춘 방식입니다.
(2) 모든 서버의 스펙이 동일하거나 비슷한 경우에 사용해 볼 수 있는 밸런싱 알고리즘입니다.
4-2. 가중 라운드 로빈(Weighted Round Robin)
(1) 각 서버마다 처리량(가중치)를 설정한 후 가중치가 높은 서버부터 클라이언트의 요청을 우선적으로 전달하는 방식입니다. 주로 서버의 트래픽 처리량이 다른 경우 즉, 특정 서버의 스펙이 더 좋을 경우 가중 라운드 로빈 알고리즘을 사용하게 됩니다.
(2) 예시
- A 서버의 가중치 3
- B 서버의 가중치 1
- 8개의 Request를 받았다면 A 서버로는 6개, B 서버로는 2개의 요청이 설정된 가중치를 기준으로 전달
4-3. IP 해시(IP Hash)
(1) 클라이언트의 IP 주소가 어떤 서버로 클라이언트의 요청이 전달될지 결정하는 방식입니다.
(2) 클라이언트의 주소가 변경되지 않는다면 동일한 서버로 요청이 전달되는 것을 항상 보장받을 수 있고 라운드 로빈 방식과 다르게 서버 사이드의 세션 클러스터링(Session clustering) 환경이 구성되어 있지 않다면 주로 해당 알고리즘을 사용하게 됩니다.
* 세션 클러스터링(Session clustering)
- 세션 클러스터링은 2대 이상의 WAS 또는 서버를 사용할 때 로드 밸런싱, 장애 대비 등 세션 을 공유하는 것을 의미한다. 세션은 사용자 정보 또는 방문기록을 WAS 메모리에 저장하여, 클라이언트와 서버 간 고유한 세션 ID를 통해 Stateless한 연관성을 설정하는 것을 의미
4-4. 최소 연결(Least connection)
(1) 요청이 들어온 시점에 가장 적게 연결되어 있는 서버로 요청을 전송하는 방식입니다.
(2) 서버에 분배된 트래픽이 일정하지 않을 경우 사용해 볼 수 있는 알고리즘입니다.
4-5. 최소 응답 시간(Least Response Time)
(1) 서버의 현재 연결 상태와 응답 시간을 모두 고려하여 가장 적은 연결 수와 가장 짧은 응답 시간을 가지는 서버에 우선적으로 요청을 보내는 방식입니다.
5. Reference
(1) URL
http://wiki.hash.kr/index.php/%EB%A1%9C%EB%93%9C%EB%B0%B8%EB%9F%B0%EC%8B%B1
https://jiwondev.tistory.com/189
https://m.post.naver.com/viewer/postView.naver?volumeNo=27046347&memberNo=2521903
https://tecoble.techcourse.co.kr/post/2021-11-07-load-balancing/
https://www.nginx.com/resources/glossary/load-balancing/
※ 해당 포스팅에 대해 내용 추가가 필요하다고 생각되면 기존 포스팅 내용에 다른 내용이 추가될 수 있습니다.
개인적으로 공부하며 정리한 내용이기에 오타나 틀린 부분이 있을 수 있으며, 이에 대해 댓글로 알려주시면 감사하겠습니다!
댓글