[HAProxy] 로드밸런싱
로드밸런싱을 구성하는 방법을 다뤄보겠다.
로드밸런싱은 기본적으로 부하를 분산하기 위한 것이다.
앞단에서 우선 로드밸런서가 몸빵을 한 다음에, 서버들에게 일을 떠넘겨서 역할을 분리하고 안정성을 극대화하는 것이다.
이를 통해서 서버 자원을 스케일아웃해서 비용 효율적으로 리소스를 증가시킬 수 있고, 유동적으로 서버 자원을 늘리거나 줄일 수도 있다. 서버를 추가해서 연결만 하면 되기 때문이다.
그리고 로드밸런서는 비교적 간단한 proxy 작업만 하기 때문에 리소스를 그리 크게 먹지는 않는다. 이런 것마저 터질까 걱정스럽다면 AWS 등의 클라우드 서비스에서 제공하는 로드밸런서를 쓰는 편이 이롭다.
환경 구성
여기서는 docker를 기반으로 환경을 구성해본다.
우선 서버를 3개 띄워보겠다. 내가 말아놓은 이미지다.
docker run -idt -p 12345:80 myyrakle/node-server-for-test
docker run -idt -p 12346:80 myyrakle/node-server-for-test
docker run -idt -p 12347:80 myyrakle/node-server-for-test

해서, 이렇게 각각 조회되면 잘 된 것이다.



config 구성
haproxy.cfg에서 모든걸 다 한다.
아래와 같이 구성하면 된다.
backend test-back
balance 알고리즘
server server1 아이피1:포트
server server2 아이피2:포트
server server3 아이피3:포트
서버를 server 명령으로 쭉 늘어놓고, 밸런싱에 사용할 알고리즘을 정해서 넣으면 된다.
알고리즘에는 leastconn, roundrobin, static-rr, source, first, random 등이 있는데, 대부분은 leastconn 아니면 roundrobin을 사용한다.
leastconn은 현재 커넥션이 제일 적은 서버에게 부하를 넘기는 것이고, 라운드로빈은 그냥 순서대로 1,2,3 차례로 보내주는 것이다. 쓰고싶은걸 쓰면 된다.
그렇게 해서, 나는 이런식으로 config를 구성했다.
global
log /dev/log local0
log /dev/log local1 notice
stats timeout 30s
user haproxy
group haproxy
daemon
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate
ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
frontend test-front
mode http
bind *:80
default_backend test-back
backend test-back
balance leastconn
server server1 host.docker.internal:12345
server server2 host.docker.internal:12346
server server3 host.docker.internal:12347
그리고 dockerbuild를 해서 haproxy 이미지를 적당히 말아준다.

귀찮다면 그냥 내가 말아놓은 것을 써도 된다..
말아놓은 이미지를 실행시켜주면
docker run -idt -p 44444:80 myyrakle/haproxy-for-test
로드밸런서가 뜰 것이다.
그럼 연결이 될 것이고

최소 연결(leastconn) 방식에 따라 호출할때마다 적게 연결된 서버가 불려나올 것이다.


그렇다.
참조
https://www.haproxy.com/documentation/hapee/latest/configuration/config-sections/backend/
https://hub.docker.com/_/haproxy
https://www.analyticsvidhya.com/blog/2022/06/use-a-load-balancer-on-google-cloud-to-host-web-applications/