로드 밸런싱(Load Balancing)은 어떻게 이루어지나요?

김상욱·2024년 12월 4일

로드 밸런싱(Load Balancing)은 어떻게 이루어지나요?

로드밸런싱(Load Balancing)은 서버 또는 시스템에 들어오는 네트워크 트래픽을 여러 서버나 리소스에 효율적으로 분배하여, 시스템 성능을 최적화하고 과부하를 방지하며 안정성을 유지하는 기술입니다.

목적 : 하나의 서버에 모든 요청이 집중되는 것을 방지하고, 다수의 서버에 균등하게 요청을 나누어 시스템의 부하를 분산합니다.
효과 : 과부하를 방지해 응답 속도를 유지하며 한 서버가 다운되어도 다른 서버가 요청을 처리할 수 있습니다. 또한 서버를 추가해 처리량을 증가시킬 수 있습니다.

로드 밸런서란 로드 밸런싱을 수행하는 장치 또는 소프트웨어입니다. 로드 밸런서는 클라이언트의 요청을 받아, 최적의 서버로 요청을 전달하는 역할을 합니다.
하드웨어 로드 밸런서 : 전용 하드웨어 장치를 사용
소프트웨어 로드 밸런서 : 오픈소스나 클라우드에서 제공 ex) Nginx, HAProxy, AWS ELB

로드 밸런싱 방식
정적 로드 밸런싱(Static Load Balancing) : 알고리즘 기반으로 요청을 고정된 방식으로 분배하며 서버 상태를 고려하지 않습니다.

  • 라운드 로빈(Round Robin) : 요청을 서버 리스트에 순서대로 순환하며 분배하여 단순하고 구현이 쉬우나 서버 간 성능 차이를 고려하지 않습니다.
  • 가중 라운드 로빈(Weighted Round Robin) : 서버의 성능에 따라 요청을 가중치 비율로 분배
  • IP 해싱 (IP Hashing) : 클라이언트 IP를 해싱하여 특정 서버로 연결.

동적 로드 밸런싱(Dynamic Load Balnacing) : 서버의 실시간 상태를 기반으로 요청을 분배

  • 최소 연결(Least Connections) : 현재 연결된 클라이어늩 수가 가장 적은 서버로 요청을 전달
  • 최소 응답 시간(Least Response Time) : 응답 시간이 가장 빠른 서버를 선택
  • 리소스 기반(Resource-Based) : CPU, 메모리 등 리소스 사용량이 가장 낮은 서버를 선택.

로드 밸런싱의 구조와 동작 방식
클라이언트 요청 과정
1. 클라이어느는 DNS를 통해 특정 도메인으로 요청을 보냄
2. DNS는 로드 밸런서의 IP를 반환
3. 로드 밸런서가 요청을 수신하고, 트래픽을 적절한 서버로 전달

로드 밸런서의 처리 단계
1. 요청 수신 : 클라이언트의 HTTP/HTTPS 요청을 받음
2. 알고리즘 선택 : 사전 정의된 분배 알고리즘에 따라 적절한 서버를 선택
3. 트래픽 전달 : 선택된 서버에 요청을 전달하고 응답을 반환

로드 밸런싱의 레벨
L4(전송 계층) 로드 밸런싱

  • OSI 모델의 4계층(전송 계층, TCP/UDP)에서 트래픽을 분산
  • 클라이언트 IP와 포트를 기준으로 요청을 분배
  • 빠르고 간단
  • HTTP/HTTPS 레벨 세부사항을 인식하지 못함

L7(애플리케이션 계층) 로드 밸런싱

  • OSI 모델의 7계층(애플리케이션 계층)에서 트래픽을 분산
  • HTTP 헤더, URL 경로, 쿠키 등을 기반으로 세부 제어 가능
  • 세밀한 분배 가능
  • L4보다 상대적으로 느림

상태 유지(Session Persistence)
로드 밸런싱 환경에서도 특정 클라이언트의 요청이 동일한 서버로 전송되도록 해야할 때가 있습니다.

  • 쿠키 기반 세션 유지 : 로드 밸런서가 쿠키를 사용하여 동일서버로 요청을 전달
  • IP 기반 세션 유지 : 클라이언트 IP를 기반으로 동일 서버로 연결
  • 세션 스토리지 공유 : 모든 서버가 세션 데이터를 공유하도록 구성

로드 밸런싱을 통하면

  • 서버 과부하 방지로 시스템 안정성이 증가
  • 대규모 트래픽 처리 가능
  • 장애 발생 시 가용성 유지
    하지만
  • 잘못된 설정 시 서버 부하가 집중될 위험
  • L7 로드 밸런싱의 경우 성능 저하 가능
  • 네트워크 지연이 발생할 수 있음

