목적
Load Balancing 아키텍처
Load Balancing 방식
네트워크 계층 기반
-> DNS Load Balancing : 도메인 이름을 요청할 때 트래픽을 여러 IP로 분배
-> IP Hash : 클라이언트의 IP 주소를 기반으로 트래픽 분배
-> Anycast : 가장 가까운 서버로 트래픽을 라우팅.
전송 계층 기반
-> TCP/UDP 프로토콜 수준에서 작동하며, 클라이언트 서버 간의 연결을 관리. 주로 OSI 모델의 4계층(Transport Layer)에서 작동
-> Round Robin : 요청을 순차적으로 서버에 분배
-> Least Connections : 현재 연결이 가장 적은 서버로 요청을 분배
-> Weighted Round Robin : 서버 성능에 따라 가중치를 설정한 뒤 요청 분배
애플리케이션 계층 기반(L7 Load Balancing)
-> HTTP/HTTPS와 같은 애플리케이션 계층에서 작동. 요청의 URL, 퀴, 헤더 등의 내용을 기반으로 트래픽을 분배
-> Path-Based Routing : URL 경로를 기준으로 서버 선택
-> Host-Based Routing : 특정 도메인에 대한 요청만 특정 서버로 전달
-> Session Persistence : 특정 클라이언트의 요청을 동일한 서버로 연결.
Load Balancing 알고리즘
Load Balancing에서 사용하는 주요 도구
Load Balancing을 위한 기타 기술
(1) 캐싱 : 정적 리소스를 캐싱 서버(CDN 등)에서 제공해 서버 부하를 줄임
(2) 오토스케일링 : 트래픽에 따라 서버 인스턴스를 동적으로 추가하거나 제거.
(3) Rate Limiting : 클라이언트 요청 수를 제한하여 시스템 과부하 방지
구성 예시
단일 Load Balancer : 트래픽이 많지 않은 중소 규모 시스템. 클라이언트->Load Balancer -> 여러 서버
다단계 Load Balancer : 대규모 트래픽을 처리하는 시스템. 클라이언트 -> L7 Load Balancer -> L4 Load Balancer -> 여러 서버
신입 및 취준생 Java 백엔드 개발자로서 부하 분산(Load Balancing)을 이해하고 실습해볼 수 있는 간단한 실습 예제를 제공합니다. 이 실습은 Nginx를 활용한 L7 부하 분산과 간단한 Spring Boot 애플리케이션 서버 2개를 설정하는 과정을 포함합니다.
첫 번째 애플리케이션 생성
application.yml 파일을 작성하여 포트를 8081로 설정.server:
port: 8081@RestController
public class ServerController {
@GetMapping("/")
public String home() {
return "Hello from Server 1!";
}
}두 번째 애플리케이션 생성
application.yml 파일을 작성하여 포트를 8082로 설정.server:
port: 8082@RestController
public class ServerController {
@GetMapping("/")
public String home() {
return "Hello from Server 2!";
}
}두 애플리케이션 실행
Nginx 설치
brew install nginxsudo apt update
sudo apt install nginxNginx 설정 파일 수정
nginx.conf 파일을 열어 아래 내용을 추가.
일반적으로 설정 파일은 /etc/nginx/nginx.conf(Linux) 또는 conf/nginx.conf(Windows) 경로에 있음.
다음 내용을 추가:
http {
upstream spring_servers {
server localhost:8081;
server localhost:8082;
}
server {
listen 8080;
location / {
proxy_pass http://spring_servers;
}
}
}
Nginx 실행
nginxnginx -s reload테스트 방법
http://localhost:8080으로 요청을 보냅니다.결과 확인
Weighted Load Balancing
upstream spring_servers {
server localhost:8081 weight=2; # 더 많은 요청
server localhost:8082 weight=1;
}Health Check 설정
upstream spring_servers {
server localhost:8081 max_fails=3 fail_timeout=30s;
server localhost:8082 max_fails=3 fail_timeout=30s;
}L4 Load Balancing 실습
추가적으로 Docker를 활용해 더 복잡한 환경을 설정하거나, 클라우드 서비스(AWS, GCP 등)의 로드 밸런서를 테스트해볼 수도 있습니다. 필요하면 심화 방향으로 확장해 드릴게요!