SlideShare a Scribd company logo
1 of 27
Download to read offline
进程管理的利器



  node-cluster
      张轩丞(朋春)
       @我是aleafs
项目地址


• npm install node-cluster
• https://github.com/aleafs/node-cluster
千万pv的服务
千万pv的服务

• 多进程协同提供服务
千万pv的服务

• 多进程协同提供服务
• 进程“死”掉时的容灾
千万pv的服务

• 多进程协同提供服务
• 进程“死”掉时的容灾
• 服务的平滑重启
千万pv的服务

• 多进程协同提供服务
• 进程“死”掉时的容灾
• 服务的平滑重启
• 监控、管理接口
进程
进程

|-- master
进程

|-- master
   |-- n * core service
进程

|-- master
   |-- n * core service
   |-- analysis daemon
进程

|-- master
   |-- n * core service
   |-- analysis daemon
   |-- control service
Usage
var master = require(‘node-cluster’).Master({
  ‘pidfile‘ : __dirname + ‘/run/app.pid’,
  ‘statusfile’ : __dirname + ‘/run/status.log’,
});

master.register(‘core’, __dirname + ‘/http.js’, {
  ‘listen‘ : [ port1, socket1, /** ... */ ],
  ‘children’ : 4,
});
master.dispatch();
Usage
var http = require(‘http’);
var server = http.createServer(function (req, res) {
  res.end(‘hello world’);
});

require(‘node-cluster’).Worker({
   ‘heartbeat_interval’ : 2000,
   ‘terminate_timeout’ : 1000,
}).ready(function (socket) {
  server.emit(‘connection’, socket);
});
协同服务


• 多进程“共用”同⼀一个端口
• 请求的负载均衡
端口“共享”
 master
       listen
1.request                          worker 1

            2.child_process.send   worker 2
                   handle
                                   worker 3
    3.response
                                   worker 4
worker分配算法

          master推          worker拉

       master选择⼀一个worker, master将请求投入队列,
 原理           让它干活             等worker来抢


          轮巡 / 权重 /
分配算法      最空闲worker
                            worker来抢



 劣势    worker“死”掉,影响⼀一批   多⼀一次进程通信
case MESSAGE.WAKEUP:
      if (STATUS.RUNNING === mstat.status) {
        _send(MESSAGE.GET_FD);
      }
      break;

case MESSAGE.REQ_FD:
      mstat.scores++;
      _accept(handle, callback);
      if (STATUS.RUNNING === mstat.status && msg.data) {
        process.nextTick(function () {
          _send(MESSAGE.GET_FD);
        });
      }
      break;
var usepush = 2 * _options.children;
_options.listen.forEach(function (item) {
  // ...
  _listener[item] = Listen(item, function (handle) {
    if (_fdqueue.push(handle) <= usepush) {
      _wakeups = (_wakeups + 1) % _pobject.length;
      try {
         _pobject[_wakeups].send({
           'type' : MESSAGE.WAKEUP,
         });
      } catch (e) {
      }
    }
  });
});
进程容灾

sub.on(‘exit’, function (code, signal) {
 // start a new child process
 // max_fatal_restart
});
进程容灾

setInterval(function () {
  if (sub.last_hb_time < ?) {
      // start a new child process and then kill this
  }
}, 30000);
平滑重启
       restart         reload

                     新worker开始工作了
原理   stop && start     停掉旧worker


信号    SIGTERM          SIGUSR1

区别   master有退出       master无退出
reload用在哪里?
// 配置、资源的“热”加载

app.init(function () {
  require(‘node-cluster’).Worker({
    ‘heartbeat_interval’ : 2000,
    ‘terminate_timeout’ : 1000,
  }).ready(function (socket) {
    // 正式开始提供服务
  });
});
监控接口
master.on(‘giveup’, function (name, fatals) {
  // XXX: alert
  // 暂时放弃某个子进程的尝试重启
});

