반응형
로드 밸런싱이란?
여러 서버로 네트워크 트래픽을 분산하여 부하를 줄이고 성능 최적화 가능
대규모 웹사이트, 애플리케이션, 데이터 센터에서 안정적인 서비스 제공을 위해 필수적으로 사용 중인 기술
로드 밸런싱의 필요성
- 성능 향상: 단일 서버에 모든 요청이 집중되는 것을 방지하고 여러 서버로 트래픽을 분산하여 처리 속도를 높임
- 고가용성(High Availability): 특정 서버에 장애가 발생해도 다른 서버가 요청을 처리하여 서비스 중단을 방지
- 확장성(Scalability): 서버를 추가하여 트래픽 증가에 유연하게 대응할 수 있음
- 보안 강화: DDoS 공격 등의 부하를 여러 서버에 분산하여 공격에 대한 대응력을 높일 수 있음
로드 밸런서의 유형
1. 하드웨어 로드 밸런서
- 물리적인 장비로 구현되며, 고성능이지만 비용이 높음.
- 대표적인 제품: F5 BIG-IP, Citrix NetScaler, A10 Thunder
2. 소프트웨어 로드 밸런서
- 서버에 설치하여 실행되며 비용이 저렴하고 유연성 높음.
- 대표적인 소프트웨어:
- HAProxy (가장 널리 사용되는 오픈소스 로드 밸런서)
- Nginx (웹 서버와 함께 로드 밸런서 역할 가능)
- AWS Elastic Load Balancer(ELB) (클라우드 환경용)
- Traefik, Envoy (마이크로서비스 환경에서 사용)
로드 밸런싱 방식
1. L4 로드 밸런싱 (네트워크 레벨)
- OSI 4계층(TCP/UDP)에서 작동하며, IP 및 포트 정보를 기반으로 트래픽을 분산.
- 속도가 빠르고 단순한 부하 분산이 필요할 때 적합.
- 예시: AWS ELB(Network Load Balancer), HAProxy (TCP 모드)
2. L7 로드 밸런싱 (애플리케이션 레벨)
- OSI 7계층(HTTP/HTTPS)에서 작동하며, HTTP 헤더, 쿠키, URL 등의 정보를 기반으로 분산.
- 특정 요청을 특정 서버로 라우팅 가능 (예: /api 요청은 API 서버로).
- 예시: AWS ELB(Application Load Balancer), Nginx, HAProxy (HTTP 모드)
로드 밸런싱 알고리즘
1. 라운드 로빈 (Round Robin)
- 가장 기본적인 방식으로, 요청을 순차적으로 서버에 분배.
- 균등한 분배가 가능하지만, 서버 성능 차이가 클 경우 비효율적.
2. 가중치 기반 라운드 로빈 (Weighted Round Robin)
- 성능이 높은 서버에 더 많은 요청을 할당하도록 가중치를 부여.
3. 최소 연결 (Least Connections)
- 현재 연결 수가 가장 적은 서버로 트래픽을 분배하여 부하를 최소화.
4. IP 해시 (IP Hashing)
- 클라이언트 IP를 기반으로 특정 서버로 요청을 전달하여 세션 유지에 유용.
5. Least Response Time
- 응답 시간이 가장 짧은 서버로 트래픽을 보내는 방식.
로드 밸런싱 예제(HA Proxy)
192.168.1.106 으로 오는 요청을 두 개의 웹 서버(192.168.1.123, 192.168.1.124)에 트래픽을 라운드 로빈 방식으로 분산하는 예제
haproxy.cfg
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 30s # 백엔드가 연결될 때까지 대기하는 시간 (기본10초 => 30초)
timeout client 10m # 클라이언트가 반응이 올 것으로 예상하는 시간 (기본30초 => 10분)
timeout server 300m # 백엔드 서버가 반응이 올 것으로 예상하는 시간 (기본30초 => 5시간)
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend main
bind 192.168.1.106:80
default_backend test-ha
#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
#backend static
# balance roundrobin
# server static 127.0.0.1:4331 check
#
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend test-ha
balance roundrobin
option forwardfor if-none
server test-instance1 192.168.1.123:80 check
server test-instance2 192.168.1.124:80 check
반응형