如何将更改部署到生产网站,同时又不导致网站暂时瘫痪?

如何将更改部署到生产网站,同时又不导致网站暂时瘫痪?

我使用 Git 来管理我的 Web 应用程序的开发周期,对于git pull足够多且不需要更改的更改,我只是自然地保持网站的正常运行和git pull更改。

但我在想,假设我有 100 个文件被修改,并且磁盘上有一些意外的负载,如果有人发出请求会发生什么期间git 在磁盘上提交更改的那一刻?这是否会使我的应用程序容易受到数据损坏或格式错误的响应的影响?

我的意思是,对于流量较低的网站来说,这种情况极不可能发生,但如果您的网站流量真的很高,而且服务器负载恰好激增,那就存在一定的风险。


我实际上想到了一个解决方案,但如果我自己实现,它可能不是最好的,而且我不确定它是否实用。我记得读过一篇文章,介绍我们如何在屏幕上看不到伪影,基本上是通过将新数据写入 GPU 内存上完全不同的块,然后只需切换最新的屏幕数据(无论叫什么)指针到新块,并可能最终丢弃或重新使用旧块。这样,如果 GPU 滞后,就不会显示半写入的数据

如果能够实现类似的事情,这是否实用?

答案1

您将需要一个负载均衡器。它可以提供滚动升级、高可用性和扩展。

大型、非平凡但始终在线的网站会不断发生细微变化。也许他们正在推出每日更新,或者某些功能出现故障但系统仍在运行。他们决定,略有不同的用户体验不值得关闭。您需要自行决定您的解决方案是否包括计划停机时间。

在单个 Web 服务器上,某些部署方法可以实现更清晰的过渡。预先部署代码然后将其移动到位比实时更新工作副本更简洁。尽管这没有考虑到数据库、Web 服务器更新和其他复杂情况。您仍然希望负载平衡器为您提供选项。

答案2

实现此目的的典型方法之一是,无论您是否使用git(但使用它,您可以使用它的一些钩子实现此方案),即在网站上有一个目录,您将每个新“版本”安装在其自己的特定目录中,例如在其名称中包含日期/时间戳。 Web 服务器当前使用的真正实时内容位于另一个路径中,该路径是指向一个“版本”目录的符号链接。

在您的传输完成后,并且您检查一切顺利(没有丢失的文件、合理的内容、正确的 Unix 权限、没有悬空的符号链接等...)后,您只需将符号链接从“生产”路径更改为新的“版本”路径。

更改符号链接几乎是原子的,因此不会造成任何中断。

这也允许您轻松返回:只需再次更改符号链接。

相关内容