SQL Server上的高可用性(build议)

我们有一个数据库密集型Java应用程序 我们使用的数据库是SQL Server 2008。

我们正在考虑将我们的Java应用程序转移到2-3节点负载平衡群集。 我们经常应用function添加/错误修复(因此新版本)。 每当发布任何数据库更改时,我们都可以通过从集群中一次获取一个节点来进行维护并在其上部署较新的应用程序来更新Java应用程序。

但是,有时我们会发布涉及更新数据库的版本。 (我们运行脚本和存储过程来添加,删除或更新数据库上的数据。)这些操作有时需要大约一个小时。 有没有办法以某种方式处理这个问题,以便在更新数据库的这段时间内不需要停止使用应用程序?

在这种情况下,任何types/configuration的聚类都可以帮助吗? 在任何一种解决scheme中,我们在2台服务器上有数据库(使用镜像或其他),并且我们将一台服务器离线进行更新过程,当更新结束时,我们使服务器重新联机并更新其更改那是从另一台服务器上取下来的?

我不熟悉群集(对于SQL群集更是如此)。 所以请原谅,如果上述段落令你感到尴尬或听起来很尴尬。

感谢您的回答。

简而言之,不,您不能在两台服务器上运行SQL Server数据库,并在更新时分裂它们。 如果你这样做,SQL Server将无法让两个系统重新同步。 一旦你把它们分开,你可能会在两边改变同一行,或者改变模式等等,这样就不可能把所有的东西都弄回去。

进行升级时,请停机。 在你的configuration文件中添加一个标志,以便在数据库更改完成时,可以快速轻松地将该站点脱机。 或者以这样的方式编写应用程序和更改,使更改不会使网站停下来,使网站在更改完成后继续工作,然后将新网站置于更改之上。

如果正确地完成了大部分的数据库更改,应该能够在不占用UI的情况下进行。

真正的问题是,当更新完成时,是否需要从应用程序写入数据库? 如果您可以处理只读,则可以拍摄数据库的快照,以快照的只读模式运行应用程序,将更新应用到实际的数据库,然后切换应用程序以使用真实的数据库完了。

我认为这里有一个基本的问题,虽然“集群”,因为你在谈论的不是真正的集群,你是在谈论更类似于事务复制的东西(为了能够获得“负载平衡”你正在谈论)。 使用集群,只有一个活动节点,除非在单个集群上有多个SQL实例,但是这需要重新编程应用程序来处理单独的实例,而且它不会真正达到您想要的效果。

TomTom提到的primefaces性是真正的问题,但是在处理你所谈论的那种变更pipe理的时候。 如果在升级其中一个实例时使其中一个实例处于可写模式,则在实例之间进行升级时,可能会在实例之间存在不一致的数据,因为您的脚本将代码更改为新版本。

你告诉我们 你可以处理应用程序更新一个服务器上的数据库,而另一个正在更新? 你遇到了一个严重的问题,只是失去了很多有保证的SQL行为(primefaces性)。 这只能通过编程来解决,而不能通过自动化技术来解决。

所以,你不能问聚类是否好(提示:不是)。 如果你运行一个数据库的多个副本,并取下一个,你如何处理临时更新并重新同步?