로드 밸런서(LoadBalancer)와 NginX
로드 밸런서(LoadBalancer)와 NginX — #개발자의도구들 #로드밸런서 #LoadBalancer #NginX AI스쿨 msa기반 java 백엔드 코스 중에 공부한 ...
#개발자의도구들 #로드밸런서 #LoadBalancer #NginX
AI스쿨 msa기반 java 백엔드 코스 중에 공부한 내용을 작성하였습니다
\* 현재 Spring x 프로젝트를 진행하고 있습니다. 전체 목차를 보시려면 여기를 눌러주세요.
\* Devops stack: 여기
\* 리눅스 기본기: 여기
멈추지 않는 서버
기본적으로 서비스가 시작되면 서버는 멈추지 않아야 합니다. 서비스 규모가 커지면 커질수록, 서버가 멈추거나 심지어 조금의 지연에도 수 천명의 사용자에게 불쾌함을 제공할 수 있습니다.
하지만, 서버는 분명 물리적인 한계가 있을 것이고, 여전히 개발자가 찾지 못한 미지의 에러가 존재합니다. 이렇게 서버가 멈추지 않게 만드는 것은 불가능 해 보이는데요. 어떻게 하면 대규모의 서비스를 안정적이게 운영하도록 만들 수 있을까요?
이를 해결하는 방법은 매우 간단합니다. 그냥 서버를 여러군데 띄우두면 됩니다. 즉 여러 머신에 같은 서버를 띄어두면 하나가 터지더라도 다른 곳으로 트래픽을 돌려버리면 사용자는 여전히 서비스를 막힘 없이 사용할 수 있습니다.
여기서 "트래픽을 돌리는" 이 행위가 로드 밸런서의 근본적인 역할입니다.
어떻게 분산 시키는가?
아 물론 서버를 여러개로 만들어 운영한다고 해도 여전히 문제는 남아있습니다. 트래픽을 제대로 분산시키지 않는다면, 사용자가 많이 몰리는 서버는 터질 것이고, 이는 위와 동일한 문제를 야기합니다.
이런 문제가 발생하지 않도록 로드 밸런서는 트래픽을 잘 분산 시켜야 합니다. 이를 위해서 보통 다음과 같은 알고리즘들이 사용됩니다.
기본 가정: 노드 A B C에 같은 서비스가 띄어진 상태
👉 Round Robin
- A → B → C → A → B → C → A ...
- 순차적으로 한번씩 트랙픽을 받는 알고리즘
- 가장 단순한 방법
👉 Weight Round Robin
- 서버 마다 가중치(Weight)를 매기고 가중치가 높은 서버에 요청을 먼저 배분합니다.
- 가중치를 어떻게 둘지에 대해 고민해 봐야함
- 보통은 성능이 좋은 곳에 높게 측정
👉 IP Hash
- 클라이언트 IP를 해시처리해서 숫자로 변환 후 개별 서버에 매핑합니다.
- 동일 IP는 항상 동일 서버와의 연결을 보장 받을 수 있습니다.
- 근데 그 서버가 터지면 문제가 발생하겠죠?
👉 Least Connection Method
- 서버별로 방문 횟수를 기록하고, 가장 적은 방문 횟수를 보유한 서버로 트래픽을 보냅니다.
- 서버별로 성능 차이가 없다면 괜찮은 알고리즘
👉 Lesat Response time Method
- 서버의 현재 연결 상태 및 응답 시간을 고려하여 가장 짧은 응답 시간을 보유한 서버로 트랙픽을 전송
- metadate를 참조하여 트래픽을 돌리는 행위를 표현
상황에 맞게 적절하게 알고리즘을 선택하는 것이 중요합니다.
NginX
NginX는 오픈 소스 웹서버로 웹 서버로서 개발되었지만, 현재는 대부분 LB를 위해 사용되고 있습니다.
기본적으로 Round Robin 방식을 사용하며 트래픽을 돌립니다.
NginX를 사용하면 Spring 아키텍처를 다음과 같이 수정할 수 있습니다.
이건 직접 실습하면서 관련 설정을 따로 정리해보겠습니다.








