[Nginx] Load Balancer

반응형

이번글에서는 Nginx의 Load Balancer를 사용해 traffic을 분산시키는 방법에 대해 알아보도록 하겠습니다.

1. Load Balancer란?

multiple client의 request를 multiple server에 distribute해 각 서버별 load를 분산시키는 기능입니다.

만약 load balancer에 연결된 server 중 특정 server가 down 되는 경우, 해당 server로의 traffic을 가용한 server로 redirect 합니다. (redundancy)

load balancer는 이전 글에서 살펴본 reverse proxy와 함께 사용됩니다. 😎

2. Setting Load Balancer

Nginx에 load balancer를 적용해보겠습니다.

먼저, 아래와 같이 3개의 PHP 서버가 구동중이라고 가정하겠습니다.

nginx.conf를 아래와 같이 수정해 3개의 PHP 서버를 load balancer로 연결합니다. load balancer는 upstream 블럭안에 작성합니다.

nginx.conf

events {}

http {
    upstream php_servers {
            # set load balancer servers
            server localhost:10001;
                server localhost:10002;
            server localhost:10003;
        }

        server {

                listen 8888;

                location / {
                      # proxy pass to load balancer
                      proxy_pass http://php_servers;
                }

        }
}

reload 후 아래의 명령어를 사용해 0.5초에 한번씩 Nginx에 request를 보내보겠습니다.

while sleep 0.5; do curl http://localhost:8888; done

위와 같이 traffic이 3개의 PHP 서버로 분산되는 것을 확인할 수 있습니다. 👏👏👏

3. Load Balaner Options

이번에는 load balancer의 traffic distribute 규칙을 변경해보겠습니다.

3-1) Sticky Sessions

기본적으로 load balancer는 reqeust traffic을 round robin 방식으로 분배합니다. 이를 변경해 session 별로 traffic을 분배하고 싶으면 Sticky Session 방식을 사용할 수 있습니다.

round robin은 프로세스들 사이에 우선순위를 두지 않고, 순서대로 server를 할당하는 방식의 스케줄링 알고리즘입니다.

Sticky Sessions을 적용하면, load balancer는 동일한 ip address가 요청한 request는 항상 동일한 server로 할당합니다.

이를 적용하기 위해 nginx.conf를 아래와 같이 수정합니다.

nginx.conf

events {}

http {
    upstream php_servers {
            # use sticky session
            ip_hash;
            # set load balancer servers
            server localhost:10001;
                server localhost:10002;
            server localhost:10003;
        }

        server {

                listen 8888;

                location / {
                      # proxy pass to load balancer
                      proxy_pass http://php_servers;
                }

        }
}

이후 아래의 명령어를 수행하면 이전의 결과와는 다르게 계속 동일한 서버에만 request를 분배하는 것을 확인할 수 있습니다.

while sleep 0.5; do curl http://localhost:8888; done

3-2) Least Number of Active Connections

만약 성능을 고려해 현재 connections이 가장 적은 server로 reqeust를 분배하고 싶을 경우 least_conn을 사용할 수 있습니다.

nginx.conf를 아래와 같이 수정합니다.

nginx.conf

events {}

http {
    upstream php_servers {
            # use least connection
            least_conn;
            # set load balancer servers
            server localhost:10001;
                server localhost:10002;
            server localhost:10003;
        }

        server {

                listen 8888;

                location / {
                      # proxy pass to load balancer
                      proxy_pass http://php_servers;
                }

        }
}

reload 후 확인해보면, 가장 connection이 적은 server로 request를 분배하는 것을 확인할 수 있습니다.


참고 자료 : https://www.udemy.com/course/nginx-fundamentals/


반응형

'Nginx' 카테고리의 다른 글

[Nginx] Reverse Proxy  (0) 2020.08.31
[Nginx] Let's Encrypt - SSL Certificates  (0) 2020.08.31
[Nginx] Hardening Nginx  (0) 2020.08.31
[Nginx] Basic Auth  (0) 2020.08.31
[Nginx] Rate Limiting  (0) 2020.08.31

댓글

Designed by JB FACTORY