HAProxy는 특히 대규모 트래픽을 처리하는 애플리케이션에 적합하며, 간단한 설정만으로도 안정성과 성능을 확보할 수 있는 장점이 있습니다. 또한, 무료 오픈소스임에도 상용 제품 못지않은 성능을 제공합니다. SSL/TLS 암호화 지원을 통해 보안을 강화할 수 있으며, 다양한 환경에서 유연하게 동작합니다.
L4 로드밸런싱은 IP와 포트를 기준으로 트래픽을 분산시킵니다. 이 방식은 빠르고, 간단한 네트워크 기반 트래픽 분산이 가능해 많은 웹 애플리케이션에서 사용됩니다. 예를 들어, 웹 애플리케이션 서버들이 여러 대 있을 경우, 각 서버로 트래픽을 고르게 분배해 서버 과부하를 방지할 수 있습니다.
L7 로드밸런싱은 URI 경로에 따라 트래픽을 분산시킵니다. HTTP 프로토콜을 이해하여 도메인 하위의 특정 경로에 따라 다른 서버로 트래픽을 보낼 수 있어 더욱 세밀한 로드밸런싱이 가능합니다. 예를 들어, /item 페이지는 특정 서버로, /basket 페이지는 다른 서버로 분산시켜 성능 최적화와 보안성 강화에 유리합니다.
1. 기본 HTTP 방식
VM IP:80 -> node1,2,3 에 대한 로드밸런싱 구현2. L7 URI 방식
VM IP:80/item -> node1,2 로드밸런싱 구현
VM IP:80/basket -> node3,4 로드밸런싱 구현
실습 환경에서 기본 HTTP와 L7 URI 방식의 로드밸런싱을 구현하면서, 각각의 차이점을 직접 체험할 수 있습니다. 기본 HTTP 방식은 단순한 트래픽 분산을 지원하지만, URI 기반의 L7 방식은 애플리케이션별로 세분화된 로드밸런싱이 가능합니다. 이를 통해 보다 유연하고 효율적인 트래픽 관리가 가능해집니다.
NCP VM 사용 (Ubuntu 22.04 / vCPU2, RAM 4GB)
사전에 Docker engine 설치
root@wookjin:~# docker network create proxy-net
root@wookjin:~# docker run -d --name=echo-web1 --net=proxy-net -h echo-web1 dbgurum/haproxy:echo
root@wookjin:~# docker run -d --name=echo-web2 --net=proxy-net -h echo-web2 dbgurum/haproxy:echo
root@wookjin:~# docker run -d --name=echo-web3 --net=proxy-net -h echo-web3 dbgurum/haproxy:echo
root@wookjin:~# mkdir conf && cd $_
root@wookjin:~/conf# vi haproxy.cfg
global
stats socket /var/run/api.sock user haproxy group haproxy mode 660 level admin expose-fd listeners
log stdout format raw local0 info
defaults
mode http
timeout client 10s
timeout connect 5s
timeout server 10s
timeout http-request 10s
log global
frontend stats
bind *:8404
stats enable
stats uri /
stats refresh 10s
frontend myfrontend
bind :80
default_backend webservers
backend webservers
server s1 echo-web1:8080 check
server s2 echo-web2:8080 check
server s3 echo-web3:8080 check
root@wookjin:~/conf# docker run -d --name=haproxy-container --net=proxy-net -p 80:80 -p 8404:8404 -v $(pwd):/usr/local/etc/haproxy:ro haproxytech/haproxy-alpine:2.5
root@wookjin:~/conf# curl localhost:80
Request served by echo-web3
GET / HTTP/1.1
Host: localhost
Accept: */*
User-Agent: curl/7.81.0
root@wookjin:~/conf# curl localhost:80
Request served by echo-web1
GET / HTTP/1.1
Host: localhost
Accept: */*
User-Agent: curl/7.81.0
VM IP:80/item -> node1,2 로드밸런싱 구현
VM IP:80/basket -> node3,4 로드밸런싱 구현
global
stats socket /var/run/api.sock user haproxy group haproxy mode 660 level admin expose-fd listeners
log stdout format raw local0 info
defaults
mode http
timeout client 10s
timeout connect 5s
timeout server 10s
timeout http-request 10s
log global
frontend myfrontend
bind :80
default_backend webservers
acl echo-web1-item path_beg /item
acl echo-web2-item path_beg /item
acl echo-web3-basket path_beg /basket
acl echo-web4-basket path_beg /basket
use_backend echo-web1_backend if echo-web1-item
use_backend echo-web1_backend if echo-web2-item
use_backend echo-web2_backend if echo-web3-basket
use_backend echo-web2_backend if echo-web4-basket
backend webservers
balance roundrobin
server s1 echo-web1-item:8080 check
server s2 echo-web2-item:8080 check
server s3 echo-web3-basket:8080 check
server s4 echo-web4-basket:8080 check
backend echo-web1_backend
server s1 echo-web1-item:8080 check
server s2 echo-web2-item:8080 check
backend echo-web2_backend
server s3 echo-web3-basket:8080 check
server s4 echo-web4-basket:8080 check
root@wookjin:~/conf# docker run -d --name=echo-web1-item --net=proxy-net -h echo-web1-item dbgurum/haproxy:echo
root@wookjin:~/conf# docker run -d --name=echo-web2-item --net=proxy-net -h echo-web2-item dbgurum/haproxy:echo
root@wookjin:~/conf# docker run -d --name=echo-web3-basket --net=proxy-net -h echo-web3-basket dbgurum/haproxy:echo
root@wookjin:~/conf# docker run -d --name=echo-web4-basket --net=proxy-net -h echo-web4-basket dbgurum/haproxy:echo
root@wookjin:~/conf# docker run -d --name=haproxy-container --net=proxy-net -p 80:80 -p 8404:8404 -v $(pwd):/usr/local/etc/haproxy:ro haproxytech/haproxy-alpine:2.5
root@wookjin:~/conf# curl localhost/item
Request served by echo-web1-item
GET /item HTTP/1.1
Host: localhost
Accept: */*
User-Agent: curl/7.81.0
root@wookjin:~/conf# curl localhost/item
Request served by echo-web2-item
GET /item HTTP/1.1
Host: localhost
Accept: */*
User-Agent: curl/7.81.0
root@wookjin:~/conf# curl localhost/basket
Request served by echo-web3-basket
GET /basket HTTP/1.1
Host: localhost
Accept: */*
User-Agent: curl/7.81.0
root@wookjin:~/conf# curl localhost/basket
Request served by echo-web4-basket
GET /basket HTTP/1.1
Host: localhost
Accept: */*
User-Agent: curl/7.81.0