在考虑停机时间的任何环境中,您肯定会运行某种服务器集群以通过冗余来提高可靠性。我会从集群中取出一台主机,对其进行更新,然后将其放回集群中。如果您有一个无法在混合环境中运行的更新(例如,数据库上需要不兼容的架构更改),您将不得不关闭整个站点,至少暂时关闭。诀窍是在丢弃原件之前启动替换过程。
以 tomcat 为例 - 您可以使用 CATALINA_BASE 定义一个目录,在该目录中可以找到所有 tomcat 的工作目录,与可执行代码分开。每次我部署软件时,我都会部署到一个新的基本目录,这样我就可以将新代码驻留在磁盘上,与旧代码相邻。然后,我可以启动另一个指向新基目录的 tomcat 实例,启动并运行所有内容,然后将旧进程(端口号)与负载平衡器中的新进程交换。
如果我担心跨交换机保留会话数据,我可以设置我的系统,使每个主机都有一个合作伙伴,它将会话数据复制到该合作伙伴。我可以删除其中一台主机,对其进行更新,将其重新启动,以便它恢复会话数据,然后切换两台主机。如果集群中有多个pair,我可以丢弃一半的pair,然后进行批量切换,或者我可以一次做一对,具体取决于发布的要求、企业的要求等. 然而,就个人而言,我更愿意让最终用户遭受非常偶然的活动会话丢失,而不是尝试在会话完好无损的情况下进行升级。
这完全是 IT 基础架构、发布过程复杂性和开发人员工作量之间的权衡。如果您的集群足够大并且您的愿望足够强烈,那么设计一个系统可以很容易地进行更换,而无需停机进行大多数更新。大型架构更改通常会导致实际停机,因为更新的软件通常无法适应旧架构,并且您可能无法将数据复制到新的数据库实例,进行架构更新,然后将服务器切换到新数据库,因为从新数据库克隆后,您将错过写入旧数据库的任何数据。当然,如果您有资源,您可以要求开发人员修改新应用程序以对所有更新的表使用新表名,并且您可以在实时数据库上放置触发器,这将使用数据正确更新新表,因为它是由先前版本写入旧表的(或者可能使用视图来模拟另一个模式)。启动您的新应用服务器并将它们交换到集群中。如果您有开发资源来构建它们,则可以玩大量游戏以最大程度地减少停机时间。
在软件升级期间减少停机时间的最有用的机制可能是确保您的应用程序可以在只读模式下运行。这将为您的用户提供一些必要的功能,但让您能够进行需要数据库修改等的系统范围的更改。将您的应用程序置于只读模式,然后克隆数据、更新架构、针对新数据库启动新的应用程序服务器,然后切换负载均衡器以使用新的应用程序服务器。您唯一的停机时间是切换到只读模式所需的时间和修改负载均衡器配置所需的时间(其中大部分可以在没有任何停机时间的情况下处理它)。