2019/12/09

PM2 Process Manager

PM2 는 Process Manager 약자이다.
공식 홈 페이지: https://pm2.keymetrics.io/
소스 프로젝트 : https://github.com/Unitech/pm2

node 프로세스를 관리한다.
node js
구글에서 개발한 자바스크립트 엔진으로 빌드된 서버 사이드 개발용 소프트웨어 플랫폼.

자바 스크립트 웹 브라우저 클라이언트 동작.
Node.js 런타임 환경에서는 모든 종류의 서버 사이드 도구들을 제공하여 자바스크립트로 개발.

클라이언트(Fron-end), 서버(back-end)를 모두 개발 할 수 있음.
웹 개발시 추가 언어 학습이 필요 없음.

node.js 패키지
npm(Node Packaged Manager) 세게에서 가장 큰 오픈 소스.
node.js를 설치시 npm 같이 설치 됨.

서버 개발.
데몬 형태의 응용프로그램 개발.
- 로그 처리
- 프로세스 비 인가 종료(restart)

유사 프로그램
- qmail에 svscan(프로세스가 죽으면 살리는 역활)

프로그램 설치 -g는 글로벌 환경(명령어 디렉토리에 상관없이 명령어 처리)
npm install pm2 -g

프로그램 등록
pm2 start server.js

목록 확인
pm2 list

프로그램 종료.
pm2 list

pm2 stop id넘버.
pm2 stop 0 ---> list id 값이 0을 종료.

등록된 서비스 삭제.
pm2 delete 0 ---> list id 값 확인

서비스 등록시 ID 이름 지정
pm2 start server.js --name "TEST"

그외 start 명령어.
# app.js에 -a 23이라는 인수를 전달
$ pm2 start app.js -- -a 23

# 프로세스 이름을 지정
$ pm2 start app.js -- name servername

# --node-args를 통해 node v8에 옵션값을 전달
$ pm2 start app.js --node-args="--debug=7001"

# cpu를 최대치로 할당(클러스터 전용)
$ pm2 start app.js -i max

# 로그의 시간데이터 포맷을 지정
$ pm2 start app.js --log-date-format "YYYY-MM-DD HH:mm Z"

# 아웃풋 로그와 에러로그의 위치를 지정
$ pm2 start app.js -e err.log -o out.log

# 명령어를 pm2를 실행하는 유저가 아닌 harry로 설정
# 유저그룹은 --run-as-group
$ pm2 --run-as-user harry start app.js

등록 확인.
pm2 list
App name 항목에 보면 TEST 확인.

서비스 상세정보 확인
pm2 show TEST

server.js 파일이 수정 할 경우,
pm2에 TEST 이름을 갖는 대상에 대해 재시작 해줘야 함.(restart)
pm2 인자 수정하는 경우, delete 후 등록

로그 정보
out log path -> 기본 경로 위치.

로그 위치 정보 변경
pm2 delete TEST && pm2 start server.js --name "TEST" -o ./api.log
-o 옵션 처리: stdout 을 처리 함.
-o 옵션 처리: stderr 을 처리 하지 못함.

로그 하드 코딩 시절.
void systemLog(char *log)
{
    fopen(api.log)
    fwrite(log)
    fclose(api.log)
}
open/write에 대한 atomic 보장을 위해 함수 내부에 lock 필요한 언어도 있음.

stderr 처리 -e 옵션
pm2 delete TEST && pm2 start server.js --name "TEST" -o ./api.log -e ./api.log --merge-logs

-e stderr 옵션: 노드 모율 예외 발생(크래 메세지) api.log 파일에서 확인 가능.

pm2 logs #모든 로그 출력
pm2 ilogs #자세한 로그 출력
pm2 flush #모든 로그 비우기
pm2 reloadLogs #로그 다시불러오기

트래픽 제어
서비스가 활성화 되면서 트패픽이 급증할 경우, node.js 처리할 수 가 없음.
트래픽을 받아 async(비동기)로 처리한다고 해도 내부 로직이 복잡해지면, CPU 자원을 감당하지 못한다.
이때 필요한 것이 클러스터이다.
pm2의 클러스터는 분산 컴퓨터 용어와 비슷한 역할을 한다.
server.js 하나의 노드 파일을 지정한 개수만큼 pm2에 등록하고 Load Balancing(LB)를 통해 부하 분산 시킨다.
pm2의 LB은 round robin(RR)방식으로 동작하여 모든것은 옵션 하나로 처리가 충분하다.

-i 옵션을 통해 3개 클러스터 등록
pm2 delete TEST && pm2 start server.js --name "TEST" -i 3 -o ./test.log

패킷 발생.
curl localhost:6985

로그 클러스터 확인.
test.log 클러스터 번호 활당.
test-0.log
test-1.log
test-2.log 로 나눠줘 기록된다.

로그 라운드 로빈(RR) 로드 발란싱(LB)
tail -f test-*

운영중 클러스터 개수 조정.
scale in/out 가능하다.

3개의 클러스터가 돌고 있는 TEST에게 클러스터 5로 변경했다.
scale in/out 설정
pm2 scale TEST 5

중단 명령
pm2 stop all

그외 프로세스 관리
pm2 stop all # 모든 프로세스 멈추기
pm2 restart all # 모든 프로세스 재시작
pm2 reload all # 모든 프로세스의 다운타임을 0으로 설정후 다시로드
pm2 stop 0 # 프로세스 0번을 멈추기
pm2 restart 0 # 프로세스 0번을 재시작
pm2 delete 0 # 프로세스 0번을 삭제
pm2 delete all # 프로세스 전부 삭제
pm2 ping # pm2가 사용가능한지 핑확인
pm2 updatePM #pm2 업데이트
pm2 reset <process> # 리셋 후 메타데이터 리로드

모인터링
- 실시간 로그 확인
- q 단축키 종료.
pm2 monit

시작(start) 명령어

================
쉘 스크립트 작성
================
start.sh

#!/bin/bash
pm2 reload node_yun;
echo 'Reload pm2 demon...';
sleep 1;
sudo service nginx restart;
echo 'Restart nginx server...';
echo 'All Done!'
exit;

stop.sh
#!/bin/bash

pm2 stop node_yun;
echo 'Stop node_yun by pm2';
sleep 1;
sudo service nginx stop'
echo 'Stop nginx server...';
echo 'All Done!';
exit;

restart.sh
#!/bin/bash

pm2 delete node_yun;
pm2 start /home/ec2-user/node-yun/bin/www -i 0 --name node_yun;
echo 'start node_yun by pmw';
sleep 1;
sudo service nginx start;
echo 'Start nginx server...';
echo 'All Done!';
exit;

댓글 없음:

댓글 쓰기