【问题标题】:High availability web application - how to upgrade?高可用性 Web 应用程序 - 如何升级?
【发布时间】:2013-11-11 12:33:08
【问题描述】:

我们的 Web 应用程序(spring + jpa + mysql)的停机时间应该非常低。 目前,我们有一个负载均衡器,其中包含一个 3-tomcats 集群和会话复制,它运行具有单个数据源 (mySQL) 的相同 Web 应用程序。

就可用性而言,这很好用。

但是现在,

我们希望在不停机的情况下升级我们的 Web 应用程序。 天真的人只会说-关闭一个tomcat,部署新版本,然后重新启动它。 (为所有的 tomcats 做)你就完成了!

但是,考虑到 2 个 Web 应用变体将同时运行(旧版本和新版本),我们可能会遇到一些问题。

任何人都可以对我们在尝试实时升级时应该考虑的关键方面有所了解吗?有什么好的做法吗?有没有讨论这些问题的文章?

任何帮助都可以!

谢谢!

【问题讨论】:

  • 这个问题似乎跑题了,因为它不是一个编程问题。
  • 如果您认为由于您的数据库或所有实例共享的其他内容可能存在问题,请考虑在升级之前无法避免完全关闭 3 个实例,除非您也复制共享部分一个接一个地升级,但似乎很难实现。

标签: java mysql continuous-integration high-availability


【解决方案1】:

可以有几种策略来做到这一点。这是我通常使用的两种方法 -

  1. 并排运行两个版本。正如你所说,这可能会导致问题。为此,您需要提前进行测试,并确保您可以同时运行两者,并且您没有任何数据不一致(由于架构更改等)。

  2. 替换正在运行的版本。您可以通过建立一个新的 tomcat 集群然后切换负载平衡器来做到这一点。或者,如果您不是基于云的并且您不能这样做 - 从负载均衡器中取出一到两台服务器(最好在较短的时间内,以便您的应用程序可以处理负载)。替换流量不足的服务器上的版本。测试测试它是否正常工作。再次将它们放入流量并取出剩余的服务器,然后更新它们。

此外,请验证您是否有快速回滚方法,以防您的版本出现问题并且您仅在生产中发现它...

【讨论】:

  • Toda 为您的答复 Rotem,一个快速的问题 - 如果我采用您的方法(无云),那么数据库更新呢?
  • 好吧,再一次,事先测试一下,您不会在旧版本和新版本中搞砸任何东西,并且您的新数据库版本可以与两者一起使用 :-) 我认为您的数据库有一些冗余(主从?)。所以你可以做的一件事就是停止复制,升级你的奴隶。把它放回去,让数据复制。切换从属为主(指向你的服务器使用它),切换复制方向。然后在另一个实例上做同样的事情。