대규모 시스템에서의 부하 분산(Load Balancing)은 어떻게 이루어지나요?

김상욱·2024년 12월 22일
0

대규모 시스템에서의 부하 분산(Load Balancing)은 어떻게 이루어지나요?

목적

  • 트래픽을 고르게 분산해 특정 서버에 과부하가 걸리지 않도록 방지.
  • 서버 장애 발생 시 대체 서버로 트래픽을 유도하여 서비스 중단 방지.
  • 요청을 처리할 최적의 서버에 연결하여 응답 속도 개선.
  • 새로운 서버를 추가하거나 제거해 시스템을 확장하거나 축소

Load Balancing 아키텍처

  • Load Balancer(LB) : 트래픽을 여러 서버로 분배하는 역할을 하는 장치 또는 소프트웨어. 클라이언트와 서버 사이에 위치하며, 클라이언트의 요청을 분석하고 적절한 서버로 전달
  • Backend Servers : 실질적인 요청을 처리하는 서버군(서버 풀). Load Balancer는 이 서버들 중 하나를 선택하여 요청을 전달.
  • Health Check : LB는 주기적으로 백엔드 서버의 상태를 모니터링하여 비정상 서버로 요청을 보내지 않음.

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 알고리즘

  • Round Robin : 요청을 서버에 순차적으로 배분. 단순하지만, 서버의 성능 차이를 고려하지 않음
  • Least Connections : 현재 처리 중인 연결 수가 가장 적은 서버로 요청을 전달.
  • Least Response Time : 가장 빠르게 응답할 수 있는 서버로 요청을 전달
  • Hash-Based : 클라이언트 IP, 요청 데이터 등을 해싱하여 특정 서버에 요청을 전달.
  • Weighted Least Connections : 서버의 가중치를 고려하면서 연결 수가 적은 서버로 분배

Load Balancing에서 사용하는 주요 도구

  • 하드웨어 Load Balancer : Cisco, F5 Networks 등의 전용 장비. 성능은 뛰어나지만 고비용
  • 소프트웨어 Load Balancer : Nginx / HAProxy, Apache HTTP Server, Traefik
  • 클라우드 기반 Load Balancer : AWS Elastic Load Balancer(ELB), Google Cloud Load Balancer, Azure Load Balancer

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개를 설정하는 과정을 포함합니다.


1. 목표

  • Nginx를 활용해 부하 분산을 설정합니다.
  • 두 개의 Spring Boot 서버에 요청을 고르게 분산합니다.
  • 부하 분산을 통해 시스템의 트래픽 처리 방식을 실습합니다.

2. 사전 준비

  • JavaSpring Boot 환경.
  • Nginx 설치(Windows, macOS, Linux 환경).
  • Postman 또는 브라우저(요청 확인용).

3. 실습 단계

(1) Spring Boot 애플리케이션 2개 생성

  1. 첫 번째 애플리케이션 생성

    • Spring Initializr를 사용하여 프로젝트 생성.
    • Dependencies: Spring Web
    • application.yml 파일을 작성하여 포트를 8081로 설정.
      server:
        port: 8081
    • 간단한 컨트롤러 생성:
      @RestController
      public class ServerController {
          @GetMapping("/")
          public String home() {
              return "Hello from Server 1!";
          }
      }
  2. 두 번째 애플리케이션 생성

    • 동일한 방법으로 프로젝트 생성.
    • application.yml 파일을 작성하여 포트를 8082로 설정.
      server:
        port: 8082
    • 컨트롤러 작성:
      @RestController
      public class ServerController {
          @GetMapping("/")
          public String home() {
              return "Hello from Server 2!";
          }
      }
  3. 두 애플리케이션 실행

    • 각각 다른 포트(8081, 8082)에서 실행되도록 설정.

(2) Nginx 설정

  1. Nginx 설치

    • macOS: Homebrew 사용
      brew install nginx
    • Windows: Nginx 공식 사이트에서 다운로드.
    • Linux (Ubuntu):
      sudo apt update
      sudo apt install nginx
  2. Nginx 설정 파일 수정

    • 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;
              }
          }
      }
  3. Nginx 실행

    • Nginx 실행 명령:
      nginx
    • 설정 변경 후 재시작:
      nginx -s reload

(3) 테스트

  1. 테스트 방법

    • 브라우저 또는 Postman에서 http://localhost:8080으로 요청을 보냅니다.
    • 요청이 번갈아가며 Server 1Server 2에서 응답이 오는지 확인합니다.
  2. 결과 확인

    • 요청 1: "Hello from Server 1!"
    • 요청 2: "Hello from Server 2!"
    • 요청이 Nginx를 통해 두 서버로 고르게 분산되었는지 확인합니다.

4. 심화 실습

  1. Weighted Load Balancing

    • 특정 서버에 더 많은 요청을 보내도록 가중치 추가:
      upstream spring_servers {
          server localhost:8081 weight=2; # 더 많은 요청
          server localhost:8082 weight=1;
      }
  2. Health Check 설정

    • Nginx가 서버의 상태를 감지하도록 설정:
      upstream spring_servers {
          server localhost:8081 max_fails=3 fail_timeout=30s;
          server localhost:8082 max_fails=3 fail_timeout=30s;
      }
  3. L4 Load Balancing 실습

    • TCP/UDP를 기반으로 부하 분산 설정.

5. 실습 결과

  • 부하 분산의 기본 작동 방식 이해.
  • 요청이 두 서버로 고르게 분배됨을 확인.
  • Nginx 설정 파일을 활용해 다양한 부하 분산 방법 실습.

추가적으로 Docker를 활용해 더 복잡한 환경을 설정하거나, 클라우드 서비스(AWS, GCP 등)의 로드 밸런서를 테스트해볼 수도 있습니다. 필요하면 심화 방향으로 확장해 드릴게요!

0개의 댓글