Docker容器和Node.js集群

时间:2015-02-16 18:28:29

标签: node.js docker

我有一台运行Node.js的api服务器正在使用它的集群模块,测试看起来非常好。现在我们的IT部门想要转向使用我很高兴的Docker容器,但除了玩游戏之外我从未真正使用它。但我有一个想法,Node.js应用程序在单个Docker进程中运行,因此集群模块实际上并不是最好的,因为单个Docker进程可能是设置的慢点,直到请求被拆分为止集群模块的那个过程。

所以真正运行的Docker容器集群能够在运行中启动和停止它们比使用Node.js更重要。集群模块正确吗?

如果我有一个容器集群,那么会使用Node.js'集群模块给我什么? api端点返回的时间少于0.5秒(通常相当少)。

我正在使用MySQL(相信它是一台服务器,目前还没有更多),因此不应该有任何理由使用数据完整性解决方案。

3 个答案:

答案 0 :(得分:14)

你必须要测量以确定,但我的预感将与节点的集群模块一起运行是值得的。它会以最少的额外开销为您提供更多的CPU利用率。没有额外的容器需要管理(启动,停止,监控)。此外,集群工作人员拥有有效的沟通机制。在我看来,最合理的进化(不要跳过步骤):

  1. 1个容器,1个节点进程
  2. 1个容器,多个群集节点工作者
  3. 几个容器,每个容器都有几个节点工作者

答案 1 :(得分:11)

我使用Docker时所看到的最佳解决方案是尽可能减少每个容器的进程数量,因为容器很轻;您不希望进程尝试使用多个CPU。因此,在容器中运行群集不会添加任何值,并且可能会导致更糟糕的延迟。

这里https://medium.com/@CodeAndBiscuits/understanding-nodejs-clustering-in-docker-land-64ce2306afef#.9x6j3b8vw Chad Robinson概括地解释了这个想法。

Kubernetes,Rancher,Mesos和其他容器管理层处理负载平衡。他们提供"日程安排" (将这些Docker容器切片移动到不同的CPU和机器周围,以便在整个群集中获得良好的使用)和#34;网络" (内部对这些容器的入站请求负载平衡)层。

<强>更新

我认为值得添加人们分享他们的想法和经验的链接Why it is recommended to run only one process in a container?,但主要来自Jon有一些有趣的观点:

如果您对容器承担单一责任(单个流程,功能或关注):好主意Docker将此问题命名为&#39;关注&#39; ;)

  • 水平缩放容器更容易。
  • 可以在不同的项目中重复使用。
  • 与在整个应用程序环境中进行比较相比,识别问题和故障排除是一件轻而易举的事。此外,记录和报告可以更准确和详细。
  • 升级/降级可以逐步完全控制。
  • 安全性可以应用于特定资源和不同级别。

答案 2 :(得分:0)

我有一个带有4个逻辑核心的系统,并且在我的机器以及安装在同一机器上的docker上运行了以下代码。

const numCPUs = require('os').cpus().length;
console.log(numCPUs)

此行在我的机器上打印 4 ,在Docker容器内打印 2 。这意味着,如果我们在Docker容器中使用群集,则只有2个实例在运行。因此,docker容器看不到与实际机器相同的内核。同样在启用集群模式的情况下运行5个docker容器,将提供10个计算机实例,这些实例最终将由具有4个逻辑内核的OS内核进行管理。

所以我认为最好的方法是在群体模式下使用多个docker容器实例,并禁用node.js集群。这样应该可以提供最佳性能。