2015-07-01 64 views
0

当我使用PHP开发和更新生产服务器上的文件时,我只是即时复制文件,似乎所有内容都可以在不中断服务器的情况下工作。在使用Go时在生产服务器上更新代码

但是,如果我要更新Go服务器和应用程序上的代码,并且需要终止服务器,请将src文件复制到服务器,运行go install,然后启动服务器,这会中断服务,如果我经常这样做,那么对于我的服务用户来说这会非常糟糕。

如何在Go Go的http服务器上使用Go而不停机时更新文件?

+1

在本地进行编译(如有必要,进行交叉编译),然后将二进制文件复制到服务器。一个文件。你不需要在你的服务器上编译它。 – elithrar

+0

这会导致数据损坏,因为在覆盖二进制文件的同时覆盖或写入用户的同时进行读取? – Alex

+0

不要覆盖。复制到临时位置,停止服务(如果必须,请优雅地),覆盖旧的二进制文件并开始替换。有更多优雅的方法来交换它们,但除非你真的无法在几秒钟的计划停机时间内存活,否则它们会涉及更多的复杂性。例如像Einhorn的插座管理器 – elithrar

回答

1

恩库将允许您为您的用户做优雅重启无烦恼:https://github.com/facebookgo/grace

然而,在我的经验,重新启动进入应用是如此之快,除非你有一个高流量的网站也不会造成任何麻烦。

+0

谢谢,我会用它! – Alex

0

首先,不要按顺序进行。先复制并安装。然后你可以停止旧的过程并运行新的过程。

如果您运行应用程序的多个实例,那么您可以执行滚动更新,以便在您退回一台服务器时,其他服务器仍在服务。一个类似的方法是做blue-green deployments,它的优点是你的活动集群运行的代码总是同质的(而在滚动部署期间,你将有一个混合物,直到它们全部滚动),并且你也可以做蓝绿色部署,通常只有一个应用程序实例(而滚动需要多个实例)。但是,它要求您在蓝绿色开关过程中将实例数加倍。

您需要考虑的一件事是任何正在进行的请求 - 您可能需要确保正在传送的请求继续到达旧代码服务器,直至完成。

您还可以查看平台即服务解决方案,该解决方案可以为您自动完成大量此类工作,还有更多。这样你就不用手动生产服务器和复制文件了。在思考行动时,12 Factor App原则总是一个很好的开始。

2

PHP是一个interpreted language,这意味着你提供你的代码的源代码格式和PHP解释器将读取它并执行它(它可能会创建一个更紧凑的二进制形式,以便它不必再次分析源时需要)。

Go是compiled language,它编译成本机可执行二进制文件;进一步它是静态链接这意味着您的应用程序所涉及的每个代码和库在创建可执行文件时被编译和链接。这意味着你不能将新的go模块“插入”到正在运行的应用程序中。

您必须停止正在运行的应用程序并启动新版本。但是,您可以最大限度地缩短停机时间:只有当新版本的可执行文件已经创建并准备运行时,才能停止正在运行的应用程序。您可以选择在远程机器上编译它并将二进制文件上传到服务器,或者上传源代码并将其编译到服务器上,这并不重要。

通过这种方式,您可以将停机时间减少到最多几秒钟,您的用户不会注意到这一点。此外,您不应每隔一小时更新一次,只需一个小时的编码就无法实现重大更新。您可以每天安排更新(甚至更少),并且您可以在流量较低时安排它们几个小时。

如果即使几秒钟的停机时间对您来说也是不可接受的,那么您应该寻找可以自动处理这种情况的平台,而不会出现任何停机时间。例如,查看Google App Engine - Go

+0

谢谢你的建议! – Alex

相关问题