실제 사용 사례
웹 애플리케이션 : 여러 웹 서버를 통해 사용자 요청을 분산
클라우드 환경 : AWS ELB(Elastic Load Balancer) 또는 GCP Load Balancer를 활용
게임 서버 : 대규모 접속자가 있는 MMORPG 게임에서 로드 밸런싱으로 안정적인 접속 제공


로드 밸런싱은 실제 백엔드 개발 과정에서 자주 접하게 되는 중요한 기술입니다. 신입 Java/Spring 백엔드 개발자 입장에서 실습해볼 만한 간단한 프로젝트와 학습 단계는 다음과 같습니다.


🌟 로드 밸런싱 실습을 위한 기본 준비

  1. 개발 환경 세팅:

    • 언어: Java
    • 프레임워크: Spring Boot
    • 배포 환경: Docker (로컬에서 여러 서버를 실행하는 데 유용)
    • 로드 밸런서: Nginx 또는 HAProxy
  2. 개념 숙지:

    • 로드 밸런서가 요청을 처리하는 흐름 이해.
    • Spring Boot로 간단한 REST API 서버 구축.

🛠️ 실습 프로젝트 1: 간단한 로드 밸런싱 설정

목표:

Nginx를 사용해 간단한 Spring Boot 서버 두 개에 요청을 분배.

실습 단계:

  1. Spring Boot API 서버 구축:
    • 간단한 /api 엔드포인트를 가진 두 개의 Spring Boot 애플리케이션 작성.
    • 애플리케이션마다 다른 응답을 반환하여 로드 밸런싱 결과를 확인.
@RestController
public class HelloController {
    @GetMapping("/api")
    public String hello() {
        return "Hello from Server 1";
    }
}
  1. Nginx 설정:
    • Nginx를 로컬에 설치.
    • Nginx 설정 파일(nginx.conf)에 두 서버를 업스트림으로 등록.
http {
    upstream backend_servers {
        server localhost:8081;
        server localhost:8082;
    }

    server {
        listen 8080;

        location /api {
            proxy_pass http://backend_servers;
        }
    }
}
  1. 테스트:
    • Nginx를 실행하고 브라우저나 Postman으로 http://localhost:8080/api에 요청을 전송.
    • 요청이 서버 1과 서버 2로 번갈아 분배되는지 확인.

🛠️ 실습 프로젝트 2: Docker로 동적 로드 밸런싱

목표:

Docker를 활용해 Spring Boot 서버를 여러 개 띄우고, Nginx로 부하를 동적으로 분배.

실습 단계:

  1. Spring Boot 애플리케이션 Docker 이미지 생성:
    • Spring Boot 애플리케이션의 Dockerfile 작성.
FROM openjdk:17-jdk-slim
COPY target/app.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
  1. Docker Compose로 여러 서버 실행:
    • docker-compose.yml 작성.
version: '3.8'
services:
  server1:
    build: .
    ports:
      - "8081:8080"
  server2:
    build: .
    ports:
      - "8082:8080"
  1. Nginx와 Docker 연동:
    • Nginx 컨테이너를 추가하고 Spring Boot 컨테이너와 연결.

🛠️ 실습 프로젝트 3: 클라우드 환경에서 로드 밸런싱

목표:

AWS의 Elastic Load Balancer(ELB) 또는 GCP의 Load Balancer 사용.

실습 단계:

  1. AWS Free Tier 가입 및 EC2 인스턴스 생성:

    • Spring Boot 서버를 배포.
    • 동일한 애플리케이션을 두 개의 인스턴스에 배포.
  2. ELB 설정:

    • AWS Management Console에서 로드 밸런서를 생성.
    • 두 EC2 인스턴스를 로드 밸런서에 연결.
  3. 테스트:

    • ELB 엔드포인트로 요청을 보내 트래픽이 분산되는지 확인.

🛠️ 실습 프로젝트 4: 상태 유지(Session Persistence)

목표:

Spring Session과 Redis를 사용해 세션 데이터를 공유.

실습 단계:

  1. Spring Session Redis 설정:
    • application.properties에 Redis 설정 추가.
spring.session.store-type=redis
spring.redis.host=localhost
spring.redis.port=6379
  1. 서버 간 세션 공유 확인:
    • 두 서버 중 하나에 로그인한 후, 다른 서버로 요청을 보내도 세션이 유지되는지 확인.

🧠 학습 후 추가 적용

  • Spring Cloud Gateway: 마이크로서비스 환경에서 L7 로드 밸런싱 적용.
  • Resilience4j: 로드 밸런싱과 함께 장애 복구(서킷 브레이커) 설정.
  • 모니터링 도구: Prometheus와 Grafana를 사용해 서버 부하 모니터링.

📚 학습 자료

이 실습들은 로드 밸런싱을 기본적으로 이해하고 Java/Spring 백엔드에서 활용할 수 있는 기술을 배울 수 있도록 설계되었습니다. 추가적인 질문이 있다면 언제든지 물어보세요! 😊

0개의 댓글