본문 바로가기

Server

[Server] PM2로 Node.js 무중단 서비스하기 | pm2 reload restart 차이

728x90

 

✨ Node.js 에서 PM2로 무중단 서비스하기

 

✔︎ 자세한 설명 전에 미리 간단 사용 요약

 

1. pm2 설치

: 관리자 권한으로 설치가 가능하기 때문에 sudo -s로 전환해주고

: npm install을 한다.

sudo -s
npm install pm2@latest -g

2. pm2 실행하기 

: app.js(본인의 기본 js 파일) 있는 폴더에서 pm2 start app.js 를 해준다.

 pm2 start app.js

3. 프로젝트 업데이트하기

: 본인이 업데이트 하는 방법을 사용한다.

: ex) git pull

git pull

4. pm2 reload app

: pm2 reload app을 하면 서비스가 중단되지  않고 업데이트가 된다.

pm2 reload app.js

 

✔︎ pm2 명령어 모음

 

pm2 현재 상태보기

pm2 list

pm2 중지하기

pm2 stop

pm2 재시작하기

: reload와 다른 점은, reload는 서비스를 중단하지 않고 업데이트가 되지만, restart는 서비스를 중지하고 다시 재시작된다.

pm2 restart

 

✔︎ pm2 reload와 pm2 restart의 차이 자세히

 

pm2 reload

:  최소 1개 이상의 프로세스를 유지하며 하나씩 재시작 하는 방식
pm2 restart

: 모든 프로세스를 죽인다음 다시 시작하는 방식.

 

pm2 reload의 장점

: “0-second-downtime reload.”라고 함. (다운 안 되고 재시작)
pm2 restart의 장점

: pm2 reload보다 빠름

 

*pm2 reload가 타임아웃 될 경우 pm2 restart로 재시작 됨.

 

 

 

🤔  PM2 자세히 알아보기

 

✔︎ PM2란 무엇인가?

: 어플리케이션을 관리하는데 도움을 주는 프로세스 관리자

 

https://pm2.keymetrics.io/docs/usage/quick-start/

 

PM2 - Quick Start

Advanced process manager for production Node.js applications. Load balancer, logs facility, startup script, micro service management, at a glance.

pm2.keymetrics.io

 

✔︎ PM2를 왜 쓰는 걸까? 

: Node.js는 기본적으로 싱글 스레드(thread)이다. 그렇게 때문에 CPU 코어수가 많더라도 하나의 코어, 그리고 그 안에 하나의 스레드만 사용할 수 있다. 그렇다면 모든 코어를 활용할 수 있는 방법은 무엇일까? Node.js에서는 이런 문제를 해결하기 위해서 클러스터(cluster) 모듈을 사용할 수 있다. 그러면 여러개의 코어를 사용할 수 있게 된다. 클러스터는 코어 여러개를 사용하게 해주면서, 코어 하나당 노드 프로세스 하나를 배정한다고 한다. 그리고 이 작업을 쉽게 할 수 있도록 도와주는 것이 바로 Node.js의 프로세스 매니저 PM2이다. 그리고 이 PM2로 무중단 서비스도 가능하다.

 

*CPU, core, thred

 

 

😎  PM2로 무중단 실행해보기 (자세히)

 

✔︎ PM2 설치

npm install pm2@latest -g

 

✔︎ 기본(fork) 모드로 실행하기 (CPU core 하나로만 실행하기)

Node.js 프로젝트 내의 app.js 예시

//app.js
const express = require('express')
const app = express()
const port = 3000
app.get('/', function (req, res) { 
  res.send('Hello World!')
})
app.listen(port, function () {
  console.log(`application is listening on port ${port}...`)
})

터미널

pm2 start app.js

app이라는 것이 fork 모드로 online 무중단으로 잘 실행되고 있다. 이 fork모드는 pm2의 기본 모드로 CPU 코어 하나로 실행이 된다. 그런데 CPU 코어가 하나만 있는 상황에서는 상관이 없겠지만, 만약 CPU 코어가 2개 이상이라면 어떻게 해야할까? 이런 상황에서 바로 클러스터 모드로 실행해주면 된다.

 

 

(2) 클러스터 모드로 실행하기 (CPU core 여러개로 실행하기)

 

 

