在多个数据库服务器上执行并行查询(运行Microsoft SQL Server)

时间:2009-02-16 08:46:07

标签: sql-server database

是否可以配置多个数据库服务器(所有托管相同的数据库)同时执行单个查询?

我不是要求同时使用多个CPU执行查询 - 我知道这是可能的。

更新

我的意思是这样的:

  • 共有两台服务器: Server1 Server2
  • 服务器主机数据库 Foo Foo 的两个实例完全相同
  • 我连接到Server1并提交一个复杂的(很多连接,很多计算)查询
  • Server1 决定应该在 Server2 上进行一些计算,并且应该从该服务器读取一些数据 - 查询的相应部分将发送到服务器2
  • 两台服务器都读取数据并执行必要的计算
  • 最后, Server1 Server2 的结果合并并返回给客户端

所有这些都应该自动,而无需显式引用 Server1 Server2 。我的意思是这样的并行查询执行 - 是否可能?

更新2

感谢John和wuputah的提示。

我正在研究提高MOSS数据库后端的 可用性和容量的替代方案。所以我正在寻找的是一种开箱即用的SQL Server负载平衡解决方案,它对应用程序透明,因为我无法修改应用程序以任何方式。 我猜SQL Server没有这样的功能(据我所知,Oracle也是如此 - 它是wuputah提到的RAC)。

更新3

Top Tips for SQL Server Clustering文章的引用:

  

让我们首先揭穿一个共同点   误解。您使用MSCS群集   高可用性,而不是负载   平衡。此外,SQL Server没有   有任何内置的,自动的   负载平衡能力。你必须   通过你的负载平衡   应用程序的物理设计。

3 个答案:

答案 0 :(得分:3)

您真正在谈论的是群集解决方案。看起来SQL ServerOracle有解决方案,但我对它们一无所知。我猜他们购买和实施它们的代价非常高。

可能的替代建议如下:

  • 使用主从复制,并从从属执行复杂的读取查询。所有写入必须发送到主服务器,然后发送到从服务器,因此事情保持同步。这有助于事情变得更快,因为从属设备只需要担心来自主设备的写入,这些写入已经代表从设备预先确定(没有死锁等)。如果你想使用多台服务器,这是我要开始的第一个地方。
  • 使用主 - 主复制。这意味着来自两个服务器的所有写入相互转换,因此它们保持同步(至少在理论上)。这有一些作为主从的好处,但您不必担心写入一个服务器而不是另一个服务器。主 - 主复制的更常见用途是用于故障转移支持;主从更适合表现。
  • 使用John Sansom所谈到的功能。我不太了解它,但似乎它的基础是将您的数据库分成不同服务器上的表,这将带来一些好处和缺点。最大的问题是,由于这两个系统无法共享内存,因此必须通过网络共享大量数据来计算复杂的连接。

希望这有帮助!


RE Update 1:

如果你无法修改应用程序,那就有希望了,但它可能有点复杂。如果要设置主从复制,则可以设置代理以将读取查询发送到从属服务器并将查询写入主服务器。我已经看到这是用MySQL完成的,但不是SQLServer。除非您想自己编写代理,否则这有点问题。

这是discussed on SO previously,因此您可以在那里找到更多信息。


RE Update 2:

Microsoft的群集可能不是为性能而设计的,但这是Microsoft的错误。这仍然是你在这里谈论的复杂程度。如果他们说它无济于事,那么您的选择仅限于上述内容以及您对应用程序的操作(例如分片,拆分为多个数据库等)。

答案 1 :(得分:2)

是的,我相信这是可能的,好吧,让我解释一下。

您需要研究和研究分布式查询的使用。分布式查询跨多个服务器运行,通常用于引用未存储在本地的数据。

http://msdn.microsoft.com/en-us/library/ms191440.aspx

例如,服务器A可以保存我的Customers表,而服务器B保存我的订单表。可以使用分布式查询来运行引用服务器A和服务器B的查询,每个服务器管理其本地数据的处理(可以包含并行性的使用)。

现在理论上,您可以在每个服务器上存储完全相同的数据并专门设计查询,以便在某些服务器上仅引用某个表,从而分配查询负载。然而,就CPU而言,这不是真正的并行处理。

如果您的目标是分发应用程序的处理负载,那么SQL Server的典型方法是使用Replication在多个服务器之间分配数据处理。此方法也不能与并行处理混淆。

http://databases.about.com/cs/sqlserver/a/aa041303a.htm

我希望这会有所帮助,但当然请随意提出任何问题。

答案 2 :(得分:1)

有趣的问题,但我很难理解这对多用户系统有益。

如果我是在Server1上完成一半查询的唯一用户,而在Server2上的另一半听起来很酷:)

如果有两个并发用户(假设有相同难度的查询),那么我很难看到这有助于:(

我可以在服务器和负载平衡上拥有相同的数据 - 所以我得到Server1,我的伙伴得到Server2 - 或者我可以将一半的数据放在Server1上,另一半放在Server2上,每一个都将被优化,并且缓存,只是他们自己的数据 - 分散负载。但是,无论何时必须进行合并以完成查询,限制因子都会成为它们之间的管道大小。

基本上是联合数据库服务器。我可以说,不是将我的所有客户都放在一台服务器上,而是将我的所有订单放在另一台服务器上,我可以将我的美国客户和他们的订单放在一个,而我的欧洲客户/订单放在另一个,而且只有我的查询跨越两者都在那里任何需要合并步骤。