使用 PM2 將 Node.js 的集羣變得更加容易

介紹

  衆所周知,Node.js運行在Chrome的JavaScript運行時平臺上,咱們把該平臺優雅地稱之爲V8引擎。不管是V8引擎,仍是以後的Node.js,都是以單線程的方式運行的,所以,在多核心處理器的系統中並不能發揮其最大的性能。javascript

Node.js的cluster模塊

  幸運的是,Node.js給咱們提供了cluster模塊,它能夠生成多個工做線程來共享同一個TCP鏈接。java

  它是如何運做的呢?linux

  首先,Cluster會建立一個master,而後根據你指定的數量複製出多個server app(也被稱之爲工做線程)。它經過IPC通道與工做線程之間進行通訊,並使用內置的負載均衡來更好地處理線程之間的壓力,該負載均衡使用了Round-robin算法(也被稱之爲循環算法)。算法

  當使用Round-robin調度策略時,master accepts()全部傳入的鏈接請求,而後將相應的TCP請求處理髮送給選中的工做線程(該方式仍然經過IPC來進行通訊)。服務器

  那如何來使用呢?app

  下面是一個最基本的例子:負載均衡

var cluster = require('cluster');  
var http    = require('http');  
var os      = require('os');

var numCPUs = os.cpus().length;

if (cluster.isMaster) {  
  // Master:
  // Let's fork as many workers as you have CPU cores

  for (var i = 0; i < numCPUs; ++i) {
    cluster.fork();
  }
} else {
  // Worker:
  // Let's spawn a HTTP server
  // (Workers can share any TCP connection.
  //  In this case its a HTTP server)

  http.createServer(function(req, res) {
    res.writeHead(200);
    res.end("hello world");
  }).listen(8080);
}

       固然,你能夠指定任意數量的工做線程,線程的數量不只限於CPU核心的數量,由於它只是做爲一個運行在CPU上的子線程。性能

  正如你所看到的,要使其正常運行,你須要將你的代碼封裝到cluster的處理邏輯中,並添加一些額外的代碼來指定當一個線程掛掉以後如何進行處理。ui

使用PM2的方式

內置的cluster

  PM2內部包含了全部上述的處理邏輯,所以你沒必要對代碼作任何修改。咱們將上面的代碼還原成最原始的形式:this

var http = require('http');

http.createServer(function(req, res) {  
  res.writeHead(200);
  res.end("hello world");
}).listen(8080);

  而後在控制檯執行:

$ pm2 start app.js -i 4

 -i <number of workers>參數用來告訴PM2以cluster_mode的形式運行你的app(對應的叫fork_mode),後面的數字表示要啓動的工做線程的數量。若是給定的數字爲0,PM2則會根據你CPU核心的數量來生成對應的工做線程。

不論什麼狀況下,保持你的apps一直運行

 若是任意一個工做線程掛掉了,不用擔憂,PM2會當即將其重啓。固然,你也徹底能夠在任什麼時候候手動重啓這些線程:

實時擴展集羣

 任什麼時候候,若是你須要增長工做線程的數量,能夠經過 pm2 scale <app name> <n> 來對集羣進行擴展。參數<n>指定工做線程的數量,被用來增長或減小集羣數。你也能夠經過pm2 scale app +3的方式來指定要增長多少工做線程。

在產品環境實現零停機更新

  PM2的 reload <app name> 功能將依次重啓全部的工做線程。每個線程會等待在新的線程建立以後纔會被終止掉,所以,當你在產品環境部署新的代碼時,server會不間斷地一直保持運行。

  使用 gracefulReload 功能能夠達到相同的目的,不一樣的是它不會當即終止工做線程,而是經過IPC發送一個shutdown信號來關閉全部當前的鏈接並處理一些自定義的任務,而後再優雅地退出。以下面的代碼:

process.on('message', function(msg) {  
  if (msg === 'shutdown') {
    close_all_connections();
    delete_cache();
    server.close();
    process.exit(0);
  }
});

將PM2配置成自動啓動

  想要PM2在服務器重啓後自動運行以前的應用,能夠先經過pm2 start啓動你的應用,而後執行下面的命令:

pm2 save

 這將在~/.pm2目錄下生成一個dump.pm2文件,裏面描述了當前PM2上運行着的全部應用。而後執行命令:

pm2 startup [platform]

    注意有必要添加可選參數platform以明確告知pm2當前的系統環境。這樣,下次當服務器重啓時,PM2會自動運行以前保存的應用。

結論

 Cluster模塊的功能很是強大,使用PM2會使它變得更加容易。在Node 0.10.x時代cluster.js還只是個試驗品,但從Node 0.11.x開始已經逐漸成熟並開始準備正式發佈,固然也包括Node 0.12.x版本。強烈推薦使用最新版的Node.js和PM2,這些產品的貢獻者們一直在努力並使它們變得更好。

 盡情享受PM2帶給Node.js集羣操做的便利吧!

原文地址:https://keymetrics.io/2015/03/26/pm2-clustering-made-easy/

更多有關PM2的安裝和使用能夠查看這裏的文檔:http://pm2.keymetrics.io/docs/usage/quick-start/

相關文章
相關標籤/搜索