7월 29일 - 로드 밸런싱

Yullgiii·2024년 7월 29일
0

로드 밸런싱

로드 밸런싱은 둘 이상의 CPU나 저장 장치와 같은 컴퓨터 자원들에게 작업을 나누는 것을 말한다. 현대의 웹사이트는 접속하는 인원이 급격하게 늘어났기 때문에, 이를 모두 감당하기 위해서는 단일 서버만으로는 부족하다. 따라서 하드웨어의 성능을 향상시키는 방법(Scale-up)과 여러 대의 서버가 작업을 나누어 처리하는 방법(Scale-out) 중에서 선택할 수 있다.

Scale-up vs Scale-out

  • Scale-up: 서버가 더 빠르게 동작하도록 하드웨어의 성능을 올리는 방법. 그러나 비용이 많이 든다.
  • Scale-out: 여러 대의 서버가 나누어서 일을 처리하는 방법. 무중단 서비스 환경을 제공하기 용이하다.

로드 밸런싱의 필요성

서버가 여러 대 존재할 때, 트래픽을 균등하게 분산시키는 것이 중요하다. 이를 통해 하나의 서버에 과부하가 걸리는 것을 방지하고, 전체 시스템의 안정성과 성능을 향상시킬 수 있다. 로드 밸런싱은 이러한 트래픽 분산을 담당한다.

로드 밸런서가 서버를 선택하는 방식

  1. 라운드 로빈(Round Robin): 각 서버에 순서대로 요청을 분배하는 방식. CPU 스케줄링의 라운드 로빈 방식을 활용한다.
  2. Least Connections: 현재 연결 갯수가 가장 적은 서버를 선택하는 방식. 트래픽으로 인해 세션이 길어지는 경우에 권장된다.
  3. Source Hashing: 사용자 IP를 해싱하여 분배하는 방식. 특정 사용자가 항상 같은 서버로 연결되는 것을 보장한다.

로드 밸런서 장애 대비

로드 밸런서 자체에 문제가 생길 수 있기 때문에 이를 이중화하여 대비한다. 이중화 방식으로는 Active-Passive 설정이 있다.

  • Active 상태: 현재 동작 중인 로드 밸런서.
  • Passive 상태: 대기 중인 로드 밸런서로, Active 상태의 로드 밸런서에 장애가 발생할 경우 이를 대체한다.

예제

다음은 간단한 로드 밸런서를 구현한 예제다. 각 서버로 요청을 분산시키는 방식으로 라운드 로빈을 사용한다.

import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

class Server {
    private String name;

    public Server(String name) {
        this.name = name;
    }

    public void handleRequest() {
        System.out.println("Handling request by " + name);
    }
}

class LoadBalancer {
    private List<Server> servers;
    private AtomicInteger currentIndex = new AtomicInteger(0);

    public LoadBalancer(List<Server> servers) {
        this.servers = servers;
    }

    public void handleRequest() {
        int index = currentIndex.getAndUpdate(i -> (i + 1) % servers.size());
        servers.get(index).handleRequest();
    }
}

public class Main {
    public static void main(String[] args) {
        List<Server> servers = List.of(
            new Server("Server1"),
            new Server("Server2"),
            new Server("Server3")
        );
        LoadBalancer loadBalancer = new LoadBalancer(servers);

        for (int i = 0; i < 10; i++) {
            loadBalancer.handleRequest();
        }
    }
}

이 예제에서는 LoadBalancer 클래스가 요청을 서버에 분산시키는 역할을 한다. currentIndex를 사용하여 각 서버에 순서대로 요청을 보낸다.

So...

로드 밸런싱은 서버의 부하를 분산시켜 시스템의 안정성과 성능을 향상시키는 중요한 기술이다. 다양한 방식으로 트래픽을 분산시키고, 장애 대비를 위해 이중화를 통해 무중단 서비스를 제공할 수 있다. 이를 통해 웹 서비스의 가용성을 높이고 사용자 경험을 향상시킬 수 있다.

profile
개발이란 무엇인가..를 공부하는 거북이의 성장일기 🐢

0개의 댓글