data engineering

haproxy tutorial (basic loadbalancing example)

qkqhxla1 2021. 7. 12. 17:00

haproxy에서 라운드로빈으로 로드밸런싱하는 예제를 올린다. 추가적으로  커스터마이징같은거는 한번 돌아가는걸 확인하면 이것저것 해보면서 테스트가 가능하기에 올리지 않는다.

haproxy란? : https://leffept.tistory.com/309에 잘 설명되어있다. 몇가지만 가져왔다.
1. HAProxy는 기존의 하드웨어 스위치를 대체하는 소프트웨어 로드 밸런서로, 네트워크 스위치에서 제공하는 L4, L7 기능 및 로드 밸런서 기능을 제공한다. 설치가 쉽고 빠르기에 서비스 이중화(HA- High Availability)를 구성하는데 주로 사용한다.

2. HAProxy는 기본적으로 reverse proxy 형태로 동작한다. (reverse proxy는 서버로 들어오는 요청을 대신 받아서 서버에 전달하고 요청한 곳에 그 결과를 다시 전달해주는 역할을 함)

나머지는 더 찾아서 읽어보자.

백문이 불여일타라고 haproxy예제를 바로 만들어보자. 서버에 직접 설치 안하고 도커로 구성할거다. 
https://hub.docker.com/_/haproxy 에 haproxy도커 예제가 잘 나와있다. 초간단으로 로드밸런싱하는것만 만들 예정이다.  위의 링크에서 필수적인 부분인 Dockerfile만 아래처럼 간단히 세팅해준다.

Dockerfile

FROM haproxy:2.3
COPY ./haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg

난 도커 빌드용 스크립트를 따로 만들어놓는데 아래처럼 만들었다. 
build.sh

#! /bin/bash

REPOSITORY="docker-hub.mydocker.net/test/go-haproxy"
TAG="v1"

docker build -t $REPOSITORY:$TAG .
docker push $REPOSITORY:$TAG

docker build -t $REPOSITORY:latest .
docker push $REPOSITORY:latest

위의 Dockerfile을 보면 COPY로 Dockerfile과 같은 위치의 haproxy.cfg를 도커 컨테이너 안의 /usr/local/etc/haproxy/haproxy.cfg로 복사하는데, 그럼 haproxy.cfg만 만들고 빌드해서 사용하면 된다. 돌아다니다가 간단한 버전인 https://upcloud.com/community/tutorials/haproxy-load-balancer-ubuntu/ 요 글을 발견했다.
저 글에서 layer 4예제를 가져와서 저중에서도 '단순 라운드로빈 로드밸런싱'을 위해 진짜 필요할것같은것만 세팅해놓는다. 나는 9000번 포트로 받을거다.

haproxy.cfg

frontend http_front
        bind *:9000
        default_backend http_back

backend http_back
        balance roundrobin
        server go_backend1 10.1.2.3:9000 check
        server go_backend2 10.1.2.4:9000 check

눈치로 알겠지만 조금 설명하자면 frontend는 패킷을 받는 입력부이고, http_front는 이름이다. bind *:9000는 현재 서버에서 9000번 포트에 대해 바인딩해놓는다는 뜻이고 default_backend는 기본으로 받은 입력값을 보낼 백엔드이다. http_back을 써놨는데 http_back은 내가 받은 패킷을 보낼 백엔드 이름이고, 바로 다음줄에 backend http_back이라고 선언함으로서 여기로 보내겠다는걸 알수 있다. balance roundrobin은 라운드로빈방식으로 하겠다, server파트는 server 이름 ip주소:포트 check형식이다. 

10.1.2.3:9000에 서버를 하나 열거고, 10.1.2.4:9000에 다른 서버를 하나 열어서 직접 http패킷을 받아보면서 잘 오는지 확인할 예정이다.

이제 위에서 만든 Dockerfile, build.sh, haproxy.cfg가 동일한 폴더 내에 존재한다. build.sh를 실행시켜서 haproxy docker를 빌드해놓자. 그후 10.1.2.3, 10.1.2.4 서버 말고 haproxy을 올릴 서버로 들어가서 도커 이미지를 받고, 실행시켜보자. 9000번 포트로 입력을 받을 것이므로 포워딩을 해줘야 한다.

$ docker pull docker-hub.mydocker.net/test/go-haproxy
$ docker run -p 9000:9000 docker-hub.mydocker.net/test/go-haproxy

이제 테스트를 위해 10.1.2.3, 10.1.2.4에 초간단 서버를 띄워보자. 각자 서버로 들어가서
python -m SimpleHTTPServer 9000 로 간단한 서버를 띄워놓는다. SimpleHTTPServer에 대해서는 내가 이전에 쓴글 https://qkqhxla1.tistory.com/1011을 참조하자. 간단한 구성도는 다음과 같다.

이제 User입장에서 haproxy로 콜을 했을때 10.1.2.3, 10.1.2.4로 로드밸런싱이 잘 되는지 확인해보자.

콜을 두번 해봤는데 한번씩 잘 나뉘어서 들어갔다.(다른 아웃풋이 나온걸 확인할수 있음.) SimpleHTTPServer서버를 포그라운드로 실행시켜놨으면 입력이 하나씩 들어온걸 확인할수 있다.

단순히 L4 로드밸런싱 말고 조금더 세부적인 L7에서의 조정 등은 여기저기 찾아보자.

좋은 링크.
https://upcloud.com/community/tutorials/haproxy-load-balancer-ubuntu/
https://dzone.com/articles/how-to-configure-ha-proxy-as-a-proxy-and-loadbalan