Post

Nginx를 이용한 로드밸런싱

로드밸런싱을 하게 된 이유

CPU 사용률 모니터링 결과 스레드, 커넥션 등 여러 최적화 작업을 했음에도 서버 부하테스트의 결과 현재 서버 1개만으로는 목표로하는 트래픽을 감당할 수 없음이 드러났다. 따라서 스케일아웃 으로 서버의 갯수를 늘리고 로드밸런싱을 통해 트래픽을 적절히 분산해주는 방법을 사용하기로 하였다. 다중 서버 환경에서 한 서버에 트래픽이 몰리지 않도록 트래픽을 적절히 분산해주는 작업을 로드밸런싱이라고 한다.

클라우드 환경에서 Nginx를 이용해서 로드밸런싱 환경을 구축하는 과정을 정리해본다. Nginx를 사용해서 로드밸런싱을 수행하는 이유는 사용법이 간단하고 비용이 저렴하기 때문이다. L4, L7 스위치는 직접 장비를 사야하는 등 개인 서버를 운영하는 입장에서는 부담이 크다. Nginx는 소프트웨어만 다운로드 받고 필요한 설정정보만 입력하면 편리하게 운영할 수 있다.

Nginx 로드밸런싱 구현

도메인 등록

로드밸런서가 트래픽을 분산할 두개의 인스턴스를 새로만들고 도메인 주소를 할당해줍니다.

  • dev1.gongnomok.site
  • dev2.gongnomok.site

Nginx 설정정보 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
upstream gongnomok-dev-cluster {
    server dev1.gongnomok.site:8080; # gongnomok-dev-1
    server dev2.gongnomok.site:8080; # gongnomok-dev-2
}

server {
    listen 80;
    server_name dev.gongnomok.site;

    location / {
        return 301 https://dev.gongnomok.site$request_uri;
    }
}

server {
    listen 443 ssl;
    server_name dev.gongnomok.site; 

    ssl_certificate /etc/secret/fullchain-dev.pem; # managed by Certbot
    ssl_certificate_key /etc/secret/privkey-dev.pem; # managed by Certbot
    include /etc/secret/options-ssl-nginx.conf; # managed by Certbot

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        try_files $uri $uri/ /index.html;
    }

	location /api {
        proxy_pass http://gongnomok-dev-cluster;
    }

    location /actuator {
        proxy_pass http://gongnomok-dev-cluster;
    }
}

접속확인

  • 사이트에 요청을 보내면 로드밸런서가 요청을 분산시켜 응답을 받아오는 것을 확인할 수 있습니다.
  • 또한 모니터링 툴에서도 두개의 인스턴스를 인식하는 것을 확인할 수 있습니다.

로드밸런싱 알고리즘

로드밸런서가 트래픽을 어떤 알고리즘으로 분산시킬지 설정한다.

RR(Round Robin)

아무런 설정도 하지 않았을 때 RR 알고리즘이 기본값으로 적용됩니다.

1
2
3
4
upstream gongnomokcluster {
    server 111.111.111.111:8080;
    server 222.222.222.222:8080;
}

Least Connections

연결 횟수가 가장 적은 서버로 연결되는 알고리즘입니다.

1
2
3
4
5
upstream gongnomokcluster {
    least_conn;
    server 111.111.111.111:8080;
    server 222.222.222.222:8080;
}

IP Hashing

클라이언트 IP를 해싱해서 나온 결과값으로 요청을 전달할 서버를 결정하는 방식입니다. 하나의 클라이언트는 언제나 같은 서버로 연결되기 때문에 Stick Session 방식처럼 동작하도록 할 수 있습니다.

1
2
3
4
5
upstream gongnomokcluster {
    ip_hash;
    server 111.111.111.111:8080;
    server 222.222.222.222:8080;
}

Generic Hash

사용자가 정의한 다양한 변수를 조합해서 트래픽을 분산하는 알고리즘입니다. 아래의 예시는 요청 URI정보를 사용해서 나온 해시 결과값으로 요청을 전달할 서버를 결정하는 방법입니다.

1
2
3
4
5
upstream gongnomokcluster {
    hash $request_uri;
    server 111.111.111.111:8080;
    server 222.222.222.222:8080;
}

Random

트래픽을 무작위로 분산하는 알고리즘입니다.

1
2
3
4
5
upstream gongnomokcluster {
    random;
    server 111.111.111.111:8080;
    server 222.222.222.222:8080;
}

더 자세한 내용은 Nginx HTTP 로드밸런싱 공식문서에 나와있습니다.

server지시어 파라미터

server 지시어에 여러가지 파라미터를 붙여서 로드밸런싱의 디테일한 부분을 설정할 수 있다.

weight

1
2
3
4
upstream gongnomokcluster {
    server 111.111.111.111:8080; weight=2;
    server 222.222.222.222:8080;
}

weight는 특정 서버에 가중치를 주는 파라미터이다. 가중치가 설정된 서버는 가중치의 배수만큼 트래픽을 더 전달받는다. 111.111.111.111 서버는 다른 서버에 비해 2배 더많은 트래픽을 전달받게 된다.

max_conns

1
2
3
4
upstream gongnomokcluster {
    server 111.111.111.111:8080; weight=256;
    server 222.222.222.222:8080;
}

max_conns 파라미터는 서버와의 최대 동시 연결수를 제한하는 파라미터이다.

max_fails

1
2
3
4
upstream gongnomokcluster {
    server 111.111.111.111:8080; max_fails=5;
    server 222.222.222.222:8080;
}

max_fails 파라미터는 서버와의 연결이 주어진 수만큼 실패했을 때 다른 서버로 트래픽을 전달하기위한 파라미터이다.

fail_timeout

1
2
3
4
upstream gongnomokcluster {
    server 111.111.111.111:8080; fail_timeout=30;
    server 222.222.222.222:8080;
}

fail_timeout 파라미터는 서버와 값의 초단위만큼 기다렸는데도 연결되지 않으면 다른 서버로 트래픽을 보내기위한 파라미터이다.

down

1
2
3
4
upstream gongnomokcluster {
    server 111.111.111.111:8080; fail_timeout=30;
    server 222.222.222.222:8080;
}

down 파라미터가 설정되면 해당 서버로는 트래픽이 분산되지 않는다.

더 자세한 내용은 마찬가지로 [Nginx 공식문서]를 참고하자.

Reference

This post is licensed under CC BY 4.0 by the author.