로드 밸런서의 종류와 차이점은 무엇인가요?

김상욱·2025년 1월 12일

로드 밸런서의 종류와 차이점은 무엇인가요?

로드 밸런서는 클라이언트의 요청을 여러 서버(또는 애플리케이션 인스턴스)로 분산시켜, 서비스의 안정성과 성능을 높이는 역할을 합니다. 여러 종류의 로드 밸런서가 있는데 주요 분류와 차이점을 알아보겠습니다.

하드웨어 vs 소프트웨어 로르 밸런서

하드웨어 로드 밸런서

  • 개념 : 전용 장비(어플라이언스)를 사용하여 로드 밸런싱 수행
  • 특징 : 높은 성능과 안정성을 제공하지만, 가격이 비싸고 확장이 상대적으로 어렵습니다.
  • 사용 예시 : 전통적인 데이터 센터 환경에서 대규모 트래픽을 처리할 때 사용됩니다.
    소프트웨어 로드 밸런서
  • 개념 : 소프트웨어 기반으로 동작하며, 일반 서버나 클라우드 환경에서 배포 가능
  • 특징 : 유연성과 확장성이 좋으며, 비용 효율적입니다.
  • 사용 예시 : 클라우드 서비스 환경이나 컨테이너 오케스트레이션(Kubernetes) 환경에서 많이 활용됩니다.

OSI 계층에 따른 분류 (Layer 4 vs. Layer 7)

**Layer 4 (전송 계층) 로드 밸런서

  • 역할: IP, TCP/UDP 포트를 기반으로 로드 밸런싱
  • 특징 : 패킷의 헤더 정보만 확인하기 때문에 빠른 속도를 제공하고, 상대적으로 오버헤드를 가짐.
  • 예시 : Linux 기반의 iptables, LVS (Linux Virtual Server) 등
  • 사용 시나리오 : 간단한 트래픽 분산이 필요하거나, 빠른 응답 속도가 중요한 서비스
    **Layer 7 (애플리케이션 계층) 로드 밸런서
  • 역할 : HTTP/HTTPS 같은 애플리케이션 프로토콜을 이해하고 요청의 내용을 기준으로 로드 밸런싱
  • 특징 : URL, 쿠키, 헤더 등 세부정보를 활용하여 보다 정교한 트래픽 분배가 가능
  • 예시 : Ngnix, HAProxy(HTTP 모드), AWS Application Load Balancer(ALB) 등
    사용 시나리오 : 웹 애플리케이션에서 요청 내용에 따라 다른 백엔드 서버로 라우팅해야 할 때.

추가 분류 : 리버스 프록시 vs. 포워드 프록시

리버스 프록시 (Reverse Proxy)

  • 역할 : 클라이언트의 요청을 받아 내부 서버로 전달하며, 외부에는 내부 서버 구조를 숨깁니다.
  • 특징 : 보안 강화, SSL 종료, 캐싱, 압축 등의 기능 제공
  • 예시 : Nginx, Apache HTTP Server 등

포워드 프록시(Forward Proxy)

  • 역할 : 클라이언트가 외부로 요청을 보낼 때 중개 역할을 함.
  • 특징 : 주로 내부 네트워크의 클라이언트가 외부에 접근할 때, 캐싱이나 프라이버시 보호를 위해 사용.

취업 준비 중인 신입 Java/Spring 백엔드 개발자라면, 로드 밸런싱과 관련된 기본 개념을 직접 실습해보면서 이해하는 것이 큰 도움이 됩니다. 다음은 실습해볼 만한 몇 가지 예시와 그에 맞는 가이드입니다.


1. Spring Boot 애플리케이션 다중 인스턴스와 Nginx를 이용한 로드 밸런싱

실습 목표

  • 여러 개의 Spring Boot 애플리케이션 인스턴스를 기동시키고,
  • Nginx를 리버스 프록시 및 로드 밸런서 역할로 활용하여 트래픽을 분산시킵니다.

