【问题标题】:Parallel query execution on multiple database servers (running Microsoft SQL Server)在多个数据库服务器上执行并行查询(运行 Microsoft SQL Server)
【发布时间】:2009-02-16 08:46:06
【问题描述】:

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

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

更新

我的意思是这样的:

  • 有两个2服务器:Server1Server2
  • 服务器主机数据库 FooFoo 的两个实例都是相同的
  • 我连接到 Server1 并提交了一个复杂的(大量连接、大量计算)查询
  • Server1 决定应该在 Server2 上进行一些计算,并且也应该从该服务器读取一些数据 - 查询的适当部分被发送到 Server2时间>
  • 两台服务器都读取数据并执行必要的计算
  • 最后,将Server1Server2的结果合并返回给客户端

所有这些都应该自动发生,无需显式引用Server1Server2。我的意思是这样的并行查询执行——有可能吗?

更新 2

感谢 John 和 wuputah 的提示。

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

更新 3

引用Top Tips for SQL Server Clustering 文章:

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

【问题讨论】:

  • 很酷的问题,但你可以澄清你的目标/意图。基本上,这与主-主复制有何不同?

标签: sql-server database


【解决方案1】:

您真正谈论的是集群解决方案。看起来SQL ServerOracle 对此有解决方案,但我对它们一无所知。我猜想它们的购买和实施成本会很高。

可能的替代建议如下:

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

希望这会有所帮助!


RE 更新 1:

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

这里是discussed on SO previously,所以你可以在那里找到更多信息。


RE 更新 2:

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

【讨论】:

    【解决方案2】:

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

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

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

    例如,服务器 A 可能保存我的客户表,服务器 B 保存我的订单表。可以使用分布式查询来运行同时引用服务器 A 和服务器 B 的查询,每个服务器管理其本地数据的处理(这可以结合使用并行性)。

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

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

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

    我希望这会有所帮助,当然,如果您有任何问题,请随时提出。

    【讨论】:

      【解决方案3】:

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

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

      如果有两个并发用户(可以说具有相同难度的查询),那么我很难看到这有帮助:(

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

      这基本上是联合数据库服务器。我可以说,我可以将我的美国客户及其订单放在一台服务器上,将我的欧洲客户/订单放在另一台服务器上,而不是将我的所有客户放在一台服务器上,而将我的所有订单放在另一台服务器上,并且只有当我的查询跨越两者时才存在任何需要合并步骤。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-24
        • 2014-05-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多