로드밸런싱의 기본적인 방식으로는 Scale UP과 Scale Out 방식이 있다. Scale Up 방식은 수직적 확장이며 한대의 리소스를 성능적으로 높이는 방법이다. Scale Out은 수평적 확장으로 여러대로 확장하는 방식이다. 소프트웨어 기반 인프라는 Scale Out에 유연한 특징을 가지고 있다.
부하를 분산하여 고가용성(HA)을 보장하는 시스템을 부하분산 (load Balncing)이라 한다. Nginx에서는 TCP, UDP, HTTP에 대해 부하 분산 기능을 제공한다.
상태가 있는 경우 Nginx는 쿠키나 라우팅을 추적해 부하분산을 처리하는 방법을 사용한다. 스티키 관련 기능을 제공한다. 세션 혹은 세션을 사용하지 않더라도 웹소켓등을 사용 중이라면 이를 고려하여 설계해야 한다. Nginx는 Sticky관련 기능을 통해 설계 선택지를 제공해 준다.
이밖에도 Nginx는 Upstream서버의 상태를 감지하고 오류시 중단하는 기능(헬스 체크)을 포함한다. Passive방식과 Active방식을 제공하며 Active는 Nginx plus에서 제공한다. Active는 주기적으로 연결을 시도, 요청을 하여 응답을 체크하여 헬스체크를 한다.
알고리즘
Round Robin
기본 설정으로 순차적으로 요청을 분산한다. 업스트림 서버가 동일한 사양일 때 적합하며 가중치를 두어 특정 업스트림 서버에게 많은 요청을 분산시킬 수 있다.
LeastConnection
활성 연결 수가 가장 적은 서버에 새로운 연결을 보내는 방식이다. 세션의 지속성이 중요하고 일부 서버가 다른 서버보다 더 높은 성능을 제공할 때 유용하다. least_conn
지시자를 이용하여 설정 가능하다.
IP Hash
IP주소를 사용하여 해시를 하고 이를 바탕으로 특정 서버에 요청을 할당한다. HTTP에서만 사용 가능하며 사용자의 세션을 특정 서버에 지속적으로 유지해야 할 경우 유리하다. 안정 해시와 같은 방식으로 부하를 분산시키는 방법은 자주 쓰이는 방식이다.
Generic Hash
사용자 정의 키를 기반으로 해시를 생성하여 요청을 서버에 분산한다. 수신한 요청의 해시를 생성하고 업스트림 서버 선택에 활용하여 부하를 분산하는 방식이다. 요청을 처리할 서버를 선택하는데 중요할 때나 캐시가 있을 확률이 높은 서버로 요청을 전달하려 할 때 매우 유리하다. hash지시자를 사용한다.
Random
랜덤으로 요청을 분산한다. upstream 풀에 지정된 서버를 임의로 보낸다. random
지시자를 사용한다.
부하분산
HTTP LoadBalancing
upstream backend {
server 10.10.12.45:80 weight=1;
server app.example.com:80 weight=2;
server spare.example.com:80 backup;
}
server {
location / {
proxy_pass http://backend;
}
}
80번 포트를 사용하는 두대의 서버로 부하를 분산하는 설정
두대 모두 불가능하면 backup을 사용한다.
weight는 생략 가능하며 기본값은 1이다.
TCP LoadBalancing
stream 모듈을 이용해 TCP를 사용한 서버에 부하를 분산하는 방법이다./etc/nginx/stream.conf.d/example.conf
stream{
upstream backend_servers {
server backend1.example.com:12345;
server backend2.example.com:12346;
}
server {
listen 1234; # 외부 접근 포트
proxy_pass backend_servers;
}
}
1234 포트로 요청을 받아 해당 서버로 부하를 분산하는 예시 설정 파일이다.
etc/nginx/nginx.conf
...
http{
기존 내용
}
include /etc/nginx/stream.conf.d/*conf;
다음과 같은 예시로 여러 설정파일을 기본 설정 파일에 include 할 수 있다.
설정 뒤에는
sudo nginx -s reload
해당 명령어를 수행하여 무중단 설정 업데이트를 한다. nginx의 장점 중 하나로 설정을 무중단으로 업데이트하는 것을 지원한다.
기존의 Worker프로세스가 수행하던 작업을 마무리하고 순차적으로 업데이트된 설정을 적용한다.
UDP 부하 분한
stream{
upstream backend_servers {
server backend1.example.com:12345;
server backend2.example.com:12345;
server backend3.example.com:12345;
}
server {
listen 1234 udp;
proxy_pass backend_servers;
}
}
TCP와 동일하게 stream
모듈로 부하분산을 설정한다. TCP와는 다른 점으로 UDP를 직접 지정한다는 점이 다르다. 비연결지향 프로토콜이기 때문에 proxy_response
의 지시자를 추가로 지원한다. upstream으로부터 수신할 것으로 예상되는 응답을 지정한다. nginx plus에서만 지원한다.
예시로
stream {
upstream backend_servers {
server backend1.example.com:12345;
server backend2.example.com:12345;
}
server {
listen 1234 udp;
proxy_pass backend_servers;
proxy_responses 1;
proxy_timeout 10s;
}
}
다음과 같이 백엔드로부터 하나의 응답을 기다릴 때 다음과 같이 지정한다. 만약 이 지시자가 없다면 timeout이 지정된 시간이 될 때까지 계속 응답을 처리한다.
'Infra > Nginx' 카테고리의 다른 글
Nginx LoadBalancing 2 (0) | 2024.06.20 |
---|---|
Nginx 기본 (0) | 2024.03.27 |
댓글