PM2의 클러스터 및 포크 모드 차이


89

이 질문을 찾기 위해 많이 검색했지만 명확한 설명을 얻지 못했습니다. 클러스터링 된 앱을 확장 할 수 있고 분기 된 앱을 확장 할 수 없다는 차이점이 하나뿐인가요?

PM2의 공개 사이트는 클러스터 모드가 이러한 기능을 수행 할 수 있다고 설명 하지만 포크 모드의 장점에 대해서는 아무도 언급하지 않습니다 (아마도 NODE_APP_INSTANCE변수 를 얻을 수 있음).

Fork가 일반적으로 사용되는 것처럼 보이기 때문에 Cluster가 Fork의 일부라고 생각합니다. 그래서 포크는 PM2 시점에서 '포크 된 프로세스'를 의미하고 클러스터는 '스케일 아웃 할 수있는 포크 된 프로세스'를 의미한다고 생각합니다. 그렇다면 왜 포크 모드를 사용해야합니까?

답변:


121

주요 차이점 fork_modecluster_mode그 주문이 중 하나를 사용하는 PM2이다 child_process.fork의 API 또는 클러스터 API를.

이것은 내부적으로 무엇을 의미합니까?

포크 모드

테이크 fork기본 프로세스 산란 등의 모드를. 이렇게하면을 변경할 수 exec_interpreter있으므로 php또는 pythonpm2 로 서버를 실행할 수 있습니다 . 예, exec_interpreter하위 프로세스를 시작하는 데 사용되는 "명령"입니다. 기본적으로 PM2는 사용할 node정도로 pm2 start server.js같은 것을 할 것입니다 :

require('child_process').spawn('node', ['server.js'])

이 모드는 많은 가능성을 가능하게하기 때문에 매우 유용합니다. 예를 들어 사전 설정된 포트에서 여러 서버를 시작한 다음 HAProxy 또는 Nginx에 의해 부하 분산됩니다.

클러스터 모드

cluster에서만 작동합니다 node그것의로 exec_interpreter(: 예는 nodejs 클러스터 모듈에 액세스 할 수 있기 때문에 isMaster, fork방법 등). 프로세스가 여러 인스턴스에서 자동으로 분기되므로 구성이 필요없는 프로세스 관리에 적합합니다. 예를 들어 pm2 start -i 4 server.js4 개의 인스턴스를 시작 server.js하고 클러스터 모듈이 부하 분산을 처리하도록합니다.


3
여기에 귀하의 답변을 기반으로 한 질문 : 고유하고 사전 정의 된 포트 번호 (: 3000 ~ : 3030)로 생성 된 내 node.js 앱의 30 개의 인스턴스가 필요하고 각 인스턴스가 할당 된 포트에서만 액세스 할 특정 사용자 그룹. 따라서 마스터 프로세스가로드 밸런싱을 수행하는 것이 아니라 자식 프로세스 만 시작 (계속 실행)하는 것이 좋습니다. 이것이 가능한가? 아니면 생성 된 모든 자식 프로세스에만 부하를 분산 시키려고할까요?
tamak

3
pm2 프로그래밍 API를 사용하여 fork_mode에서 30 개의 프로세스를 시작하고 30 개 포트 사이의로드 밸런서로 다른 것을 사용합니다. pm2 start -i 30 app.jsnodejs 클러스터를 사용 하여 작업을 수행 할 수도 있습니다 .
soyuka 2016

11
참고 : cluster mode마스터 프로세스에서는 단일 실패 지점이 있습니다.
Karl Pokus 2017

40

Node.js는 단일 스레드입니다.

즉, Intel 쿼드 코어 CPU의 1 개 코어 만 노드 응용 프로그램을 실행할 수 있습니다.

이름 : fork_mode.

우리는 그것을 로컬 dev에 사용합니다 .

pm2 start server.js -i 0 CPU의 각 코어에서 1 개의 노드 스레드를 실행하는 데 도움이됩니다.

그리고 자동 부하의 균형 상태 비 오는 요청을.

같은 포트 .

우리는 그것을라고 부릅니다 cluster_mode.

프로덕션 성능을 위해 사용됩니다 .

PC에 스트레스 테스트를하고 싶다면 로컬 개발자에서이 작업을 수행하도록 선택할 수도 있습니다. :)


2
thaks, 그것은 nodejs에 대한 내 마음에 일이 많이 웁니다
Rishabh 인스 아그라 왈

1
훌륭한 설명 !!
Piqué

1
Node.js는 단일 스레드가 아니며 (현재) 하나의 사용자 영역 스레드가 있지만 확실히 libuv 스레드 풀에 의해 지원됩니다.
Benjamin Gruenbaum

1
@BenjaminGruenbaum 동의합니다. 내 진술은 내가 libuv 수준까지 너무 깊게 언급하지 않는다는 가정에서 이해되어야합니다
haotang

16

문서와 소스는 여기에서 오해의 소지가 있습니다.

소스에서 이것을 읽으면 유일한 차이점은 노드 cluster또는 child_processAPI를 사용한다는 것 입니다. cluster후자를 사용하기 때문에 실제로 동일한 작업을 수행합니다. stdio여관 주변 에는 훨씬 더 많은 관습이 fork_mode있습니다. 또한 cluster객체가 아닌 문자열을 통해서만 통신 할 수 있습니다.

기본적으로 fork_mode. -i [number]-옵션 을 전달 cluster_mode하면 일반적으로 w /를 목표로하는으로 이동합니다 pm2.

또한 fork_mode인스턴스는 .NET으로 인해 동일한 포트에서 수신 할 수 없습니다 EADDRINUSE. cluster_mode할 수있다. 이렇게하면 자동으로로드 밸런싱되는 동일한 포트에서 실행되도록 앱을 구성 할 수도 있습니다. 세션, dbs 등 상태없이 앱을 빌드해야합니다.


1
아직도 혼란 스러워요. cluster내장 모듈은 child_process내부적으로 사용 합니까? 그리고 당신의 제안은 융통성이 필요한 경우 stdio포크 모드를 사용해야합니까?
김진영

stdio가지의 뭔가 pm2의 구현입니다. 이것에 대해 걱정하지 마십시오. 백그라운드에서 인스턴스를 cluster_mode실행하기 때문에 인스턴스를 강화하므로 프로덕션 에서 사용하려고합니다 -i [number]. fork_mode강화가 필요하지 않거나 더 나은 로그와 물건을 원하는 경우 사용하십시오 .
eljefedelrodeodeljefe

1
또한 프로세스를 cluster_mode실행하고 있기 때문에 분명히 시스템의 더 많은 리소스를 사용 -i [number]합니다.
eljefedelrodeodeljefe

답변 해주셔서 감사했지만 지금도 요점을 이해하지 못했습니다. 대부분의 설명은 자연스러운 것입니다 (예 :의 CLI 사용 cluster_mode,의 부하 분산 cluster_mode, cluster_mode더 많은 리소스 사용 ..). 그것이 제가 투표를하지 않은 이유입니다. 두 가지 간단한 사용 사례를 모두 설명해 주시겠습니까? 각 케이스는 왜 그 모드를 취했는지 합리적이어야합니다.
진영 김

@eljefedelrodeodeljefe "예를 들어 세션, dbs를 통해 상태없이 앱을 빌드해야합니다."에 대해 자세히 설명해 주시겠습니까? 앱에 상태가 없어야하는 이유는 무엇입니까?
STEN
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.