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

김지원·2021년 8월 17일
2

nginx

목록 보기
4/5
post-thumbnail

서버의 과부하로 인한 shutdown을 막기 위해 웹서버로 이용하고 있는 Nginx를 로드밸런서로 사용하고자 알아보았습니다.

  • 먼저 저는 nodejs(express)로 서버가 이루어져 있고 앞단과 뒷단에 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에서만 사용이 가능하다.
  2. HAProxy
    • 오픈소스 소프트웨어
    • 여러 로드밸런싱 기능을 지원한다.

3. Nginx로 로드밸런싱 구현

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

필자는 Ubuntu를 사용하고 있어 그 기준으로 적도록 하겠다.

/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개의 서버로 로드밸런싱이 진행된다.
  • 필자는 최소 연결된 서버를 찾아 요청 받는 방식인 알고리즘을 사용했다.
  • 이제 nginx를 재가동 시켜주면 된다.

service nginx reload

🔮 알고리즘 종류

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

참고 & 출처

profile
backend-developer

0개의 댓글