在零停机时间更新生产中的nodejs

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

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

只要有冗余就可以用任何你想更新的方式来完成零停机更新生产。 我们每天都在工作。

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

当然你需要几台服务器。

先决条件:假设你的代码是1.0版,在dev中升级node.js,testing你的代码,坚持所需的节点版本(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并将其放回农场

完成。 所有的服务器都升级了,如果你的应用编码良好的话,客户端不会注意到任何东西。

为了实现零停机时间,您需要确保有人始终处理用户请求,因此在杀死旧版本进程的同时,必须使用相同的应用程序将新绑定到相同的端口。

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

一般来说,为所有生产运行一个节点进程并不是一个好主意,所以如果你没有任何负载均衡器,那么即使是在某些停机时间的情况下也要安装一个进程。 然后把至less两个单独的服务器(或容器)放在它后面,然后用pm2运行你的应用程序。

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

HAproxy有一个function,可以禁用其中一个后端,但等到所有的http连接都以自然的方式完成,而haproxy不会向它发送任何新的stream量。 这就是你如何确保没有用户中断。

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

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

您只需旋转现有infra的整个副本让我们说blue ,在那里执行所需的更新。 当新的blue基础准备就绪和testing – 切换到它的stream量,并使旧的green红外空闲。

这样“如果出了问题”,你总是有安全的select回滚到老的基地。 当你确定新的blue工作正常,只是删除旧的green版本。

我会build议这样的复杂的操作,而不是触及现场制作。

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