나만의 작은 도서관
[Network] 로드 밸런싱(Load Balancing) 본문
로드 밸런싱
로드 밸런싱은 네트워크 트래픽을 여러 서버에 분산시키는 기술로, 서버 간의 부하를 균등하게 나누어 시스템의 효율성을 극대화하고 성능을 향상시키기 위해 사용됩니다. 간단히 말해서, 서버가 받는 부하를 의미하는 "로드"를 균형있게 분배해준다고 할 수 있습니다. 이러한 로드 밸런싱은 로드 밸런서(Load Balaner)라고 부르는 모듈(장치)을 통해 수행하게 됩니다.
로드 밸런싱이 필요한 이유
런칭한 지 얼마 안 된 서비스가 하나 있다고 가정해보겠습니다. 처음엔 서비스가 있는 줄도 모를테니 유저가 굉장히 적을겁니다. 그래서 이제 1초에 한 명정도 사용한다고 가정하면 서버는 아주 행복할 겁니다. 전혀 부담스럽지 않은 요청이거든요.
그런데 어떤 이유에서인지 엄청난 양의 요청들이 유저들에게서 오기 시작합니다. 이전과는 차원이 다른 양을 처리해야 하는 서버는 훨씬 바쁘게 돌아가기 시작합니다. 그래도 아직까지는 유저가 적으니 서버는 괜찮습니다.
오랜 세월이 지나고 유저가 점점 많아지기 시작했습니다. 엄청난 양의 요청들을 해오는 유저들이 많아지기 시작한겁니다.
이전까지는 서버가 유저가 적어 그럭저럭 잘 처리해온 작업들도 이젠 너무 많아져 버거워하기 시작합니다. 결국, 서버는 수많은 요청을 처리하지 못해 다운되어버립니다.
여기서 취할 수 있는 조치는 크게 2가지가 있습니다. 바로 수직적 스케일 업(Vertical Scale-up)과 수평적 스케일 아웃(Horizontal Scale-Out)입니다.
수직적 스케일 업(Vertical Scale-up)은 우리가 가지고 있는 서버 자체의 퍼포먼스를 높여주는 방식입니다. 램을 8GB -> 32GB로 늘린다거나 CPU를 업그레이드 하는 방법으로 퍼포먼스를 높여주는 겁니다. 이렇게 늘어난 퍼포먼스를 통해 이전에는 버거웠던 작업량을 보다 수월하게 처리해낼 수 있게됩니다.
하지만, 이러한 방식은 한계가 있습니다. 아무리 성능을 향상시킨다고 해도 결국 기술적 한계에 의해 성능을 무제한으로 올릴 수는 없습니다. 그래서 선택하는 방식은 수평적 스케일 아웃입니다.
수평적 스케일 아웃(Horizontal Scale-Out)은 서버의 개수를 2대, 3대처럼 서버를 추가하는 방식입니다. '하나로 부족하면 여러 대를 사용하면 되는 것이 아니냐'라는 생각을 기반으로 만들어진 방식입니다. 이렇게 되면 수직적 스케일 업 방식과 다르게 서버의 성능을 계속해서 올릴 수 있습니다.
하지만, 물리적으로 다른 공간에 있는 서버들이기때문에 여러 대의 서버들을 구축했다고 알아서 돌아가지는 않습니다. 결국, 여러 대의 서버들이 문제없이 잘 돌아가게끔하는 분산 시스템을 구축해야하고, 여기서 각 서버에 상황에 맞게 부하를 균등하게 나눠주는 로드 밸런싱이 굉장히 중요해집니다.
로드밸런싱 알고리즘
- 라운드 로빈(round robin)
순차적으로 분배하되, 끝까지 갔다면 처음으로 돌아오는 방식입니다. 서버1부터 서버4까지 있었다면, 서버1~서버4까지 하나씩 분배하고, 다시 서버1에 분배하는 방식입니다. 라운드 로빈 방식은 모든 로드를 균등하게 분배하는 간단하면서 좋은 알고리즘입니다. - 랜덤 셀렉트(random select)
이름 그대로 로드 밸런서가 아무 서버를 선택해서 분배하는 방식입니다. 불균등하게 분배를 했어도 상관하지 않고 단순히 랜덤으로 선택하여 서버에게 분배하는 방식이므로 운 나쁜(?) 서버라면 다른 서버에 비해 많은 부하가 걸릴 수도 있습니다. 하지만, 큰 수의 법칙에 의해 결론적으로 라운드 로빈 방식과 크게 다르지 않을 정도로 균등하게 분배됩니다. - 최소 연결(Least Connection)
로드 밸런서가 서버의 상태를 확인하고 연결이 적은 서버에게 분배하는 방식입니다. 위의 두 방식(라운드 로빈, 랜덤 셀렉트)은 서버의 상태를 확인하지 않았지만 최소 연결 방식은 서버의 현재 상태를 확인하기 때문에 보다 똑똑한 방식이라고 할 수 있습니다. - 비율(ratio)
성능이 좋은 서버가 더 많은 요청을 받을 수 있도록 가중치를 두어 서버에게 분배하는 방식입니다. 서버를 구축하다보면 모든 서버의 성능이 일치하지 않을 수 있습니다. 어떤 서버는 높은 성능을, 어떤 서버는 상대적으로 낮은 성능을 가질 수 있습니다. 이런 경우, 모든 서버에게 동일하게 요청을 분배하게 되면 상대적으로 낮은 서버만 힘들어지는 경우가 발생할 수 있습니다. 이런 상황이 지속되어 성능이 낮은 서버가 다운되기라도 하면 다른 서버가 다운된 서버의 요청까지 처리하게 되면서 더 큰 부하를 얻게되고, 부하를 이기지 못한 서버가 다운되며 연쇄적으로 서버가 다운될 수도 있습니다. 이런 상황에서 비율 방식은 좋은 해결책일 될 수 있습니다.
로드밸런싱 유형
- 하드웨어 로드밸런서: 물리적 장치로 구성된 로드밸런서입니다. 높은 성능을 제공하지만, 비용이 많이 들고 유연성이 낮습니다.
- 소프트웨어 로드밸런서: 소프트웨어 기반으로 동작하며, 클라우드 환경에서 널리 사용됩니다. 예를 들어, Nginx, HAProxy 등이 있습니다.
- DNS 로드밸런싱: DNS 서버에서 IP 주소를 다르게 반환하여 트래픽을 분산시킵니다. 전 세계에 분산된 서버에서 콘텐츠를 제공할 때 유용합니다.
- 클라우드 로드밸런싱: 클라우드 제공 업체의 서비스로, AWS ELB(Amazon Web Services Elastic Load Balancer), Google Cloud Load Balancing 등이 있습니다.
로드 밸런서가 하나면 발생하는 문제: SPOF
로드 밸런서를 사용하면 서버의 부하를 분산하여 서버가 다운되는 일을 막을 수 있습니다. 그런데... 로드 밸런서가 다운되면 어떻게 될까요? 서버와 유일한 연결점인 로드 밸런서가 다운되어버리면 서버는 아무것도 할 수가 없게됩니다. 이렇게 전체 시스템에서 특정 포인트가 실패(failure)했을 때 전체가 다운되는 경우를 SPOF(Single Point of Failure)라고 부릅니다.
SPOF를 해결하기 위한 다양한 전략들이 있지만 그 중 하나로 여러 개의 slave 로드 밸런서들을 두고 master 로드 밸런서가 실패했을 때 slave 로드 밸런서들 중 하나가 master 로드 밸런서의 역할을 위임받아 대체하는 방식이 있습니다.
참고한 자료
https://www.youtube.com/watch?v=9_6COPOMZvI
https://www.youtube.com/watch?v=kYipnodgi2I
'Common > CS-네트워크' 카테고리의 다른 글
[Network] 1분 간단 질문. TCP Handshake란 무엇인가요? (0) | 2024.06.27 |
---|---|
[Network] 대칭 키 암호화 방식과 공개 키 암호화 방식 (0) | 2024.06.26 |
[Network] 1분 간단 질문. OSI 7계층이란 무엇일까요? (0) | 2024.06.26 |
[Network] OSI 7계층 #5. 응용 계층, DNS, HTTP (0) | 2024.06.19 |
[Network] OSI 7계층 #4. 전송 계층, UDP/TCP (0) | 2024.06.17 |