스케일 아웃과 로드밸런싱

JeongMin·2024년 7월 4일
0
post-thumbnail

진행 중인 서비스의 규모가 커졌을 때, 많은 유저의 요청을 처리하기 위해서 서버의 스펙을 향상해야 하는 경우가 발생합니다.

서버의 스펙을 향상하는 방법으로 Scale upScale out이 있습니다.


Scale-up과 Scale-out

  • 수직 확장(Scale up)

수직 확장(Scale up)은 서버의 스펙을 향상하여 업그레이드 하는 방식을 뜻합니다.

이러한 방식은 간편하게 서버의 안정성을 키울 수 있다는 장점이 있습니다.

또한, 하나의 서버만 운영하면 되기 때문에 여러 서버를 클러스팅하고 데이터의 일관성을 고려하지 않아도 됩니다.

하지만 서버의 스펙을 업그레이드하는 것에 대한 비용적인 문제와 무한정으로 업그레이드 할 수 없는 기술적 한계에 봉착하게 됩니다.

그리고 하나의 서버에 부하가 집중되기 때문에 서버가 다운될 수 있는 문제점이 발생합니다.

하나의 서버가 다운될 경우, 전체 서비스에 영향을 주기 때문에 치명적입니다.

  • 수평 확장(Scale out)

수평 확장(Scale out)은 서버를 여러 개로 구성하는 것을 의미합니다.

수평 확장은 수직 확장의 단점을 개선할 수 있는 특징이 있습니다.

수직 확장의 서버 스펙 향상에는 한계가 있는 반면에, 수평 확장은 이론상 제한없이 확장을 할 수 있습니다.

그리고 서버가 여러 개로 구성되어 하나의 서버에서 장애가 발생하더라도 전체 서비스에 영향을 주지 않습니다.

또한, 예측하기 힘든 유저의 수를 수평 확장을 통해 유연하게 대처할 수 있습니다.

하지만 여러 서버를 하나의 서버처럼 운용하기 위한 클러스터링 작업에 비용이 발생하고 기술적인 어려움이 있습니다.


수직 확장(Scale up)의 단점을 개선할 수 있고 유연하게 설계할 수 있다는 장점을 가지고 있어 수평 확장(Scale out)을 적용해 보겠습니다.


Nginx

서버를 Scale out 하면 하나의 서버에 부하가 몰리지 않도록 부하를 적절히 분산해야 서버가 안정적으로 운영될 수 있습니다.
이러한 작업을 로드 밸런싱이라고 합니다.

대부분의 사람들은 로드밸런싱 작업을 할 때, Nginx를 사용합니다.

왜 Nginx를 사용할까??

Nginx는 다양한 기능을 제공하며 저렴한 비용, 좋은 성능을 가지고 있기 때문입니다.

Nginx웹 서버 입니다.
웹 서버는 클라이언트의 요청에 따라 HTML, CSS, JS, 이미지 파일과 같은 정적 파일을 응답하여 제공하는 소프트 웨어입니다.

정적인 파일을 클라이언트에게 전달하는 역할을 수행하여 동적인 작업을 처리하는 WAS의 부담을 줄여주는 역할을 합니다.

Nginx는 웹 서버의 역할뿐만 아니라 프록시 서버로 역할을 제공합니다.

프록시란?
프록시는 클라이언트와 서버 사이에 중계 서버로 통신을 대신 수행하는 대리자 역할을 뜻합니다.
프록시가 존재한다면, 클라이언트와 서버는 프록시를 한번 거쳐 통신하게 됩니다.
프록시를 사용하면 보안 강화를 할 수 있고, 통신 성능을 향상하며, 통신 비용을 절약할 수 있습니다.
프록시는 크게 포워드 프록시(Forward Proxy), 리버스 프록시(Reverse Proxy)로 나뉩니다.

  • 포워드 프록시 기능 사용

포워드 프록시는 정적 파일을 원 서버로부터 캐싱하고 클라이언트가 요청할 때, 가지고 있는 캐시로 응답할 수 있습니다.
캐싱을 통해 서버에 대한 부하를 감소하고 네트워크 병목 현상을 줄일 수 있습니다.

그리고 모든 요청이 프록시 서버를 거치기 때문에, 클라이언트의 IP 주소가 웹 서버에 노출되지 않게 할 수 있습니다. 따라서, 클라이언트의 위치나 신원을 식별하는 것이 어려워 보안이 강화됩니다.

  • 리버스 프록시 기능 사용

Scale out된 다중 서버 환경에서 로드 밸런싱을 통해 하나의 서버에 부하가 몰리는 상황을 방지할 수 있습니다.
그리고 다른 서버에 장애가 발생했을 때, 장애가 발생한 서버로 요청을 보내지 않게 설정할 수 있습니다.

SSL(Secure Sockets Layer)을 지원하여 보안을 강화할 수 있습니다.

SSL 이란?
SSL(Secure Sockets Layer)은 웹 사이트와 사용자 간의 통신을 암호화하고 보안을 유지하는데 사용되는 프로토콜입니다.
SSL 프로토콜을 사용하여 웹 서버와 클라이언트 간에 보안 연결을 설정하고 SSL 인증서를 사용하여 서버의 신원을 인증합니다.
이를 통해 중간자 공격과 같은 보안 위협을 방지할 수 있습니다.
HTTPS는 SSL/TLS를 사용하여 HTTP 통신을 보호합니다.

포워드 프록시와 마찬가지로 캐싱 기능을 수행합니다.

이벤트 루프 방식을 사용하여 높은 성능을 제공합니다.
동시에 여러 요청이 들어와도 많은 트래픽을 동시에 처리할 수 있어 빠른 응답 시간을 보장합니다.


Nginx를 활용한 로드밸런싱

앞서 말했듯이 Nginx는 다양한 기능을 제공하고 있습니다.

현재 프로젝트가 다중 서버로 Scale out된 상태이기 때문에 Nginx리버스 프록시로 활용하여 로드밸런싱을 하겠습니다.

상황

  • Nginx 서버 1대, Service 서버 3대(AWS EC2 프리티어)
  • Nginx 서버에는 Nginx가 설치되어 있고 Service 서버 3대는 애플리케이션 실행 상태

/etc/nginx/nginx.conf 경로에 있는 Nginx 설정 파일에 로드밸런싱 설정을 적용합니다.

http {
    upstream backend_servers {
        server {서버1 IP}:{포트};
        server {서버2 IP}:{포트};
        server {서버3 IP}:{포트};
    }

    server {
        listen 80;

        location / {
            proxy_pass http://backend_servers;
        }
    }
}

upstream을 사용해 로드밸런싱 대상 서버를 설정할 수 있습니다. 설정 이름은 backend_servers로 지정했습니다.

upstream로드밸런싱 알고리즘을 설정하지 않는다면 기본으로 라운드로빈 방식이 설정되어 있습니다.

proxy_pass 명령어에 upstream의 이름을 설정해 주어야 합니다.

설정을 저장한 후, Nginx 설정 파일에 오류가 없는지 확인하고 Nginx를 재시작합니다.

sudo nginx -t
sudo systemctl restart nginx

서버 응답 결과

서버에 반복적으로 요청을 보냈을 때, 서버마다 요청을 균등하게 분배하는 것을 확인할 수 있었습니다.

profile
📚개발 기록

0개의 댓글