woowacourse-study / talteco

"조조그린"의 면접 스터디
3 stars 0 forks source link

로드 밸런싱이란? #64

Open ldk980130 opened 2 years ago

ldk980130 commented 2 years ago

로드 밸런서란

로드 밸런싱을 통해 많은 인터넷 트래픽을 여러 웹 서버로 분산시킬 수 있다.

로드 밸런서를 적용하는 이유

  1. 하나의 서버에서 감당할 수 없는 트래픽이 발생하는 것을 n대의 서버에게 분산시켜 서버의 자원이 고갈되는 것을 방지할 수 있다.
  2. WAS가 SPOF가 되는 것을 방지할 수 있다.
    1. SPOF - a part of a system that, if it fails, will stop the entire system from working

사실 토이 프로젝트 등에선 로드 밸런싱을 적용할 만큼의 트래픽이 나오지 않는 것이 사실이다. 하지만 WAS가 한 대 뿐이라면 그 WAS가 어떤 원인이든 죽어버리면 전체 서비스 장애로 이어진다. 이를 해결하기 위해 스케일 아웃을 해서 적어도 2대의 WAS가 있는 편이 안전하다고 판단했다.

로드 밸런서 종류

L4 Load Balancer

L7 Load Balancer

[HAProxy]

[ALB(Application Load Balancer)]

NGINX로 로드 밸런싱? Nginx를 로드 밸런서로 사용하는 이유는 간단하고 저렴하기 때문이다. L4, L7 스위치 등은 하드웨어로 구성해야하며 가격이 비싸다. 반면 Nginx를 사용하면, 서버에 소프트웨어만 설치하면 되므로 시간과 비용이 절약된다. https://hudi.blog/load-balancing-with-nginx/

NGINX 로드 밸런싱 설정

http {
    upstream backends {
        server backend1.example.com;
        server backend2.example.com;
        server 192.0.0.1 backup;
    }

    server {
        location / {
            proxy_pass http://backends;
        }
    }
}

로드 밸런싱 알고리즘

라운드 로빈

upstream backend {
   # no load balancing method is specified for Round Robin
   server backend1.example.com;
   server backend2.example.com;
}

Least Connections (가중 라운드 로빈)

upstream backend {
    least_conn;
    server backend1.example.com;
    server backend2.example.com;
}

IP Hash

upstream backend {
    ip_hash;
    server backend1.example.com;
    server backend2.example.com;
}
upstream backend {
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com down;
}

Generic Hash

요청이 들어오는 서버가 사용자 정의 키에 의해 결정된다. 사용자 정의 키에는 문자열, 변수 등의 조합이 될 수도 있다.

upstream backend {
    hash $request_uri consistent;
    server backend1.example.com;
    server backend2.example.com;
}

Least Time (NGINX Plus only)

각 요청에 대해 NGINX Plus가 최소 평균 지연 시간과 최소 활성 커넥션을 가진 서버를 선택한다.

upstream backend {
    least_time header;
    server backend1.example.com;
    server backend2.example.com;
}

최소 지연 시간은 다음 세 변수에 의해 계산이 달라진다.

Random

각 요청이 무작위로 서버로 전송된다.

two 매개변수가 정의된 경우, NGINX는 서버 가중치를 고려하여 무작위로 2개의 서버를 선택한 뒤 아래 방법을 사용하여 서버 하나를 선택한다.

upstream backend {
    random two least_time=last_byte;
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
    server backend4.example.com;
}
jojogreen91 commented 2 years ago