티스토리 뷰
부하 분산(Load Balancing)이란?
부하 분산(Load Balancing)은 많은 요청이 발생할 때 하나의 서버가 과부하되지 않도록 여러 서버에 트래픽을 고르게 분배하는 기술입니다. 이를 통해 서비스의 성능 최적화, 장애 대응, 확장성 확보 등을 달성할 수 있습니다.
1. 부하 분산이 필요한 이유
부하 분산을 적용하는 주된 이유는 다음과 같습니다.
- 고가용성(High Availability): 하나의 서버가 장애를 일으켜도 서비스가 중단되지 않고 정상적으로 운영될 수 있도록 합니다.
- 성능 향상(Performance Improvement): 여러 서버가 트래픽을 분산 처리함으로써 응답 속도를 개선합니다.
- 확장성(Scalability): 트래픽이 증가할 때 서버를 추가하여 시스템의 처리 능력을 확장할 수 있습니다.
- 안정성(Fault Tolerance): 특정 서버가 다운되더라도 다른 서버가 요청을 처리할 수 있도록 대비할 수 있습니다.
2. 부하 분산의 방식
부하 분산은 네트워크 계층(L4), 애플리케이션 계층(L7), DNS 기반으로 나눌 수 있습니다.
2.1 L4 (전송 계층) 로드 밸런싱
OSI 4계층(전송 계층, TCP/UDP)에서 동작하며, 주로 클라이언트의 IP 주소, 포트 번호 등을 기반으로 부하를 분산합니다.
- 주요 특징
- 요청 내용을 분석하지 않고, TCP/UDP 패킷을 기반으로 트래픽을 분배
- 빠르고 단순한 로드 밸런싱이 가능
- 세션 유지(Session Persistence)가 어려움
- 대표적인 솔루션
- 하드웨어: F5, Citrix NetScaler
- 소프트웨어: HAProxy, Nginx, AWS NLB(Network Load Balancer)
- 예제 (HAProxy L4 설정)
frontend http_front
bind *:80
default_backend web_servers
backend web_servers
balance roundrobin
server server1 192.168.1.1:80 check
server server2 192.168.1.2:80 check
2.2 L7 (애플리케이션 계층) 로드 밸런싱
OSI 7계층(애플리케이션 계층, HTTP/HTTPS)에서 동작하며, HTTP 요청의 헤더, URL, 쿠키, 바디 데이터 등을 기반으로 부하를 분산합니다.
- 주요 특징
- 특정 URL이나 HTTP 메서드에 따라 요청을 특정 서버로 라우팅 가능
- 세션 유지(Session Persistence) 기능 제공 가능
- 캐싱, 압축, SSL 처리 등의 기능을 추가할 수 있음
- 대표적인 솔루션
- 소프트웨어: Nginx, HAProxy, Envoy, Traefik
- 클라우드 서비스: AWS ALB(Application Load Balancer), GCP HTTP Load Balancer
- 예제 (Nginx L7 설정)
server {
listen 80;
location /api/ {
proxy_pass http://backend-api;
}
location /static/ {
proxy_pass http://cdn-server;
}
}
2.3 DNS 기반 부하 분산 (Global Load Balancing)
DNS 기반 부하 분산은 DNS 서버가 여러 개의 IP 주소를 반환하여 요청을 여러 서버로 분산하는 방식입니다.
- 주요 특징
- 글로벌 트래픽을 지역별로 분산 가능 (예: 한국 사용자는 한국 서버, 미국 사용자는 미국 서버)
- 장애 발생 시 DNS 응답을 변경하여 트래픽을 우회 가능
- 즉각적인 변경이 어려운 경우가 있음 (DNS TTL 설정에 따라 다름)
- 대표적인 솔루션
- AWS Route 53, Cloudflare Load Balancer, Akamai, Google Cloud DNS
- 예제 (AWS Route 53 Latency-Based Routing)
- 미국 사용자는 미국 데이터센터로 연결
- 한국 사용자는 한국 데이터센터로 연결
3. 부하 분산 알고리즘
로드 밸런서는 요청을 처리할 서버를 선택할 때 다양한 알고리즘을 사용할 수 있습니다.
3.1 라운드 로빈 (Round Robin)
- 서버 리스트를 순차적으로 돌면서 요청을 분배하는 방식
- 균등하게 요청을 배분하지만, 서버 성능이 다르면 부하가 균등하지 않을 수 있음
upstream backend {
server server1.example.com;
server server2.example.com;
}
3.2 가중치 라운드 로빈 (Weighted Round Robin)
- 성능이 더 좋은 서버에 더 많은 요청을 보내도록 가중치를 부여
upstream backend {
server server1.example.com weight=3;
server server2.example.com weight=1;
}
3.3 최소 연결 방식 (Least Connections)
- 현재 연결된 세션 수가 가장 적은 서버로 요청을 보내는 방식
- 비정상적으로 긴 요청이 있는 경우에도 적절한 부하 분산 가능
balance leastconn
3.4 IP 해싱 (IP Hash)
- 클라이언트의 IP 주소를 해싱하여 특정 서버로 요청을 보냄
- 같은 사용자가 항상 같은 서버를 이용하도록 유지 가능 (세션 유지)
upstream backend {
ip_hash;
server server1.example.com;
server server2.example.com;
}
4. 부하 분산 실무 적용 사례
4.1 AWS에서 L4 + L7 로드 밸런서 조합
- AWS NLB (Network Load Balancer, L4): TCP/UDP 기반 부하 분산
- AWS ALB (Application Load Balancer, L7): HTTP/HTTPS 기반 부하 분산
- Auto Scaling 그룹과 연동하여 서버 자동 증설
# AWS ALB Target Group 설정 예제
TargetGroup:
Type: AWS::ElasticLoadBalancingV2::TargetGroup
Properties:
TargetType: instance
Protocol: HTTP
Port: 80
VpcId: vpc-123456
5. 결론
부하 분산을 적용할 때는 트래픽 유형, 서비스 규모, 성능 요구사항 등을 고려하여 적절한 방식을 선택해야 합니다.
- 소규모 서비스: L7 로드 밸런싱 (Nginx, HAProxy) 활용
- 대규모 서비스: L4 로드 밸런싱 (AWS NLB) + L7 로드 밸런싱 (AWS ALB) 조합
- 글로벌 서비스: DNS 기반 부하 분산 (AWS Route 53, Cloudflare) 활용
부하 분산을 효율적으로 구성하면 서비스 가용성을 높이고 성능을 최적화할 수 있습니다.