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


89

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

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

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

답변:


121

주요 차이점 fork_mode및 cluster_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.