HAProxy 를 통한 Round-Robin L4/L7 로드 밸런서 구현

이 블로그 포스트는 HAProxy 를 사용한 Round-Robin 방식의 L4 및 L7 로드 밸런서 구현 방법에 대해 다룹니다. HAProxy는 로드 밸런서 및 프록시 서버로, 특히 웹 서버와 데이터베이스 서버의 로드 밸런싱에 널리 사용됩니다.

목차

1. HAProxy 소개
 1-1. HAProxy란 무엇인가?
 1-2. HAProxy의 주요 기능과 장점
2. Round-Robin HAProxy L4 로드 밸런서 구현
 2-1. L4 로드 밸런싱 설정 예제
 2-2. HAProxy L4 설정 파일 작성
 2-3. 설정 테스트 및 검증
3. Round-Robin HAProxy L7 로드 밸런서 구현
 3-1. L7 로드 밸런싱 설정 예제
 3-2. HAProxy L7 설정 파일 작성
 3-3. 설정 테스트 및 검증
4. HAProxy 로드 밸런서 결론

1. HAProxy 소개

HAProxy는 로드 밸런서 및 프록시 서버로, 웹 서버와 데이터베이스 서버의 부하 분산 및 트래픽 관리에 널리 사용됩니다. HAProxy는 TCP(4계층)와 HTTP(7계층) 프로토콜을 모두 지원하며, 다양한 배포 환경에서 유연하게 활용될 수 있습니다. 주로 대규모 트래픽을 처리하는 서비스에서 안정성과 성능을 보장하기 위해 사용됩니다.

1-1. HAProxy란 무엇인가?

HAProxy는 높은 가용성과 확장성을 제공하여, 대규모 웹 서비스와 애플리케이션에서 필수적인 역할을 합니다. TCP 및 HTTP 기반의 애플리케이션에 대한 로드 밸런싱을 지원하며, 다양한 로드 밸런싱 알고리즘을 제공하여 트래픽을 효율적으로 분산시킵니다. 주로 Linux 환경에서 사용되지만, 다양한 운영 체제에서 사용할 수 있습니다.

1-2. HAProxy의 주요 기능과 장점

HAProxy는 여러 가지 주요 기능과 장점을 가지고 있습니다.

  • 뛰어난 성능과 안정성으로 많은 동시 연결을 효율적으로 처리할 수 있습니다.
  • 다양한 로드 밸런싱 알고리즘을 제공하여 사용자 요구에 맞게 설정할 수 있습니다.
  • 헬스 체크 기능을 통해 백엔드 서버의 상태를 모니터링하고, 비정상적인 서버를 자동으로 제외시킵니다.
  • SSL/TLS Termination을 지원하여 보안성을 강화할 수 있습니다.

마지막으로, 오픈 소스 소프트웨어로 무료로 사용 가능하며, 활발한 커뮤니티 지원을 받아 지속적인 업데이트와 개선이 이루어집니다.

2. Round-Robin HAProxy L4 로드 밸런서 구현

Round-Robin 방식의 L4 로드 밸런서는 각 클라이언트 요청을 순차적으로 백엔드 서버에 분배하여 트래픽을 고르게 나누는 방식입니다.

HAProxy를 통해 이러한 설정을 구현하면, 네트워크 계층에서 TCP 트래픽을 효율적으로 분산시킬 수 있습니다. 이 섹션에서는 L4 로드 밸런싱 설정 예제와 함께 HAProxy 설정 파일 작성 및 테스트 방법을 단계별로 설명합니다.

2-1. L4 로드 밸런싱 설정 시나리오

L4 로드 밸런싱은 전송 계층에서 작동하며, 주로 TCP 프로토콜 기반의 애플리케이션에서 사용됩니다. Round-Robin 방식은 각 요청을 순차적으로 분배하여 백엔드 서버의 부하를 균등하게 나눕니다. 예를 들어, 3개의 백엔드 서버가 있는 환경에서는 첫 번째 요청이 첫 번째 서버로, 두 번째 요청이 두 번째 서버로, 세 번째 요청이 세 번째 서버로 전달됩니다. 이후 네 번째 요청은 다시 첫 번째 서버로 돌아갑니다.

