PM2를 이용한 무중단 서비스 배포

백우진·2023년 10월 13일
2
post-thumbnail

Node.js 의 동작 방식

pm2모듈을 사용하는 것은 노드의 동작 방식과 연관이 많다.
node.js는 기본적으로 싱글 스레드로 돌아간다.

만약 8코어 16스레드의 서버에서 구동하게 되더라도 노드는 싱글 스레드이기에 하나의 스레드를 사용하고 나머지 자원은 사용하지 못한다. 따라서 자원을 제대로 활용하지 못하게 되는 것이다.

이러한 문제를 해결 하기 위해 클러스터 모듈을 통해 단인 프로세스를 멀티 프로세스로 늘릴 수 있는 방법을 제공한다. 이렇게 개발자는 클러스터 모듈을 사용해서 마스터 프로세스에서 코어 수 만큼 워커 프로세스를 생성해서 모든 코어를 사용하게끔 할 수 있다.

하지만! 이러한 최적화 작업은 직접 구현하는 것보다 솔루션을 사용해서 해결 하는 방법을 알아보자!

PM2 (노드 프로세스 매니저)

왜 필요할까?

  • 포그라운드가 아닌 백그라운드로 실행 시킬 수 있다.
  • 서비스가 중지 되더라도 다시 재실행 시킨다.
  • 노드를 멀티 코어, 하이퍼 스레딩을 사용 할 수 있게 해준다.
  • 클라이언트 요청을 알아서 노드 프로세스로 분배(로드 밸런싱)

단점은?

  • 메모리 자원을 공유하지 못한다.

설치

$ npm install -g pm2 # pm2 전역 설치

$ pm2 -version # pm2 버젼 확인

$ pm2 update # pm2 업데이트

자주 사용하는 명령어

pm2 start <파일명>          # 애플리케이션 시작
pm2 stop app_name_or_id    # 애플리케이션 중단 (app_name_or_id는 애플리케이션의 이름 또는 ID로 대체)
pm2 restart app_name_or_id # 애플리케이션 재시작 (app_name_or_id는 애플리케이션의 이름 또는 ID로 대체)
pm2 stop all               # 모든 애플리케이션 중단
pm2 restart all            # 모든 애플리케이션 재시작
pm2 list                   # 모든 애플리케이션 목록 표시
pm2 logs                   # 애플리케이션 로그 보기
pm2 show app_name_or_id    # 애플리케이션 정보 표시 (app_name_or_id는 애플리케이션의 이름 또는 ID로 대체)
pm2 delete app_name_or_id  # 애플리케이션 제거 (app_name_or_id는 애플리케이션의 이름 또는 ID로 대체)
pm2 monit                  # 모니터링 대시보드 열기

pm2 설정파일로 관리 (ecosystem.config.js)

pm2 실행 환경에 대한 설정을 해야한다. 아래는 가장 기본 값만 설정한 것이다.

ecosystem.config.js 이라는 이름으로 프로젝트 루트에 생성하자.

module.exports = {
  apps: [
    {
      name: 'ensight',
      script: 'npm',
      args: 'start',
    },
  ],
};

기본 실행

백그라운드에서 정상적으로 실행되었고 fork모드로 실행 된 것을 볼 수 있다.
모드는 크게 2가지가 있는데

1. Fork 모드

  • 기본 모드: PM2에서 애플리케이션을 시작할 때 사용되는 기본 모드입니다.
  • 각 애플리케이션 인스턴스가 독립된 프로세스로 실행됩니다.
  • 각 애플리케이션은 개별 포트를 사용하며, 로드 밸런싱은 백엔드 서버 (예: Nginx)에서 처리됩니다.
  • 각 프로세스는 고유한 메모리 공간을 가지며, 메모리 이슈가 하나의 인스턴스에 영향을 미치지 않습니다.
  • 에러로 인해 하나의 프로세스가 종료되면, 나머지 프로세스는 계속해서 작동합니다.

2. Cluster 모드

  • 클러스터 모드는 여러 애플리케이션 인스턴스를 여러 프로세스로 실행하는 모드입니다.
  • 각 프로세스는 마스터 프로세스를 감독하고, 리소스 공유 및 작업 분배를 조정합니다.
  • 한 프로세스가 종료되면 마스터 프로세스가 다른 프로세스를 생성하여 무중단으로 서비스를 제공합니다.
  • 여러 프로세스가 하나의 포트를 공유하고, 로드 밸런싱을 개발 프레임워크 (예: Express.js) 내에서 처리할 수 있습니다.
  • 각 프로세스는 메모리를 공유하며, 전체 시스템 메모리 사용량을 최적화합니다.

기본 설정으로 실행하면 다음과 같이 fork모드로 실행되는 것을 볼 수 있습니다.



클러스터 모드 실행

다음과 같이 설정 파일을 생성하고


// PM2 설정 파일
module.exports = {
  apps: [
    {
      // 애플리케이션 이름 (임의로 설정 가능)
      name: 'ensight',

      // 실행할 스크립트와 인수
      script: 'npm',
      args: 'start',

      // 동시에 실행할 인스턴스 수 (이 경우, 최대로 실행)
      instances: 'max',

      // 프로세스가 비정상적으로 종료될 때 자동으로 다시 시작
      autorestart: true,

      // 파일 변경 감지를 사용하지 않음
      watch: false,

      // 메모리 임계값을 설정하여 재시작
      max_memory_restart: '1G',

      // 실행 환경 변수 설정
      env: {
        NODE_ENV: 'production',
      },
    },
  ],
};


실행하게 되면 다음과 클러스터 모드로 4개의 인스턴스가 생성 된 것을 볼 수 있다.


모니터링

pm2 monit 명령어를 통해서

현재 실행 상태를 볼 수 있다.

profile
안녕하세요.

0개의 댓글