我们目前有一个基于 Java 的 Web 应用程序,它在 WebSphere 上运行并访问 SQL Server 2008。
该应用程序需要频繁更改代码和文件,因此我们至少每月更新一次 WebSphere 中的 EAR 文件,但通常更频繁。它是一种数据库密集型应用程序。
停机对我们来说代价极其昂贵,目前我们尽量在负载最少的时候停机(工作日凌晨 3 点左右)。从长远来看,这似乎不是一个选择(尤其是考虑到我们的应用程序频繁更新),我们正在寻找更好的托管设置,例如集群。我们希望通过新的设置解决我们的其他一些问题(到目前为止,我们一直在寻求变通方法)。
我们考虑的是多节点集群。我对集群的理解还很初级,所以如果下面的任何假设有误,请告诉我。
以下是我们的新要求:
- 我们应该能够部署应用程序的新版本而无需任何停机时间(或仅仅几秒钟)。
- Web 请求的负载平衡。
- 能够处理故障转移。
我有几个问题:
- 您推荐哪种服务器设置?
- 考虑到我们有一个数据库,除非我们有两个集群(一个用于数据库,一个用于应用程序的 Web 层),否则真的有可能确保接近零停机时间吗?
- 如果我们只有一个用于 Web 层的集群(以及专用服务器上的数据库),那么是否能够让我们在不停机的情况下部署新版本的应用程序?
- 我们的 Java 应用程序被编写为在单个 JVM 上运行。如果我们将其部署在 WebSphere 上,WS 会自动让应用程序在集群上运行吗?或者我们必须使用像 Terracota 这样的集群感知 JVM?
答案1
听起来你需要两个集群。你需要一个用于 Web 应用程序的负载平衡集群,并在 Web 服务器前面安装一个负载平衡器来平衡 Web 流量,这样如果一台服务器出现故障,另一台服务器就可以处理负载。这样,你就可以从集群中取出一台机器,对其进行升级并更改数据库,然后移除装有旧版本的机器,放入装有新版本的机器。
在数据库方面,您需要一个主动/被动集群。这样,如果运行 SQL 实例的节点发生硬件故障,服务可以在几秒钟内重新启动。如果发布不当,或者数据库发布过程锁定了数据库对象,这不会阻止中断。这也不会在集群的两个(或更多)节点之间扩展数据库的负载。SQL 集群每次都在单个物理节点上运行 SQL 实例。
答案2
这可能不言而喻,但请不要忘记,您依赖 JVM 同步或单例/全局数据的任何内容在集群 WebSphere 服务器之间将不再安全。
我无法解决有关将集群感知 JVM 与 WebSphere 结合使用的问题。我知道 WebSphere 通常不支持在其自己的 JVM 之外的任何 JVM 上运行,但 Google 确实表示有些人正在组合这些产品。
对于 WebSphere 来说,您还需要考虑在应用程序服务器前面有什么可以维持与特定集群成员的会话亲和性,以及在集群成员发生故障时支持故障转移。这通常由 WebSphere 插件处理用于特定的 Web 服务器,例如 IBM HTTP Server 或 Microsoft IIS。
然而,我们的经验是,即使你故意关闭一个集群成员,请求仍然不会立即开始路由到其他集群成员。。
如果您需要会话故障转移(在我看来,这不是必需的),您还必须为分布式会话配置会话管理器(通过数据库存储或通过内存到内存会话复制)。这还会对您在会话中存储的内容带来额外的限制,因为其内容现在必须是可序列化的。并且您必须选择一种可用的策略来决定何时将数据存储或复制到分布式位置。