2-2. HAProxy L4 설정 파일 작성

global
    log /dev/log local0
    log /dev/log local1 notice
    daemon
    maxconn 256

defaults
    log global
    mode tcp
    option tcplog
    timeout connect 5000ms
    timeout client 50000ms
    timeout server 50000ms

frontend tcp_front
    bind *:3000
    default_backend tcp_back

backend tcp_back
    balance roundrobin
    server server1 192.168.1.1:3001 check
    server server2 192.168.1.2:3002 check
    server server3 192.168.1.3:3003 check

이 설정 파일은 HAProxy가 3000번 포트에서 클라이언트 요청을 받아 3개의 백엔드 서버로 Round-Robin 방식으로 분배하도록 구성되어 있습니다. frontend 섹션은 클라이언트와의 연결을 관리하고, backend 섹션은 요청을 처리할 서버를 정의합니다.

2-3. 설정 테스트 및 검증

TCP Backend 서버 각 세 개에 대한 요청 및 응답은 다음과 같습니다.

nc 192.168.1.1 3001
Hello from server 1

nc 192.168.1.2 3002
Hello from server 2

nc 192.168.1.3 3003
Hello from server 3

HAProxy 구성을 작성한 뒤 HAProxy 문법 검사를 통해 문법에 이상이 없음을 확인합니다.

haproxy -c -f /etc/haproxy/haproxy.cfg

HAProxy TCP 로드 밸런서 서버로 netcat 요청을 보내 세 개의 서버에 대한 로드 밸런싱을 확인합니다.

nc 192.168.0.1 3000
Hello from server 1

nc 192.168.0.1 3000
Hello from server 2

nc 192.168.0.1 3000
Hello from server 3

nc 192.168.0.1 3000
Hello from server 1

nc 192.168.0.1 3000
Hello from server 2

nc 192.168.0.1 3000
Hello from server 3

Round-Robin 형태로 L4 TCP 프로토콜 로드 밸런싱이 정상적으로 처리되는 것을 확인할 수 있습니다.

이와 같은 절차를 통해 HAProxy 를 사용한 Round-Robin L4 로드 밸런서를 성공적으로 구현하고 검증할 수 있습니다.

3. Round-Robin HAProxy L7 로드 밸런서 구현

L7 로드 밸런싱은 애플리케이션 계층에서 작동하며, HTTP와 같은 애플리케이션 프로토콜을 기반으로 요청을 처리합니다. Round-Robin 방식으로 각 요청을 순차적으로 백엔드 서버에 분배하여 트래픽을 고르게 나누는 방법입니다.

이 섹션에서는 L7 로드 밸런싱 설정 예제와 함께 HAProxy 설정 파일 작성 및 테스트 방법을 단계별로 설명합니다.

3-1. L7 로드 밸런싱 설정 시나리오

L7 로드 밸런싱은 애플리케이션 계층에서 HTTP 요청을 분석하고 분배합니다. Round-Robin 방식은 각 HTTP 요청을 순차적으로 백엔드 서버에 분배하여 서버 간의 부하를 균등하게 나눕니다.
예를 들어, 3개의 백엔드 서버가 있는 환경에서는 첫 번째 요청이 첫 번째 서버로, 두 번째 요청이 두 번째 서버로, 세 번째 요청이 세 번째 서버로 전달됩니다. 이후 네 번째 요청은 다시 첫 번째 서버로 돌아갑니다.

3-2. HAProxy L7 설정 파일 작성

HAProxy의 L7 로드 밸런싱을 위한 설정 파일은 다음과 같습니다.

global
    log /dev/log local0
    log /dev/log local1 notice
    daemon
    maxconn 256