master.on(‘state’, function (name, current, before) {
  // XXX: alert
  // 可工作子进程数量变化
});
statusfile
905:	

 daemon	

 908	

 {"status":2,"scores":0,"mem":{"rss":
22204416,"heapTotal":5306944,"heapUsed":2775704},"_time":
1341026802149}
905:	

 http	

 910	

 {"status":2,"scores":1831,"mem":{"rss":
27009024,"heapTotal":9085760,"heapUsed":4811288},"_time":
1341026802157}
905:	

 daemon	

 907	

 {"status":2,"scores":0,"mem":{"rss":
22200320,"heapTotal":5315072,"heapUsed":2756800},"_time":
1341026804137}
905:	

 daemon	

 908	

 {"status":2,"scores":0,"mem":{"rss":
22290432,"heapTotal":5306944,"heapUsed":2787056},"_time":
1341026804149}
贡献者
    aleafs       @我是aleafs

  fengmk2       @Python发烧友

 Jackson Tian      @朴灵

Will Wen Gunn    @Wen-小问
Node cluster

More Related Content

What's hot

Puppet的使用与管理
Puppet的使用与管理Puppet的使用与管理
Puppet的使用与管理Elain Ding
 
实时任务调度
实时任务调度实时任务调度
实时任务调度Tony Deng
 
图解分布式一致性协议Paxos 20150311
图解分布式一致性协议Paxos 20150311图解分布式一致性协议Paxos 20150311
图解分布式一致性协议Paxos 20150311Cabin WJ
 
Java多线程设计模式
Java多线程设计模式Java多线程设计模式
Java多线程设计模式Tony Deng
 
Varnish简介
Varnish简介Varnish简介
Varnish简介fangdeng
 
Puppet安装总结
Puppet安装总结Puppet安装总结
Puppet安装总结Yiwei Ma
 
Node.js开发体验
Node.js开发体验Node.js开发体验
Node.js开发体验QLeelulu
 
lua & ngx_lua 的介绍与应用
lua & ngx_lua 的介绍与应用lua & ngx_lua 的介绍与应用
lua & ngx_lua 的介绍与应用hugo
 
Squid安装配置
Squid安装配置Squid安装配置
Squid安装配置Yiwei Ma
 
美团点评技术沙龙010-美团Atlas实践
美团点评技术沙龙010-美团Atlas实践美团点评技术沙龙010-美团Atlas实践
美团点评技术沙龙010-美团Atlas实践美团点评技术团队
 
Mysql展示功能与源码对应
Mysql展示功能与源码对应Mysql展示功能与源码对应
Mysql展示功能与源码对应zhaolinjnu
 
OpenResty 项目模块化最佳实践
OpenResty 项目模块化最佳实践OpenResty 项目模块化最佳实践
OpenResty 项目模块化最佳实践Orangle Liu
 
【Maclean liu技术分享】深入理解oracle中mutex的内部原理
【Maclean liu技术分享】深入理解oracle中mutex的内部原理【Maclean liu技术分享】深入理解oracle中mutex的内部原理
【Maclean liu技术分享】深入理解oracle中mutex的内部原理maclean liu
 
Burp suite injection中的应用by小冰
Burp suite injection中的应用by小冰Burp suite injection中的应用by小冰
Burp suite injection中的应用by小冰fangjiafu
 
Automate with Ansible basic (3/e)
Automate with Ansible basic (3/e)Automate with Ansible basic (3/e)
Automate with Ansible basic (3/e)Chu-Siang Lai
 

What's hot (20)

Puppet的使用与管理
Puppet的使用与管理Puppet的使用与管理
Puppet的使用与管理
 
实时任务调度
实时任务调度实时任务调度
实时任务调度
 
图解分布式一致性协议Paxos 20150311
图解分布式一致性协议Paxos 20150311图解分布式一致性协议Paxos 20150311
图解分布式一致性协议Paxos 20150311
 
Java多线程设计模式
Java多线程设计模式Java多线程设计模式
Java多线程设计模式
 
Zoo keeper
Zoo keeperZoo keeper
Zoo keeper
 
Varnish简介
Varnish简介Varnish简介
Varnish简介
 
Puppet安装总结
Puppet安装总结Puppet安装总结
Puppet安装总结
 
Java soap
Java soapJava soap
Java soap
 
Node.js开发体验
Node.js开发体验Node.js开发体验
Node.js开发体验
 