1. pm2에서 제공하는 기본 명령어 버전

 

터미널

: -i max는 instances max 라는 뜻 ->  가지고 있는 cpu 코어를 전부 다(max) 쓴다는 의미 

pm2 start app.js -i max

 

 

2. 원하는 옵션값 설정하고 싶을 때 

 

Node.js 프로젝트 내의 ecosystem.config.js 예시

: ecosystem.config.js 파일을 만들어서 다음 내용을 쓰고 프로젝트 폴더에 넣는다.

: instances max 라는 것은 가지고 있는 cpu 코어를 전부 다(max) 쓴다는 의미

//ecosystem.config.js
module.exports = {
  apps: [{
  name: 'app',
  script: './app.js',
  instances: 'max',
  exec_mode: 'cluster'
  }]
}

 

터미널

: 터미널에서 실행할 때 pm2 start ecosystem.config.js 엔터

: 또는 script에 app.js 라고 써놨기 때문에 pm2 start app.js로 해도 됨

pm2 start ecosystem.config.js
pm2 start app.js

app이라는 것이 cluster 모드로 online 무중단으로 잘 실행되고 있다. 이 예시에서는 cpu 코어가 2개인데 cluster 모드 덕분에 cpu 코어를 전부 다 사용하고 있다. 

 

 

😮 클러스터 모드 사용 전 후

: CPU 코어 한 개만 사용할 수 있었음 ->  CPU 코어 전부 사용

 

 

✔︎ 클러스터 모드에 대해서 자세히

 

pm2 클러스터 모드

: node.js의 클러스터 모듈을 쉽게 사용할 수 있도록 해줌.

 

클러스터 모듈?

: node.js 의 모듈

: 기본적으로 싱글 스레드인 노드가 CPU 코어를 모두 사용할 수 있게 해줌

 

포트를 공유하는 노드 프로세스를 여러 개 둘 수 있음

요청이 많이 들어왔을 때 병렬로 실행된 서버의 개수만큼 요청이 분산됨

서버에 무리가 덜 감

코어가 8개인 서버가 있을 때 -> 기본적으로는 코어 하나만 활용

cluster를 사용한다면? -> 코어 하나당 노드 프로세스 하나가 돌아가게 할 수 있음

성능이 8배가 되는 것은 아니지만 코어 하나만 사용할 때에 비해 개선됨

 

단점: 메모리를 공유하지 못함 -> 왜? 각각 코어에 독립적인 프로세스를 돌리기 때문에 서로 공유가 안됨.
-> Redis 등 서버 도입해서 해결

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

참고자료

PM2 공식 홈페이지, PM2 코어 이미지 https://pm2.keymetrics.io/docs/usage/quick-start/

PM2를 활용한 Node.js 무중단 서비스 하기 https://engineering.linecorp.com/ko/blog/pm2-nodejs/

코어와 스레드의 차이 이미지 https://www.temok.com/blog/cores-vs-threads/

https://inpa.tistory.com/entry/NODE-%F0%9F%93%9A-cluster-%EB%AA%A8%EB%93%88-%EC%BD%94%EC%96%B4%EB%A5%BC-%EC%B6%94%EA%B0%80%EB%A1%9C-%EC%82%AC%EC%9A%A9

pm2 restart와 pm2 reload의 차이

https://betdon.github.io/3-pm2/

https://stackoverflow.com/questions/44883269/what-is-the-difference-between-pm2-restart-and-pm2-reload

클러스터 모드란 무엇인가? https://stackoverflow.com/questions/34682035/cluster-and-fork-mode-difference-in-pm2

클러스터 모듈 https://inpa.tistory.com/entry/NODE-%F0%9F%93%9A-cluster-%EB%AA%A8%EB%93%88-%EC%BD%94%EC%96%B4%EB%A5%BC-%EC%B6%94%EA%B0%80%EB%A1%9C-%EC%82%AC%EC%9A%A9

클러스터 모드와 fork 모드 차이 https://stackoverflow.com/questions/34682035/cluster-and-fork-mode-difference-in-pm2

node.js 클러스터 https://pg-titannia.tistory.com/105

노드 js 교과서 https://thebook.io/080229/ch04/05/

 

728x90