PM2のクラスターモードとフォークモードの違い


89

私はこの質問を理解するためにたくさん検索しましたが、明確な説明が得られませんでした。クラスター化されたアプリをスケールアウトでき、フォークされたアプリをスケールアウトできないという違いは1つだけですか?

PM2の公開サイトでは、クラスターモードでこれらの機能を実行できると説明していますが、フォークモードの長所については誰も言っていません(多分、NODE_APP_INSTANCE可変になる可能性があります)。

フォークは一般的に使われているように見えるので、クラスターはフォークの一部かもしれないと思います。つまり、フォークはPM2の観点から「フォークされたプロセス」を意味し、クラスターは「スケールアウト可能なフォークされたプロセス」を意味すると思います。では、なぜフォークモードを使用する必要があるのですか?

回答:


121

主な違いfork_modeとは、cluster_modeその注文のいずれかを使用することであるPM2 child_process.forkのAPIまたはクラスターをAPIを。

これは内部的にどういう意味ですか?

フォークモード

forkモードを基本的なプロセススポーンとして使用します。これにより、を変更exec_interpreterできるため、phpまたはpythonサーバーをpm2で実行できます。はい、これexec_interpreterは子プロセスを開始するために使用される「コマンド」です。デフォルトでは、pm2が使用するnodeため、pm2 start server.js次のようになります。

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

このモードは多くの可能性を可能にするので非常に便利です。たとえば、事前に確立されたポートで複数のサーバーを起動し、HAProxyまたはNginxによって負荷分散することができます。

クラスターモード

clusterのみで動作しますnode、それはだとしてexec_interpreter(:例えば、それはnodejsクラスタモジュールにアクセスしますのでisMasterforkメソッドなど)。プロセスは複数のインスタンスで自動的にフォークされるため、これはゼロ構成プロセス管理に最適です。たとえば、のpm2 start -i 4 server.js4つのインスタンスを起動server.jsし、クラスターモジュールに負荷分散を処理させます。


3
ここでの回答に基づく質問:たとえば、node.jsアプリの30個のインスタンスを一意の事前定義されたポート番号(:3000から:3030)で生成し、各インスタンスで処理する必要があるユースケースがあります。割り当てられたポートでのみアクセスする特定のユーザーグループ。したがって、マスタープロセスに負荷分散を実行させたくはありませんが、子プロセスのみを開始(および実行を継続)します。これは可能ですか?それとも、生成されたすべての子プロセスのみに負荷を分散しようとしますか?
tamak 2016年

3
pm2プログラマティックAPIを使用してfork_modeで30のプロセスを起動し、30のポート間のロードバランサーとして他のものを使用します。またpm2 start -i 30 app.js、nodejsクラスターを使用して作業を任せることもできます。
soyuka 2016年

11
注:cluster modeマスタープロセスでは、単一障害点があります。
Karl Pokus 2017

40

Node.jsはシングルスレッドです。

つまり、IntelクアッドコアCPUの1コアのみがノードアプリケーションを実行できます。

それは呼ばれました:fork_mode

ローカル開発に使用します。

pm2 start server.js -i 0 CPUの各コアで1つのノードスレッドを実行するのに役立ちます。

そして、ステートレスな着信要求を自動ロードバランスします。

上の同じポート

私たちはそれを呼びます:cluster_mode

これは、本番環境でのパフォーマンスのために使用されます。

PCのストレステストを行う場合は、ローカル開発者でこれを行うこともできます:)


2
thaks、それはnodejsについて私の心の多くのことをクリアします
Rishabh Agrawal

1
素晴らしい説明!!
ピケ2017

1
Node.jsはシングルスレッドではなく、(現在)1つのユーザーランドスレッドがありますが、確かにlibuvスレッドプールによってサポートされています。
Benjamin Gruenbaum 2017年

1
@BenjaminGruenbaum同意します。私の発言は、libuvレベルまで深く言及していないという前提で理解する必要があります
haotang 2017年

16

ドキュメントとソースはここで本当に誤解を招くものです。

ソースでこれを読んで、唯一の違いは、ノードclusterまたはchild_processAPIのいずれかを使用していることです。cluster後者を使用しているので、実際には同じことをしています。stdio起こっている旅館の周りを通過するカスタムがもっとたくさんありますfork_modeます。またcluster、オブジェクトではなく、文字列を介してのみ通信できます。

デフォルトでは、を使用していfork_modeます。あなたが渡すと-i [number]-optionを、あなたは、になるだろうcluster_modeあなたは、一般的にワットを目指しています、/pm2

また、fork_modeインスタンスはおそらくEADDRINUSE。のために同じポートでリッスンできません。cluster_modeできる。このようにして、自動的に負荷分散される同じポートで実行するようにアプリを構成することもできます。状態のないアプリをビルドする必要がありますが、たとえばセッション、dbsなどです。


1
私はまだ混乱しています。cluster組み込みモジュールはchild_process内部で使用しますか?そしてあなたの提案は、私が柔軟stdioである必要があるならば、私はフォークモードを使わなければならないということです?
Jinyoung Kim 2016

stdio事はのようなものですpm2の実装。これについては心配しないでください。インスタンスをバックグラウンドでcluster_mode実行しているため、インスタンスが強化されているため、本番環境で使用する必要があります-i [number]fork_mode硬化が不要な場合、またはより良いログなどが必要な場合に使用します。
eljefedelrodeodeljefe 2016年

1
また、プロセスcluster_modeを実行しているため、明らかにシステムのより多くのリソースを使用し-i [number]ます。
eljefedelrodeodeljefe 2016年

お返事ありがとうございましたが、今でも要点​​がわかりませんでした。あなたの説明のほとんどは一種の自然なものです(例えば、CLIの使用法cluster_mode、負荷分散cluster_modecluster_modeより多くのリソースを使用します..)。それが私が投票しなかった理由です。両方の簡単なユースケースについて説明していただけますか?それぞれのケースは、なぜそれがそのモードをとったのか合理的でなければなりません。
Jinyoung Kim 2016

@eljefedelrodeodeljefe「セッション、dbsなど、状態なしでアプリをビルドする必要がある」について詳しく説明していただけますか?なぜアプリは状態なしでなければならないのですか?
STEN
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.