defaults
    log global
    mode http
    option httplog
    option dontlognull
    timeout connect 5000ms
    timeout client 50000ms
    timeout server 50000ms

frontend http_front
    bind *:80
    default_backend http_back

backend http_back
    balance roundrobin
    server server1 192.168.1.1:80 check
    server server2 192.168.1.2:80 check
    server server3 192.168.1.3:80 check

이 설정 파일은 HAProxy가 80번 포트에서 클라이언트의 HTTP 요청을 받아 3개의 백엔드 서버로 Round-Robin 방식으로 분배하도록 구성되어 있습니다. frontend 섹션은 클라이언트와의 HTTP 연결을 관리하고, backend 섹션은 HTTP 요청을 처리할 서버를 정의합니다.

3-3. 설정 테스트 및 검증

설정 파일 작성 후, 다음 단계는 HAProxy 서비스를 재시작하고 설정이 제대로 적용되었는지 테스트하는 것입니다.
재시작 하기 전 구성파일 문법 검사를 실행하고, 다음 명령어를 사용하여 HAProxy를 재시작합니다.

haproxy -c -f /etc/haproxy/haproxy.cfg # 문법 검사

systemctl restart haproxy # HAProxy 재시작

HAProxy를 재시작 한 후, 브라우저 혹은 cURL 도구를 통해 L7 로드 밸런싱을 검증할 수 있습니다.

cURL Backend 요청

curl 192.168.1.1:80

<!DOCTYPE html>
<html>
<head>
<title>HTTP Backend 1</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>This Page HTTP Web 1</h1>
</body>
</html>

curl 192.168.1.2:80

<!DOCTYPE html>
<html>
<head>
<title>HTTP Backend 2</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>This Page HTTP Web 2</h1>
</body>
</html>

curl 192.168.1.3:80

<!DOCTYPE html>
<html>
<head>
<title>HTTP Backend 3</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>This Page HTTP Web 3</h1>
</body>
</html>

다음은 HAProxy 프록시를 통한 HTTP 요청입니다.

curl 192.168.0.1:80

<!DOCTYPE html>
<html>
<head>
<title>HTTP Backend 1</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>This Page HTTP Web 1</h1>
</body>
</html>

curl 192.168.0.1:80

<!DOCTYPE html>
<html>
<head>
<title>HTTP Backend 2</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>This Page HTTP Web 2</h1>
</body>
</html>

curl 192.168.0.1:80

<!DOCTYPE html>
<html>
<head>
<title>HTTP Backend 3</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>This Page HTTP Web 3</h1>
</body>
</html>

다음은 브라우저를 통한 HTTP 요청 결과입니다.

이와 같은 절차를 통해 HAProxy를 사용한 Round-Robin L7 로드 밸런서를 성공적으로 구현하고 검증할 수 있습니다.

4. 결론

HAProxy를 활용한 Round-Robin 방식의 L4 및 L7 로드 밸런서 구현은 웹 애플리케이션과 서비스의 성능과 가용성을 크게 향상시킬 수 있는 효율적인 방법입니다. L4 로드 밸런싱을 통해 네트워크 계층에서 TCP 트래픽을 고르게 분배할 수 있으며, L7 로드 밸런싱을 통해 애플리케이션 계층에서 HTTP 요청을 세밀하게 제어하고 분산할 수 있습니다. 각 방식의 설정과 검증 방법을 통해, 다양한 환경에서 HAProxy를 효과적으로 활용할 수 있는 방법을 배웠습니다.

HAProxy를 통한 L4/L7 로드 밸런싱의 구성 파일은 NGINX STORE의 GitHub 레포지토리에서 전체 파일을 확인할 수 있습니다.

기타 HAProxy에 대한 질문은 NGINX STORE에 문의하여 답변 받아보세요.

NGINX STORE를 통한 솔루션 도입 및 기술지원 무료 상담 신청

* indicates required