0

这只是提高sql server性能的一种尝试。

我们有一个带有 Sql Server 2008 企业版实例的 Windows Server 2008 服务器。SQL Server 的二进制文件、操作系统文件、MDF 文件、LDF 文件都驻留在一个磁盘上。

过去我们使用 NLB 为 IIS 提供负载平衡。我们有 2 台 Windows Server 2008 机器,并且在两台机器上配置了相同的网站,并且有一台单独的机器为网站提供数据。用户将访问虚拟 IP 地址,根据每个节点上的当前负载,集群将划分流量。

现在我想知道我是否可以尝试同样的方法来平衡 SQL Server 流量。我的计划是:

  1. 在 2 台不同的机器上安装 2 个 SQL 服务器实例。
  2. 将 MDF、LDF 文件放在对两个实例均可见的共享介质(例如 SAN、RAID 5)上,并将 MDF 和 LDF 附加到两个实例上。
  3. 将两个节点组成一个集群,让应用程序访问集群 IP 地址。

在这种情况下,就像 IIS 一样,集群会在 2 个节点之间分配流量,并且由于正在访问单个 MDF 和 LDF,我想不会有任何同步问题。

我的问题是:

  1. 这实际上会提高 SQL Server 的性能吗?
  2. 会不会有其他影响(我们在代码中使用了很多事务)?
4

1 回答 1

7

两个或多个 SQL Server 实例不能共享相同的 MDF/LDF 文件。每个 SQL 服务器都需要独占访问它自己的数据库文件。所以你不能以这种方式对 SQL 服务器进行负载平衡。

基本上有三种选择来处理这个问题。可能还有更多,但这是最常用的三个。

选项1:主从

一种选择是在主从场景中设置多个 SQL 服务器实例。一台数据库服务器是主服务器,它是您向其中写入所有数据和更改的数据库。从站与主站同步,您让 Web 服务器使用从站进行读取操作。由于大多数网站通常读取的数据多于写入的数据,这有助于提高数据库吞吐量。您将不得不更改您网站的代码,以使其与单独的数据库一起进行读写操作。从站可以位于负载均衡器之后,因此您的代码只需要支持一台写入数据库服务器和一台读取数据库服务器。读取时,负载均衡器会将负载平均分配给所有从属服务器。

选项 2:分片

在这种情况下,您将数据分布在多个数据库服务器上。一个简单的示例是分布在两个数据库服务器上的用户数据库。所有具有奇数 UserID(例如 1、3、5 等)的用户都存储在数据库服务器 1 上,所有具有偶数 UserID 的用户(例如 2、4、6 等)都存储在数据库服务器 2 上。这有平均而言,每个数据库服务器承担大约一半负载的优点。这也可以很好地扩展,因为您可以添加越来越多的数据库服务器并使用您自己的自定义模式越来越多地分发数据。您的代码必须更改以支持多个数据库服务器,但如果您有良好的多层设计,则必须更改一层以支持此模型。

选项 3:不要使用 SQL 数据库

使用非 SQL 数据库解决方案。这些在通用名称下变得越来越流行:NoSQL。这意味着“不仅仅是 SQL”。这并不意味着您根本不应该使用 SQL,而是意味着:不要将它用于所有事情。与 SQL 相比,还有许多其他数据库系统具有优势(和劣势),这可能是您问题的解决方案。这篇博文很好读:35+ 选择下一个 NoSQL 数据库的用例

您选择哪个选项取决于您的应用程序和数据库模型。您也可以同时使用这两种情况。例如,用户数据库的分片和订单表的主从(在网上商店中)。如果您需要事务支持或有大量连接操作,则在决定采用哪种方案时必须考虑到这一点。扩展数据库是一个相当复杂的话题,没有一个解决方案可以解决所有问题。

于 2012-11-19T12:39:17.073 回答