실습 절차

  1. Spring Boot 간단 웹 애플리케이션 작성

    • 간단한 REST API 엔드포인트(ex: /hello)를 가진 Spring Boot 애플리케이션을 작성합니다.
    • 포트 번호를 외부 인자로 받아 다수 인스턴스로 실행할 수 있도록 합니다.
    @RestController
    public class HelloController {
        @GetMapping("/hello")
        public String hello() {
            return "Hello from port: " + System.getProperty("server.port");
        }
    }
  2. 여러 인스턴스 실행

    • 방법 1: IDE나 터미널에서 java -jar application.jar --server.port=8081과 같이 포트를 변경해가며 여러 인스턴스를 실행합니다.
    • 방법 2: Docker를 사용해서 여러 컨테이너로 애플리케이션을 실행할 수 있습니다.
  3. Nginx 설치 및 구성

    • 로컬 머신이나 Docker 컨테이너에 Nginx를 설치합니다.
    • nginx.conf 파일에 다음과 같이 Upstream 설정을 추가하여 여러 Spring Boot 인스턴스로 트래픽을 분산합니다.
    upstream spring_boot_app {
        server 127.0.0.1:8081;
        server 127.0.0.1:8082;
        # 필요에 따라 추가 서버 지정
    }
    
    server {
        listen 80;
        server_name localhost;
    
        location / {
            proxy_pass http://spring_boot_app;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
  4. 테스트

    • 브라우저나 curl로 http://localhost/hello 요청을 보내면, Nginx가 요청을 각 인스턴스에 분산시키고 응답에 해당 포트 번호가 나타나는지 확인합니다.
    • 여러 번 요청해보며 라운드 로빈 방식으로 포트 번호가 바뀌는 것을 확인합니다.

2. HAProxy를 이용한 Layer 7 로드 밸런싱 실습

실습 목표

  • HAProxy를 사용하여 HTTP 요청을 여러 백엔드 서버로 로드 밸런싱해보고, 간단한 설정 파일을 작성하여 동작 원리를 이해합니다.

실습 절차

  1. HAProxy 설치

    • 로컬 머신이나 Docker 컨테이너에 HAProxy를 설치합니다.
  2. HAProxy 설정 파일 작성

    • haproxy.cfg 파일을 작성하여 frontend와 backend 설정을 추가합니다.
    global
        log stdout format raw local0
        maxconn 2000
    
    defaults
        log global
        mode http
        timeout connect 5000ms
        timeout client 50000ms
        timeout server 50000ms
    
    frontend http_front
        bind *:80
        default_backend servers
    
    backend servers
        balance roundrobin
        server server1 127.0.0.1:8081 check
        server server2 127.0.0.1:8082 check
  3. Spring Boot 애플리케이션 실행

    • 앞서 설명한 대로 포트 8081, 8082에서 애플리케이션을 실행합니다.
  4. 테스트

    • 웹 브라우저나 curl을 이용해 http://localhost/hello로 접속하여 HAProxy가 트래픽을 분산시키는지 확인합니다.

3. Docker Compose를 이용한 통합 실습

실습 목표

  • Spring Boot 애플리케이션 여러 인스턴스와 로드 밸런서(Nginx 혹은 HAProxy)를 Docker Compose로 구성하여, 하나의 네트워크 상에서 쉽게 관리합니다.

실습 절차

  1. Dockerfile 작성

    • Spring Boot 애플리케이션 Dockerfile을 작성합니다. (예: openjdk 기반)
    FROM openjdk:11-jre-slim
    VOLUME /tmp
    ARG JAR_FILE=target/application.jar
    COPY ${JAR_FILE} app.jar
    ENTRYPOINT ["java", "-jar", "/app.jar"]
  2. docker-compose.yml 작성

    • 여러 애플리케이션 인스턴스와 로드 밸런서 서비스를 정의합니다.
    version: '3'
    services:
      app1:
        build: .
        ports:
          - "8081:8080"
        environment:
          - SERVER_PORT=8080
      app2:
        build: .
        ports:
          - "8082:8080"
        environment:
          - SERVER_PORT=8080
      nginx:
        image: nginx:latest
        ports:
          - "80:80"
        volumes:
          - ./nginx.conf:/etc/nginx/conf.d/default.conf
        depends_on:
          - app1
          - app2
  3. 실행 및 테스트

    • docker-compose up --build 명령어로 전체 환경을 실행하고, 브라우저나 curl로 http://localhost/hello 요청을 보내어 로드 밸런싱 동작을 확인합니다.

실습 후 기대 효과

  • 실제 환경과 유사한 구성: Spring Boot 애플리케이션을 여러 인스턴스로 실행하여, 실제 프로덕션 환경에서의 분산 시스템 구성을 이해할 수 있습니다.
  • 로드 밸런서 설정과 동작 원리 이해: Nginx나 HAProxy의 설정 파일을 직접 작성해보고, 요청이 어떻게 분산되는지 체감할 수 있습니다.
  • 문제 해결 능력 향상: 실습 중 발생하는 오류(포트 충돌, 설정 파일 오류 등)를 직접 디버깅하면서 문제 해결 능력을 기를 수 있습니다.
  • DevOps 관련 경험: Docker와 Docker Compose를 활용해 환경을 구성함으로써, DevOps 파이프라인 구축에 대한 기본 지식을 쌓을 수 있습니다.

이러한 실습 경험은 면접이나 실제 업무 환경에서 "왜, 어떻게" 로드 밸런서를 사용해야 하는지를 설명할 때 큰 도움이 됩니다. 학습에 참고하시고, 필요에 따라 추가 기능(예: 헬스 체크, SSL 종료, 세션 스티키네스 등)도 실험해보세요!

0개의 댓글