로드 밸런싱은 둘 이상의 CPU나 저장 장치와 같은 컴퓨터 자원들에게 작업을 나누는 것을 말한다. 현대의 웹사이트는 접속하는 인원이 급격하게 늘어났기 때문에, 이를 모두 감당하기 위해서는 단일 서버만으로는 부족하다. 따라서 하드웨어의 성능을 향상시키는 방법(Scale-up)과 여러 대의 서버가 작업을 나누어 처리하는 방법(Scale-out) 중에서 선택할 수 있다.
서버가 여러 대 존재할 때, 트래픽을 균등하게 분산시키는 것이 중요하다. 이를 통해 하나의 서버에 과부하가 걸리는 것을 방지하고, 전체 시스템의 안정성과 성능을 향상시킬 수 있다. 로드 밸런싱은 이러한 트래픽 분산을 담당한다.
로드 밸런서 자체에 문제가 생길 수 있기 때문에 이를 이중화하여 대비한다. 이중화 방식으로는 Active-Passive 설정이 있다.
다음은 간단한 로드 밸런서를 구현한 예제다. 각 서버로 요청을 분산시키는 방식으로 라운드 로빈을 사용한다.
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를 사용하여 각 서버에 순서대로 요청을 보낸다.
로드 밸런싱은 서버의 부하를 분산시켜 시스템의 안정성과 성능을 향상시키는 중요한 기술이다. 다양한 방식으로 트래픽을 분산시키고, 장애 대비를 위해 이중화를 통해 무중단 서비스를 제공할 수 있다. 이를 통해 웹 서비스의 가용성을 높이고 사용자 경험을 향상시킬 수 있다.