lua & ngx_lua 的介绍与应用
lua & ngx_lua 的介绍与应用lua & ngx_lua 的介绍与应用
lua & ngx_lua 的介绍与应用
 
Glider
GliderGlider
Glider
 
Squid安装配置
Squid安装配置Squid安装配置
Squid安装配置
 
美团点评技术沙龙010-美团Atlas实践
美团点评技术沙龙010-美团Atlas实践美团点评技术沙龙010-美团Atlas实践
美团点评技术沙龙010-美团Atlas实践
 
Mysql展示功能与源码对应
Mysql展示功能与源码对应Mysql展示功能与源码对应
Mysql展示功能与源码对应
 
OpenResty 项目模块化最佳实践
OpenResty 项目模块化最佳实践OpenResty 项目模块化最佳实践
OpenResty 项目模块化最佳实践
 
Mvc
MvcMvc
Mvc
 
【Maclean liu技术分享】深入理解oracle中mutex的内部原理
【Maclean liu技术分享】深入理解oracle中mutex的内部原理【Maclean liu技术分享】深入理解oracle中mutex的内部原理
【Maclean liu技术分享】深入理解oracle中mutex的内部原理
 
Burp suite injection中的应用by小冰
Burp suite injection中的应用by小冰Burp suite injection中的应用by小冰
Burp suite injection中的应用by小冰
 
Automate with Ansible basic (3/e)
Automate with Ansible basic (3/e)Automate with Ansible basic (3/e)
Automate with Ansible basic (3/e)
 
MySQL aio
MySQL aioMySQL aio
MySQL aio
 

Similar to Node cluster

异步编程与浏览器执行模型
异步编程与浏览器执行模型异步编程与浏览器执行模型
异步编程与浏览器执行模型keelii
 
6, workflow miscellaneous
6, workflow miscellaneous6, workflow miscellaneous
6, workflow miscellaneousted-xu
 
Mysql mmm演讲--冯浩
Mysql mmm演讲--冯浩Mysql mmm演讲--冯浩
Mysql mmm演讲--冯浩chinafenghao
 
Mysql mmm演讲-冯浩
Mysql mmm演讲-冯浩Mysql mmm演讲-冯浩
Mysql mmm演讲-冯浩chinafenghao
 
Mysql mmm演讲-冯浩
Mysql mmm演讲-冯浩Mysql mmm演讲-冯浩
Mysql mmm演讲-冯浩chinafenghao
 
Monitor is all for ops
Monitor is all for opsMonitor is all for ops
Monitor is all for ops琛琳 饶
 
Hadoop+spark實作
Hadoop+spark實作Hadoop+spark實作
Hadoop+spark實作FEG
 
基于linux-HA 的PG高可用性
基于linux-HA 的PG高可用性基于linux-HA 的PG高可用性
基于linux-HA 的PG高可用性babyyellow li
 
服务器端性能优化 提升Qps、rt
服务器端性能优化 提升Qps、rt服务器端性能优化 提升Qps、rt
服务器端性能优化 提升Qps、rt锐 张
 
Akka分片集群的实现
Akka分片集群的实现Akka分片集群的实现
Akka分片集群的实现Caoyuan Deng
 
深入淺出 Web 容器 - Tomcat 原始碼分析
深入淺出 Web 容器  - Tomcat 原始碼分析深入淺出 Web 容器  - Tomcat 原始碼分析
深入淺出 Web 容器 - Tomcat 原始碼分析Justin Lin
 
Node.js在淘宝的应用实践
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践taobao.com
 
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUGYingSiang Geng
 
那些大家常忽略的 Cache-Control
那些大家常忽略的 Cache-Control那些大家常忽略的 Cache-Control
那些大家常忽略的 Cache-ControlMu Chun Wang
 
Ejb工作原理学习笔记
Ejb工作原理学习笔记Ejb工作原理学习笔记
Ejb工作原理学习笔记yiditushe
 
线程与并发
线程与并发线程与并发
线程与并发Tony Deng
 
D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版Jackson Tian
 

Similar to Node cluster (20)

异步编程与浏览器执行模型
异步编程与浏览器执行模型异步编程与浏览器执行模型
异步编程与浏览器执行模型
 
