生产中更新nodejs,停机时间为零

时间:2016-05-02 06:25:28

标签: node.js

有几个软件包可以在生产模式下更新节点js应用程序,停机时间为零(或正常重新加载),例如pm2

但是,是否可以更新节点js本身,例如从LTS版本4.x更新到生产中的新版本6.x,停机时间为零?

3 个答案:

答案 0 :(得分:6)

只要具有冗余,就可以使用您想要更新的任何内容来更新生产,无需停机。我们每天都在工作。

升级节点是常规,只要安装节点是部署过程的一部分,例如使用nvm

当然,您需要多台服务器。

先决条件:假设您的代码是版本1.0,在dev中升级node.js,测试您的代码,保留所需的节点版本(package.json,.nvmrc或您的安装脚本需要的任何内容)并将其添加到1.1额外检查您的服务器操作系统有节点6要求。 (例如,Centos 6无法安装节点4)

通用零停机时间滚动部署过程,假设您在服务器场中有4台服务器:

  1. 从服务器场中删除服务器1。如果你使用持久性 连接(websocket),发信号通知现有客户 服务器重新连接(到服务器2,3和4)
  2. 将1.1版部署到新服务器。这应该包括重新安装节点(例如nvm install)直接连接到它 并检查一切正常。
  3. 对服务器2执行相同操作(从服务器场移除,信号客户端,部署新版本),因此我们没有单点故障。您的应用仍然由服务器3和4提供服务
  4. 将服务器1和2放回服务器场并删除3和4.如果需要,请重新连接信号3/4客户端。
  5. 升级服务器3和4并将它们放回服务器场
  6. 完成。所有服务器都已升级,如果您的应用程序编码良好,客户端也没有注意到任何内容。

答案 1 :(得分:1)

要做零停机时间,您需要确保有人一直在处理用户请求,因此在您杀死旧版本的过程的那一刻,新版本必须已经绑定到具有相同应用程序的同一端口。

因此,在这种情况下零停机时间最重要的部分是负载平衡。为此,您应该在应用程序前面安装HAproxy,nginx等多个节点进程,以便您可以单独杀死并替换每个节点。

通常,为所有生产运行一个节点进程并不是一个好主意,因此如果您没有任何负载均衡器,请安装一个甚至以一些停机时间为代价。然后在其后面放置至少两个单独的服务器(或容器),并使用pm2运行您的应用程序。

此外,请注意,即使有冗余,如果您只是重新启动一个节点,您的应用程序也会中断客户端 - 例如。如果有人在发生这种情况时上传文件。

HAproxy有一个功能,您可以禁用其中一个后端,但等待所有与它的http连接以自然方式完成,而haproxy不向它发送任何新流量。这就是你确保没有用户被打断的方法。

此处配置示例:https://blog.deimos.fr/2016/01/21/zero-downtime-upgrade-with-ansible-and-haproxy/

答案 2 :(得分:1)

除了这里提到的rolling update之外,还有一个简单的&显着的技术来更新应用程序,零停机时间,称为blue / green部署。

您只需启动现有基础设施的整个副本,即blue,然后在那里执行必要的更新。当新的blue infra准备就绪时测试 - 切换到它的流量并使旧的green infra空闲。

这种方式"如果出现问题"你总是有安全的选择回滚到旧的基础设施。 当您确定新的blue在加载下正常工作时 - 只需删除旧的green版本。

我建议采用这种方式进行复杂的操作,而不是接触现场制作。

更多:https://cloudnative.io/docs/blue-green-deployment/

相关问题