# nginx Load Balancing
애플리케이션 성능 향상, 대규모 애플리케이션 제공, 컨테이너 및 microservices 배포를 위한 기본 도구
Load Balancing 기술은 nginx에서는 4가지 nginx Plus에서는 5가지 기술을 제공하고 있음
nginx
Round robin, Hish, IP Hash, Least connections 총 4가지 Load Balancing 기술을 제공
nginx Plus
Least Time 한 가지를 더 제공하여 총 5가지 Load Balancing 기술을 제공
# upstream
TCP Load Balancing에서 사용되는 태그로 http context 내에서 사용
1. server 블록에서 사용자가 정의한 특정 트래픽을 수신 대기하는 가성 서버를 정의
2. 이를 지정된 upstream 서버 그룹에 Proxy
upstream test {
server was1;
server was2;
}
server {
listen 80;
server_name localhost;
# 192.168.56.xxx와 같은 real ip / www.test123.co.kr과 같은 도메인 네임이 들어갈 수 있음
location / {
proxy_pass http://test;
# 어떤 upstream 서버로 요청을 분기할지 작성
}
}
① Round Robin
nginx / nginx Plus 모두에 포함되어 있는 Load Balancing 기술
upstream 서버 목록을 순차적으로 실행하여 다음 연결 요청을 각 서버에 차례대로 할당
upstream test {
server was1;
server was2;
}
server {
listen 80;
server_name www.test123.co.kr;
location / {
proxy_pass http://test;
}
}
최초 요청은 was1로 proxy 하고 두 번째 요청은 was2로 proxy, 세 번째 요청은 다시 was1로 proxy
→ upstream에 선언되어 있는 서버들에게 요청을 순차적으로 분기
② Hash
nginx / nginx Plus 모두에 포함되어 있는 Load Balancing 기술
사용자가 지정한 텍스트 및 nginx 변수의 조합을 기반으로 hash를 계산하고 해당 hash를 upstream에 선언된 서버 중 하나와 연결
upstream test {
hash $scheme$request_uri;
server was1;
server was2;
}
server {
server_name www.test123.co.kr;
location / {
proxy_pass http://test;
}
}
③ IP Hash
HTTP에서만 사용 가능하며 Client IP 주소를 기반으로 Hash를 설정
upstream test {
ip_hash;
server was1;
server was2;
}
server {
server_name www.test123.co.kr;
location / {
proxy_pass http://test;
}
}
Client에 IPv6 주소가 있는 경우 Hash는 전체 주소를 기반으로 하며 IPv4 주소가 있는 경우에는 주소의 처음 3욱텟만을 기반으로 함
이는 서브넷 범위 즉, /24에서 동적으로 IP 주소를 할당받는 ISP 클라이언트에 최적화되도록 설계
동일한 주소에서 온 요청이 동일한 서버에 도달하도록 보장하는 Load Balancing 방법
④ Least Connections
Load Balancer가 각 서버에 대한 현재 활성화된 연결 수를 비교하여 연결이 가장 적은 서버로 요청을 proxy
Least Connections은 가장 광범위하게 사용되는 사례로 다양한 production 트래픽에 적합한 Load Balancing 방법
각 서버의 용량에 따라 트래픽을 효과적으로 분산
upstream test {
least_conn;
server was1;
server was2;
}
server {
server_name www.test123.co.kr;
location / {
proxy_pass http://test;
}
}
→ 연결 수에 비례하여 Request를 각 서버로 고르게 분해 (동일한 서버 환경이기 때문에 번갈아 가며 각 서버에 요청을 분배)
⑤ Least Time
nginx Plus에서만 사용 가능한 Load Balancing 방법
평균 응답 시간을 포함하여 서버의 최근 성능 기록을 고려하여 요청을 proxy
upstream 서버의 평균 응답 시간이 매우 다른 경우에 특히 적합
upstream test {
least_time (header | last_byte);
server was1;
server was2;
}
server {
server_name www.test123.co.kr;
location / {
proxy_pass http://test;
}
}
# 서버 가중치 설정
서버 가중치 설정이 적절치 않을 경우 성능이 낮은 서버는 과부하에 걸리고 성능이 높은 서버는 전체적 또는 부분적으로 유휴 상태가 될 수 있음
가중치 설정을 위해서는 upstream 블록 내의 server 지시문에 weight 매개변수를 포함시켜야 함
upstream test {
server was1 weight=6;
server was2 weight=3;
server was3;
}
① Round Robin
각 서버는 들어오는 요청의 가중치를 가중치의 합으로 나눈 값과 동일한 비율을 가져옴
ex) 요청이 10건인 경우 → was1 : 6건 / was2 : 3건 / was3 : 1건
② Hash, IP Hash
가중치가 없는 경우에는 Hash 알고리즘은 가능한 모든 Hash 값 집합을 Upstream 그룹의 각 서버에 대해 하나씩 Bucket 으로 균등하게 분배
가중치를 사용하면 가중치를 합산하여 가능한 Hash 집합을 해당 수의 Bucket으로 나누고 각 서버를 가중치에 해당하는 Bucket 수와 연결
ex) 요청이 10건인 경우 → was1 : 6 bucket / was2 : 3 bucket / was3 : 1 bucket
③ Least Connections, Least Time
해당 Load Balancing 알고리즘들은 가중치 없이도 서버 용량에 따라 부하를 분산하는데 매우 효과적임
여기서 가중치를 추가로 설정할 경우 관련 성능이 훨씬 향상
해당 알고리즘들은 각 요청을 가장 낮음 점수를 가진 서버로 보내게 됨
따라서 가중치를 할당하면 각 서버의 점수를 가중치로 나눈 후 다시 가장 낮은 값을 가진 서버로 요청을 proxy
was1의 점수가 100으로 가장 낮으며 연결 수가 600으로 가정할 경우
was 1 -> 연결 수 600 / 6 = 100점
was 1 -> 연결 수 400 / 3 = 133점
was 1 -> 연결 수 120 / 1 = 120점
was1이 연결 수가 600으로 가장 많은 연결을 유지하고 있지만 점수가 100점으로 가장 낮기 때문에
요청을 받게 됨
참조 문헌
https://nginxstore.com/blog/nginx/nginx-load-balancing-%EC%82%AC%EC%9A%A9-%EC%82%AC%EB%A1%80/
'WEB > NGINX' 카테고리의 다른 글
13: Permission denied while connecting to upstream (0) | 2024.07.30 |
---|---|
nginx & WAS 연동 (0) | 2024.07.30 |
nginx ssl 설정 (0) | 2024.07.29 |
nginx.conf (2) (0) | 2024.07.29 |
nginx.conf (1) (0) | 2024.07.26 |