[Nginx] - HTTP 로드 밸런싱

오동훈·2023년 3월 20일
1

AWS Cloud

목록 보기
7/7

1. 로드 밸런싱

우선 Nginx는 Proxy server 역할도 있지만, Load Balancing 역할도 할 수 있습니다.

사용해보고 싶었던 기술 중 자동적인 Nginx Health Check는 Nginx Plus 버전에서만 사용 가능하다고 합니다.

하지만 Health Check를 수동으로 체크하는 방법 또한 있습니다!

여기서는 HTTP 로드 밸런싱에 대해 알아보겠습니다!

1. upstream 모듈에 등록

upstream : 업스트림 서버는 Nginx를 통해 트래픽을 분산할 서버 그룹을 의미합니다.
backend : 서버 그룹을 의미하고, 이름을 backend로 지정했습니다. 다른 이름을 붙여주셔도 상관 없습니다.
server : 각각의 서버를 등록할 때, 맨 앞에 사용하는 지시자입니다.

아래와 같이 입력하게 되면 균등하게 oddong1 -> oddong2 -> oddong3 순서대로 트래픽이 분산됩니다.

upstream backend {
    server oddong1.example.com;
    server oddong2.example.com;
    server oddong3.example.com;
}

1. weight

weight : 로드 밸런싱 가중치 default = 1

여기서 6개의 트래픽이 날라온다고 가정해보면, 5개는 1번 서버로, 나머지 1개는 2번 서버로 트래픽이 분산됩니다.
그리고 만약 1, 2번 서버가 다운되면 그 때 backup으로 설정해놓은 서버에 트래픽이 이동되게 됩니다.

upstream backend {
    server oddong1.example.com weight=5; # 다른 서버보다 5배의 트래픽을 할당받는다.
    server oddong2.example.com;
    server oddong3.example.com;
}

2. backup

backup : 백업 서버로 할당됨. 앞의 두 개의 서버가 다운되지 않는 한 트래픽을 할당받지 않는다.

여기서 만약 1, 2번 서버가 다운되면 그 때 backup으로 설정해놓은 서버에 트래픽이 이동되게 됩니다.

upstream backend {
    server oddong1.example.com weight=5; # 다른 서버보다 5배의 트래픽을 할당받는다.
    server oddong2.example.com;
    server oddong3.example.com backup;
}

2. proxy_pass

모든 웹 트래픽은 위에서 설정한 backend 서버 그룹으로 흘러가고, Nginx는 로드 밸런싱을 위한 Proxy server 역할을 할 것이기 때문에 다음과 같이 설정해주면 됩니다.

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

3. 수동으로 Health check

max_fails : 헬스 체크의 최대 실패 횟수
fail_timeout : 실패에 대한 타임아웃

다음 예는 Nginx가 서버에 요청을 보내지 못하거나 10초 동안 3번의 응답을 받지 못하면 서버를 30초 동안 사용할 수 없는 것으로 표시됩니다.

upstream backend {
    server oddong1.example.com max_fails=3 fail_timeout=10s;		# A
    server oddong2.example.com max_fails=3 fail_timeout=10s;		# B
    server oddong3.example.com backup;								# C
}

4. 전체

upstream backend {
    server oddong1.example.com weight=3;		# A
    server oddong2.example.com;					# B
    server oddong3.example.com backup;			# C
}

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

아래 사진은 테스트해보면서 느꼈던 건뎅 그냥 같이 총총,,

2. 로드 밸런싱 기법

1. Round Robin(라운드 로빈)

트래픽을 각 서버들에게 균등하게 나누어 배분하는 기법입니다.

특정 서버에 트래픽을 더 전달하고 싶다면 앞서 얘기한 weight 속성을 사용하면 됩니다.

만약 보내고 싶지 않다면 down 변수를 사용해 트래픽을 할당하지 않는 방법 또한 있습니다.

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

or 

upstream backend {
   # no load balancing method is specified for Round Robin
   server oddong1.example.com weight=5;
   server oddong2.example.com;
}

or

upstream backend {
   # no load balancing method is specified for Round Robin
   server oddong1.example.com weight=5;
   server oddong2.example.com down;
}

2. Least Connection

트래픽을 받은 시점에 활성화된 connection이 제일 적은 서버에게 트래픽을 분산하는 기법입니다.

upstream backend {
    least_conn;
    server oddong1.example.com;
    server oddong2.example.com;
}

3. IP Hash

클라이언트 IP의 해시 값으로 트래픽을 분산시키는 기법입니다. 동일한 클라이언트의 요청은 동일한 서버에게 전달됩니다.

IPv4는 첫 3자리로 해시값을 구하기에 같은 대역의 클라이언트는 같은 서버에게 트래픽이 할당됩니다.

upstream backend {
    ip_hash;
    server oddong1.example.com;
    server oddong2.example.com;
}

4. Generic Hash

사용자가 설정한 다양한 변수를 조합해 트래픽을 분산하는 방법입니다. 예를 들어 요청하는 웹 페이지의 URL이나, 사용자의 IP 주소와 포트 번호의 조합, 일반적인 문자열, 변수의 조합 등 다양합니다.

upstream backend {
    hash $request_uri consistent;
    server oddong1.example.com;
    server oddong2.example.com;
}

참고자료 📩

Nginx Health check
Nginx load balance 잘 설명해준 블로그

profile
삽질의 기록들🐥

0개의 댓글