Docker 个容器和 Node.js 个集群
Docker containers and Node.js clusters
我有一个 api 服务器 运行 Node.js 使用它的集群模块,测试看起来非常好。现在我们的 IT 部门想转而使用 Docker 容器,我对此很高兴,但除了玩玩之外我从未真正使用过它。但我有一个想法,Node.js 应用程序在单个 Docker 进程中运行,因此集群模块并不是最好的,因为单个 Docker 进程可能是直到集群模块在该进程内拆分请求。
所以 Docker 个容器集群 运行 能够即时启动和停止它们比使用 Node.js 集群模块更重要吗?
如果我有一个容器集群,使用 Node.js' 集群模块可以得到任何东西吗? api 端点到 return 的时间不到 0.5 秒(通常要少很多)。
我正在使用 MySQL(相信它是单个服务器,目前仅此而已)因此没有任何理由使用数据完整性解决方案。
您必须进行测量才能确定,但我的直觉是 运行 节点的集群模块是值得的。它会让您以最少的额外开销获得更多 CPU 的利用率。无需管理额外的容器(启动、停止、监控)。加上集群工作人员有一个有效的沟通机制。最合理的进化(不要跳过步骤)在我看来是:
- 1 个容器,1 个节点进程
- 1 个容器,几个集群节点 worker
- 几个容器,每个都有几个节点工作者
我认为使用 Docker 时的最佳解决方案是尽可能减少每个容器的进程,因为容器是轻量级的;您不希望进程尝试使用多个 CPU。因此,运行 容器中的集群不会增加任何价值,而且可能会加剧延迟。
这里 https://medium.com/@CodeAndBiscuits/understanding-nodejs-clustering-in-docker-land-64ce2306afef#.9x6j3b8vw 查德·罗宾逊笼统地解释了这个想法。
Kubernetes、Rancher、Mesos 和其他容器管理层处理load-balancing。他们提供 "scheduling"(将那些 Docker 容器片移动到不同的 CPU 和机器上以在整个集群中获得良好的使用)和 "networking"(负载平衡对这些容器的入站请求) 内部层。
更新
我认为值得补充 link Why it is recommended to run only one process in a container? where people share their ideas and experiences, but chiefly from Jon 有一些有趣的地方:
假设您将单一职责(单一流程、功能或关注点)赋予容器:好主意Docker 将其命名为'concern' ;)
- 水平缩放容器更容易。
- 在不同的项目中可以re-used
- 与在整个应用程序环境中进行相比,识别问题和排除故障是轻而易举的事。此外,日志记录和报告可以更加准确和详细。
- Upgrades/Downgrades可以逐渐完全控制
- 安全性可以应用于不同级别的特定资源。
我有一个带有 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 集群。这应该会提供最佳性能。
我有一个 api 服务器 运行 Node.js 使用它的集群模块,测试看起来非常好。现在我们的 IT 部门想转而使用 Docker 容器,我对此很高兴,但除了玩玩之外我从未真正使用过它。但我有一个想法,Node.js 应用程序在单个 Docker 进程中运行,因此集群模块并不是最好的,因为单个 Docker 进程可能是直到集群模块在该进程内拆分请求。
所以 Docker 个容器集群 运行 能够即时启动和停止它们比使用 Node.js 集群模块更重要吗?
如果我有一个容器集群,使用 Node.js' 集群模块可以得到任何东西吗? api 端点到 return 的时间不到 0.5 秒(通常要少很多)。
我正在使用 MySQL(相信它是单个服务器,目前仅此而已)因此没有任何理由使用数据完整性解决方案。
您必须进行测量才能确定,但我的直觉是 运行 节点的集群模块是值得的。它会让您以最少的额外开销获得更多 CPU 的利用率。无需管理额外的容器(启动、停止、监控)。加上集群工作人员有一个有效的沟通机制。最合理的进化(不要跳过步骤)在我看来是:
- 1 个容器,1 个节点进程
- 1 个容器,几个集群节点 worker
- 几个容器,每个都有几个节点工作者
我认为使用 Docker 时的最佳解决方案是尽可能减少每个容器的进程,因为容器是轻量级的;您不希望进程尝试使用多个 CPU。因此,运行 容器中的集群不会增加任何价值,而且可能会加剧延迟。
这里 https://medium.com/@CodeAndBiscuits/understanding-nodejs-clustering-in-docker-land-64ce2306afef#.9x6j3b8vw 查德·罗宾逊笼统地解释了这个想法。
Kubernetes、Rancher、Mesos 和其他容器管理层处理load-balancing。他们提供 "scheduling"(将那些 Docker 容器片移动到不同的 CPU 和机器上以在整个集群中获得良好的使用)和 "networking"(负载平衡对这些容器的入站请求) 内部层。
更新
我认为值得补充 link Why it is recommended to run only one process in a container? where people share their ideas and experiences, but chiefly from Jon 有一些有趣的地方:
假设您将单一职责(单一流程、功能或关注点)赋予容器:好主意Docker 将其命名为'concern' ;)
- 水平缩放容器更容易。
- 在不同的项目中可以re-used
- 与在整个应用程序环境中进行相比,识别问题和排除故障是轻而易举的事。此外,日志记录和报告可以更加准确和详细。
- Upgrades/Downgrades可以逐渐完全控制
- 安全性可以应用于不同级别的特定资源。
我有一个带有 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 集群。这应该会提供最佳性能。