使用 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/

相关文章
相关标签/搜索