Gom3rye

Load Balancer 본문

현대 오토에버 클라우드 스쿨

Load Balancer

Gom3rye 2025. 6. 25. 08:55
728x90

Load Balancer

서버는 가해지는 부하(Load)를 분산(Balancing) 해주는 기술 또는 장치

  • 클라이언트와 ServerPool(분산 네트워크를 구성하는 서버의 그룹) 사이에 위치하며 한 대의 서버로 부하가 집중되지 않도록 트래픽을 관리해 각각의 서버가 최적의 퍼포먼스를 보일 수 있도록 해주는 기술
  • 리소스 활용도를 최적화하고 처리량을 최대화하며 지연 시간을 줄이고 내결함성(fault tolerance) 구성을 보장하기 때문에 안정적인 시스템 운영에 도움이 된다.
  • Docker는 HaProxy, Nginx/Apache Load Balancer 등 외부 서비스와 컨테이너를 결합한 Load Balancing 기능 구현이 가능하다.
    • 백로그: 한 번에 접속할 수 있는 개수
  • Controller 라고 부를 때는 요청에 따라 분기를 할 때이고 뒤에 API Server 들이 존재하는 경우에는 Controller 보다는 API Gateway로 부르고 동일한 처리를 하는 서버들 사이를 분기하면 Load Balancer 라고 하며 내부의 서비스와 외부의 서비스를 연결해주면 Ingress라고 한다.

Load Balancing 연결 알고리즘

  • Round Robin: 순서대로 번갈아가면서 처리하는 것으로 기본이다.
  • Least Connection: 현재 연결된 클라이언트 수가 가장 적은 서버로 요청 전달하는 것으로 경로 보장이 안된다.
  • IP Hash: 해시 키를 이용해서 IP 별로 인덱스를 INDEX를 생성하여 동일 IP 주소는 동일 서버로의 경로를 보장, 해당 서비스 장애 시 주소가 변경된다. But, 균등 배분 보장이 안된다. → 로드 밸런싱 의미에 벗어남
    • A/B test
  • General Hash: 사용자가 정의하는 키(IP, Port, URI 등)을 이용한 서버 지정 방식
  • Least Time: 요청에 대한 낮은 평균 지연 시간을 다음 지시자를 기준으로 계산해 서버를 지정한다. (시간을 기준으로 계산하자.)
    • header: 서버의 첫 번째 바이트를 받는 시간 기준
    • last_byte: 서버에서 전체 응답을 받는 시간 기준
    • last_byte_inflight: 불완전 요청을 고려한 전체 응답을 받는 시간 기준
  • Random: 요청에 대한 무작위 서버를 선택하며 특정 기준을 두고 부합하는 서버 선택도 가능하다.

종류

  • L4 로드 밸런서: IP와 Port를 가지고 분기
  • L7 로드 밸런서: IP와 Port 그리고 URL로 분기하는 것이 가능하다.

nginx Load Balancing

  • 파라미터
    • weight: 가중치 설정을 통해 서버 간 요청을 분배한다. (기본값=1)
    • max_conns, queue: 최대 클라이언트 연결 수 지정과 대기열을 생성한다.
    • max_fails: 최대 실패 횟수를 지정해서 임계치 도달 시 해당 서버를 분배 대상에서 제외한다.
    • fail_timeout: 응답 최소 시간 설정으로 실패 횟수를 카운트 하는데 보통 max_fails와 같이 사용한다.
    • backup: 이 키워드가 있는 서버는 평소에 동작하지 않고 모든 서버가 동작하지 않을 때 사용한다.
    • down: 이 서버는 사용하지 않지만 ip_hash인 경우만 사용한다.

nginx를 이용한 Load Balancer 구현

  • 디렉토리 생성
mkdir alb
cd alb
mkdir nginx_alb pyfla_app1 pyfla_app2 pyfla_app3
  • nginx Dockerfile 만들기
cd nginx_alb
vi Dockerfile

FROM nginx
RUN rm /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/conf.d/default.conf # 우리가 가진 기본 설정 파일로 바꿈
  • nginx 설정 파일 만들기
vi nginx.conf

upstream web-alb{
        server 172.17.0.1:5001;
        server 172.17.0.1:5002;
        server 172.17.0.1:5003;
}
server {
        location / {
                proxy_pass http://web-alb;
        }
}
  • python 첫 번째 애플리케이션 작업
cd ../pyfla_app1 # 디렉토리 이동

vi pyfla_app.py # 파이썬 코드 작성

from flask import request, Flask
import json
app = Flask(__name__)
@app.route("/")
def index():
    return "Web Application [1]" + "\\n"
if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0')

# 패키지 설치를 위한 requirements.txt 파일 생성 및 작성
vi requirements.txt
# ~/docker/web$ vi requirements.txt 에 있는 거 redis 빼고 복붙
blinker==1.9.0
click==8.2.1
Flask==3.1.1
itsdangerous==2.2.0
Jinja2==3.1.6
MarkupSafe==3.0.2
Werkzeug==3.1.3

vi Dockerfile # 파이썬 애플리케이션을 이미지로 생성하기 위한 Dockerfil 작성

FROM python:3
COPY ./requirements.txt /requirements.txt
WORKDIR /
RUN pip install -r requirements.txt
COPY . /
ENTRYPOINT ["python3"]
CMD ["pyfla_app.py"]

  • pyfla_app2와 pyfla_app3 디렉토리에 방금 전 3개 파일을 복사하고 pyfla_app.py 파일의 출력 부분에서 1만 2나 3으로 수정 (현재 위치는 3개의 파일이 있는 pyfla_app1)
cp Dockerfile pyfla_app.py requirements.txt ../pyfla_app2
cp Dockerfile pyfla_app.py requirements.txt ../pyfla_app3
vi pyfla_app2/pyfla_app.py
vi pyfla_app3/pyfla_app.py

  • alb 디렉토리에 위 4개의 디렉토리에 있는 이미지를 서비스로 배포하기 위한 docker-compose.yml 파일을 작성
    version: "3"
    services:
      pyfla_app1:
        build: ./pyfla_app1
        ports:
          - "5001:5000"
      pyfla_app2:
        build: ./pyfla_app2
        ports:
          - "5002:5000"
      pyfla_app3:
        build: ./pyfla_app3
        ports:
          - "5003:5000"
      nginx:
        build: ./nginx_alb
        ports:
          - "8080:80"
        depends_on:
          - pyfla_app1
          - pyfla_app2
          - pyfla_app3

  • 컨테이너 가동
docker-compose up -d --build

-> 항상 docker ps로 확인해보기

만약 에러가 나서 docker ps로 확인해봤는데 떠있지 않다면 docker-compose logs -f 로 로그 보고 에러 찾아서 고쳐주고 docker-compose down 후 다시 해보면 될 것!

728x90
반응형

'현대 오토에버 클라우드 스쿨' 카테고리의 다른 글

Docker Swarm  (2) 2025.06.26
Docker Swarm  (1) 2025.06.25
도커 네트워크와 docker-compose를 이용한 2개의 컨테이너 연동  (1) 2025.06.24
Docker compose  (0) 2025.06.23
Git Action  (1) 2025.06.23