서버/Node.js

PM2와 Node.js Cluster: 효율적인 프로세스 관리 가이드(2): PM2 로드 밸런싱

JohnnyDeveloper 2024. 9. 1. 22:40

PM2를 사용한 Node.js 애플리케이션의 로드 밸런싱 설정 방법과 효율적인 요청 분배를 통해 성능을 극대화하는 방법을 다룹니다.

PM2 로드 밸런싱: Node.js 애플리케이션의 효율적인 요청 분배 방법과 설정 가이드

Node.js는 비동기 이벤트 기반으로 작동하는 싱글 스레드 환경에서 실행되지만, CPU의 모든 코어를 활용하기 위해 클러스터링을 지원합니다. 그러나 클러스터링된 프로세스들 간에 요청을 효율적으로 분배하기 위해서는 로드 밸런싱이 필수적입니다. PM2는 이러한 로드 밸런싱을 간단하고 효과적으로 구현할 수 있게 도와줍니다.

이 글에서는 PM2를 사용해 Node.js 애플리케이션에서 로드 밸런싱을 설정하고, 효율적인 요청 분배를 통해 성능을 극대화하는 방법을 설명합니다.

1. PM2 로드 밸런싱의 개요

로드 밸런싱은 여러 서버나 프로세스 간에 네트워크 트래픽을 균등하게 분배하여, 서버의 과부하를 방지하고 성능을 최적화하는 기술입니다. PM2는 기본적으로 Node.js의 클러스터 모드에서 이러한 로드 밸런싱을 자동으로 수행합니다. 이를 통해 각 프로세스가 균등하게 트래픽을 처리하고, 전체 시스템의 응답 시간이 줄어듭니다.

1.1 PM2의 로드 밸런싱 방식

PM2는 Node.js의 cluster 모듈을 기반으로 동작합니다. cluster 모듈은 마스터 프로세스가 여러 워커 프로세스를 생성하고, 각 워커가 동일한 서버 포트에서 클라이언트 요청을 병렬로 처리하는 방식입니다. PM2는 이러한 cluster 모드를 쉽게 사용할 수 있도록 자동화된 설정을 제공하며, 각 워커 프로세스 간에 요청을 분배하는 역할을 수행합니다.


2. PM2를 사용한 로드 밸런싱 설정

2.1 기본 로드 밸런싱 설정

PM2에서 로드 밸런싱을 설정하는 가장 간단한 방법은 애플리케이션을 클러스터 모드에서 실행하는 것입니다. 기본 설정으로도 PM2는 CPU의 모든 코어를 활용하여 프로세스를 생성하고, 각 프로세스 간에 로드를 균등하게 분배합니다.

2.1.1 클러스터 모드에서 애플리케이션 실행

다음 명령어를 사용하여 애플리케이션을 클러스터 모드에서 실행할 수 있습니다:

pm2 start app.js -i max

이 명령어는 사용 가능한 모든 CPU 코어에 대해 인스턴스를 생성합니다. 예를 들어, 4개의 코어가 있는 서버에서는 4개의 인스턴스가 생성되며, PM2는 각 인스턴스에 균등하게 요청을 분배합니다.

2.1.2 인스턴스 수 설정

특정한 수의 인스턴스만 실행하고자 할 때는 다음과 같이 인스턴스 수를 지정할 수 있습니다.

pm2 start app.js -i 2

이 명령어는 2개의 인스턴스를 생성하며, PM2는 두 인스턴스 간에 로드를 균등하게 분배합니다.


2.2 로드 밸런싱 설정 최적화

PM2의 로드 밸런싱은 기본적으로 효과적이지만, 애플리케이션의 특성과 서버 환경에 따라 설정을 최적화할 수 있습니다. 다음은 로드 밸런싱 성능을 더욱 향상시킬 수 있는 몇 가지 방법입니다.

2.2.1 라운드 로빈 방식

PM2는 기본적으로 라운드 로빈(Round-Robin) 방식으로 요청을 분배합니다. 이는 첫 번째 요청을 첫 번째 인스턴스에, 두 번째 요청을 두 번째 인스턴스에 전달하는 식으로 순차적으로 요청을 분배하는 방법입니다. 라운드 로빈 방식은 요청이 균등하게 분배되므로, 모든 프로세스가 거의 동일한 양의 작업을 수행하게 됩니다.