6, workflow miscellaneous
6, workflow miscellaneous6, workflow miscellaneous
6, workflow miscellaneous
 
Mysql mmm演讲--冯浩
Mysql mmm演讲--冯浩Mysql mmm演讲--冯浩
Mysql mmm演讲--冯浩
 
Mysql mmm演讲-冯浩
Mysql mmm演讲-冯浩Mysql mmm演讲-冯浩
Mysql mmm演讲-冯浩
 
Mysql mmm演讲-冯浩
Mysql mmm演讲-冯浩Mysql mmm演讲-冯浩
Mysql mmm演讲-冯浩
 
Monitor is all for ops
Monitor is all for opsMonitor is all for ops
Monitor is all for ops
 
Hadoop+spark實作
Hadoop+spark實作Hadoop+spark實作
Hadoop+spark實作
 
基于linux-HA 的PG高可用性
基于linux-HA 的PG高可用性基于linux-HA 的PG高可用性
基于linux-HA 的PG高可用性
 
服务器端性能优化 提升Qps、rt
服务器端性能优化 提升Qps、rt服务器端性能优化 提升Qps、rt
服务器端性能优化 提升Qps、rt
 
Akka分片集群的实现
Akka分片集群的实现Akka分片集群的实现
Akka分片集群的实现
 
深入淺出 Web 容器 - Tomcat 原始碼分析
深入淺出 Web 容器  - Tomcat 原始碼分析深入淺出 Web 容器  - Tomcat 原始碼分析
深入淺出 Web 容器 - Tomcat 原始碼分析
 
Node.js在淘宝的应用实践
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践
 
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
 
运维自动化
运维自动化运维自动化
运维自动化
 
那些大家常忽略的 Cache-Control
那些大家常忽略的 Cache-Control那些大家常忽略的 Cache-Control
那些大家常忽略的 Cache-Control
 
Ejb工作原理学习笔记
Ejb工作原理学习笔记Ejb工作原理学习笔记
Ejb工作原理学习笔记
 
Java Thread
Java ThreadJava Thread
Java Thread
 
Storm
StormStorm
Storm
 
线程与并发
线程与并发线程与并发
线程与并发
 
D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版
 

More from aleafs

Node develop expirements
Node develop expirementsNode develop expirements
Node develop expirementsaleafs
 
分布式系统缓存设计
分布式系统缓存设计分布式系统缓存设计
分布式系统缓存设计aleafs
 
My fox 扩容与数据迁移
My fox 扩容与数据迁移My fox 扩容与数据迁移
My fox 扩容与数据迁移aleafs
 
海量统计数据的分布式MySQL集群——MyFOX
海量统计数据的分布式MySQL集群——MyFOX海量统计数据的分布式MySQL集群——MyFOX
海量统计数据的分布式MySQL集群——MyFOXaleafs
 
淘宝海量数据产品技术架构
淘宝海量数据产品技术架构淘宝海量数据产品技术架构
淘宝海量数据产品技术架构aleafs
 
Myfox on NodeJS
Myfox on NodeJSMyfox on NodeJS
Myfox on NodeJSaleafs
 
助推宝工具介绍
助推宝工具介绍助推宝工具介绍
助推宝工具介绍aleafs
 

More from aleafs (7)

Node develop expirements
Node develop expirementsNode develop expirements
Node develop expirements
 
分布式系统缓存设计
分布式系统缓存设计分布式系统缓存设计
分布式系统缓存设计
 
My fox 扩容与数据迁移
My fox 扩容与数据迁移My fox 扩容与数据迁移
My fox 扩容与数据迁移
 
海量统计数据的分布式MySQL集群——MyFOX
海量统计数据的分布式MySQL集群——MyFOX海量统计数据的分布式MySQL集群——MyFOX
海量统计数据的分布式MySQL集群——MyFOX
 
淘宝海量数据产品技术架构
淘宝海量数据产品技术架构淘宝海量数据产品技术架构
淘宝海量数据产品技术架构
 
Myfox on NodeJS
Myfox on NodeJSMyfox on NodeJS
Myfox on NodeJS
 
助推宝工具介绍
助推宝工具介绍助推宝工具介绍
助推宝工具介绍
 

Node cluster