[Nginx] 로드밸런싱 개념 및 구축 - 1

parkjh9370·2022년 6월 4일
0

Nginx?

  • 리버스 프록시, 로드 밸런싱과 같은 역할을 수행하는 웹 서버

1. 로드밸런싱이란?

간단하게 설명하면 서버가 부담하는 부하를 분산해주는 장치 혹은 기술이다.

사업의 규모가 커지고 사용자가 늘게 되면 서버가 부담하는 부하가 늘게 되고 자잘한 에러가 생기거나 서버가 다운될 수 도 있다. 그럴때 이제 백엔드 개발자는 고민이 생긴다.

🤔 많은 트래픽을 어떻게 대처할까?

  • 크게 두가지로 나타낼 수 있다.
  1. Scale up: 기존 서버의 성능을 높인다 (비용도 같이 올라간다)
  2. Scale out: 여러 대의 서버를 두어 트래픽을 분산시킨다.(물리적 or 논리적)
    여기서 필자는 비용적인 부분을 생각해 논리적인 Scale out 방식을 생각했다.
    🔮 Scale out을 하기 위해서 무조건 해야 하는 일이 로드밸런싱이다!
  • 트래픽을 감당하는 장점 이외의 장점
    🏃‍♂️ 무중단 서비스 & 배포

서버는 갑자기 다운될 수도 있고 배포를 하게 되면 다운이 된다.
당연스럽게도 여러 대의 서버로 나누게 되면 하나의 서버가 다운되어도 실제 클라이언트는 알 수 없다.
⭐ 주의: 이것은 알고리즘에 따라 달라질 수 있다!!


2. 로드밸런싱의 종류

1. 하드웨어에서의 로드밸런싱

L2, L4, L7 로드밸런싱이 있다.
그 중에 L4와 L7 로드밸런싱이 가장 많이 사용되기 때문에 두 종류만 다뤄보도록 하겠다.

1. L4 로드밸런싱

  • 네트워크 계층 layer4(전송)에서 실행
  • TCP/UDP 포트 정보를 바탕으로 진행
  • 데이터 안을 보지 않고 패킷 레벨에서만 진행
    - 속도 빠르고 효율 높다
    - 데이터 내용을 부호화하지 않아 안전하다
    - L7보다 저렴하다
  • 사용자의 IP가 수시로 바뀌는 경우 연속적인 서비스 제공이 어렵다.

2. L7 로드밸런싱

  • 네트워크 계층 layer7(응용)에서 실행
  • TCP/UDP + HTTP의 URI, FTP 파일명, 쿠키 정보 등을 바탕으로 진행
  • 캐싱 기능을 제공
  • 상세한 라우팅이 가능
  • 비정상적인 트래픽은 사전에 필터링 > 안전성 높아짐
  • 비용은 L4보다 높다.

2. 소프트웨어에서의 로드밸런싱

기본적으로 Reverse Proxy를 기반으로 동작한다.

로드밸런싱만을 위해 개발된 프로그램이 아니기 때문에 기본적인 로드밸런싱의 기능만이 있지만 그만큼 비용적으로 저렴하고 구축이 쉽다는 장점이 있다.

1.Nginx

  • 오픈소스 소프트웨어
  • 특정 알고리즘은 Nginx Plus에서만 사용이 가능하다.
  1. HAProxy
  • 오픈소스 소프트웨어
  • 여러 로드밸런싱 기능을 지원한다.

3. Nginx로 로드밸런싱 구현

  1. nginx 설정파일 찾기(nginx.conf) : /etc/nginx/nginx.conf

  2. 로드밸런싱 설정 파일 추가

http {
	include /etc/nginx/site-enabled/*;
}
  • http단에서 include로 파일을 불러와 설정을 하게 되어있다.
  • 그래서 site-enabled 폴더 안에 새로운 파일을 만들어 추가해주도록 한다.

전체 경로

/etc/nginx/site-enabled/파일 이름

👨‍💻 추가할 데이터

upstream backend {  // backend자리에 이름
    least_conn;     //알고리즘을 적어준다. (기본: 라운드 로빈)
    server localhost:8801; 
    server localhost:8802; //클라이언트가 Nginx로 요청 시
    server localhost:8803; //우회시켜줄 Server 정보
}

server {
  listen 80; //클라이언트가 요청하는 포트
  
  location / {
    proxy_set_header Host $host; //클라이언트의 호스트 설정
    proxy_set_header Connection ""; //upstream서버를 사용하겠다 지정(⭐중요)
    proxy_pass http://backend; //설정한 이름으로 요청 보내기
  }
}

80번 포트에 요청이 들어오면 8801~8803포트(예시)에 열려있는 3개의 서버로 로드밸런싱이 진행된다.
필자는 최소 연결된 서버를 찾아 요청 받는 방식인 알고리즘을 사용했다.

🔮 알고리즘 종류

방법설명
라운드로빈(기본값)요청을 순서대로 처리한다.
least_conn(최소 연결)각 요청을 서버에 할당된 가중치를 고려해 연결 수가 가장 적은 서버로 전송
ip_hash요청이 클라이언트 IP주소로 해싱 > 한번 요청 받은 서버가 있을 때 해당 서버에만 요청을 분배
least_time연결 수가 가장 적으면서 평균 응답시간이 가장 적은 쪽을 선택해서 분배 (Nginx Plus에서만 가능)

참고 & 출처

0개의 댓글