pm2 start app.js -i max --lb

위 명령어에서 --lb 옵션을 추가하면 PM2의 기본 로드 밸런싱 방식을 사용하여 라운드 로빈 방식으로 요청을 처리합니다.

2.2.2 CPU 사용량 기반 로드 밸런싱

CPU 사용량에 따라 더 많은 로드를 감당할 수 있는 인스턴스에 추가 요청을 전달할 수 있습니다. 이를 위해 애플리케이션 코드에서 CPU 사용량을 모니터링하고, PM2가 각 인스턴스의 상태를 평가할 수 있게 합니다.

이러한 설정은 기본적으로 PM2가 자동으로 처리하지 않지만, 별도의 CPU 모니터링 도구를 사용하거나 PM2 API를 통해 커스텀 로드 밸런싱 전략을 구현할 수 있습니다.


2.3 고급 로드 밸런싱 설정

PM2는 기본적인 로드 밸런싱 외에도 다양한 고급 설정을 제공합니다. 이러한 설정들은 대규모 애플리케이션이나 특별한 성능 요구 사항이 있는 경우 유용합니다.

2.3.1 네트워크 기반 로드 밸런싱

PM2는 기본적으로 동일한 서버 내에서 클러스터링을 수행하지만, 네트워크 기반 로드 밸런싱을 사용하여 여러 서버 간에 트래픽을 분배할 수도 있습니다. 이를 위해 HAProxy와 같은 외부 로드 밸런서를 사용할 수 있습니다.

pm2 deploy ecosystem.config.js production

이 명령어는 PM2를 사용해 여러 서버 간에 애플리케이션을 배포하고, 로드 밸런싱을 통해 트래픽을 분산시킵니다. 이를 통해 고가용성(High Availability) 환경을 구축할 수 있습니다.

2.3.2 PM2와 Docker를 통한 로드 밸런싱

PM2는 Docker와 함께 사용될 때도 효과적인 로드 밸런싱을 제공합니다. Docker 컨테이너 내부에서 PM2를 실행하면, 각 컨테이너에서 여러 인스턴스를 생성하고 로드 밸런싱을 수행할 수 있습니다. 이를 통해 수평적 확장(Scaling out)이 가능하며, 클러스터링된 환경에서 안정적으로 요청을 처리할 수 있습니다.

docker run -d -p 80:80 --name myapp myapp-image pm2 start app.js -i max

위 명령어는 Docker 컨테이너 내에서 PM2를 실행하여 애플리케이션을 클러스터링하고, 요청을 분산시킵니다.


3. 로드 밸런싱의 장점과 고려사항

3.1 로드 밸런싱의 장점

PM2를 사용한 로드 밸런싱의 주요 장점은 다음과 같습니다:

  • 성능 최적화: 여러 프로세스에 트래픽을 분산시켜, 서버 성능을 최대화합니다.
  • 가용성 향상: 프로세스가 비정상 종료되더라도 다른 인스턴스가 요청을 처리할 수 있으므로, 서비스 중단을 최소화할 수 있습니다.
  • 수평 확장 가능: PM2와 로드 밸런싱을 사용하면 애플리케이션을 쉽게 확장하여 더 많은 트래픽을 처리할 수 있습니다.

3.2 고려사항

로드 밸런싱 설정 시 다음 사항을 고려해야 합니다:

  • 오버헤드: 로드 밸런싱이 추가적인 시스템 자원을 소모할 수 있습니다. 서버의 성능을 감안하여 최적의 설정을 선택해야 합니다.
  • 세션 관리: 로드 밸런싱 환경에서 세션 관리가 중요합니다. Redis와 같은 세션 스토리지를 사용하여 모든 인스턴스가 동일한 세션 데이터를 참조할 수 있도록 설정해야 합니다.

다음 글에서는 네트워크 기반 로드 밸런싱에 대해서 더 알아보겠습니다.

 

다음글: https://johnny-developer-story.tistory.com/36