大型 Microsoft SQL Server 数据库的文件、文件组和 RAID 类型的最佳设置

大型 Microsoft SQL Server 数据库的文件、文件组和 RAID 类型的最佳设置

首先 - 虽然我完全愿意接受建议;但我也想知道是否有任何好的方法来提前测量/收集数据,以便我可以确定要遵循哪些“经验法则”以及要跳过哪些。

我无法显著地改变应用程序的模式,尽管我怀疑开发人员对索引有些着迷;但我还不想取出他们的索引并替换它们。

我有一个用于电话应用程序的大型数据库,大约 60GiB 左右。数据主要分为以下几部分:

  • 流量表(持续的顺序写入,偶尔对任意数量的索引进行长时间扫描以进行报告,增长迅速。相关索引也非常大。)
  • BILLING 表(持续顺序写入,经常沿着 account_info 扫描以获取用户信息)
  • 其余所有内容(不断随机访问读取和写入,比其他两个表更频繁。)

我现在在一台单核机器上,其中 3Gb 专门用于 SQL Server,磁盘缓存在 SQL Server 2005 中。msdb 数据库和操作系统位于 15k 硬盘驱动器上,RAID 1。日志文件和备份驱动器位于 15k 硬盘驱动器上,RAID 1。电话数据库全部位于 2 x 15k 硬盘驱动器上,RAID 10。(总共八个驱动器。)

我正在大规模升级硬件。将在 Server 2008 R2 x64 上安装 SQL Server 2008 R2、12 核、32GB RAM。它将有四个内部硬盘,可能用于操作系统和备份,但最大的变化是附加存储 - 外部 SAS 接口上的 12 x 15k 驱动器。

我们当前服务器的 CPU/I/O 有点受限,但这还不至于太麻烦 —— 新服务器将解决很多问题 —— 但这次我还是宁愿把它做​​“对”。

我可以做一个由 6 个磁盘组成的大型 RAID 10,并将整个数据库放到上面,但我一直在考虑将 TRAFFIC 及其索引文件拆分到单独的分区上 - 并且可能还有 BILLING。此外,其他所有内容可能在自己的文件中运行良好。

当然,总是有 RAID 10 与 RAID 5/6 以及 RAID 50/60 需要考虑。

我很想得到一些指导,关于如何做出这个决定,以及如何确定是否值得拆分驱动器以将 TRAFFIC/BILLING 分开 - 以及我是否可以接受两个文件组(PRIMARY 和 USERDEFINED)或者我是否需要更多。

顺便说一下,sizeof(TRAFFIC) = sizeof(BILLING) * 2 >> sizeof(EVERYTHING ELSE)

谢谢,

答案1

让我们从顶部开始。

我有一个用于电话应用程序的大型数据库,大约 60GiB 左右

换言之:我的数据库非常小。说真的,60 GB 的规模大约是 10 年前的事了。相比之下:我有一个 800 GB 且还在增长的财务数据库,其中 95% 的数据都在一个表中 ;)

它将有四个内部硬盘,可能用于操作系统和备份,但最大的变化是附加存储 - 外部 SAS 接口上的 12 x 15k 驱动器。

以下是我要做的事情:

  • 镜像两个磁盘用于启动。将 64gb 分区放在下面,其余部分用作 TEMP。您不希望看到那里有大量 IO。
  • 镜像接下来的 2 个磁盘以用于日志文件。如果它们在 IO 上运行速度很快 - 用 SSD 替换它们。考虑到您所做的更改量很小...小型 80gb SSD 应该足够了。

  • 其余的 (12 张光盘),组成了巨大的 RAID 10。

更重要的是您重新配置我们的服务器以使用:

  • tempdb 至少有 12 个数据和日志文件。请勿自动增大这些文件。修复它们。
  • 至少 12 个日志文件。不是开玩笑。这里也不会自动增长。
  • 最少 12 个数据库文件。我说过 - 不自动增长吗?

当然,总是有 RAID 10 与 RAID 5/6 以及 RAID 50/60 需要考虑。

值得考虑的是,考虑到 Raid 10 与其他方案之间的巨大性能差异 - 对于任何需要高 IO 的情况,它们都比 Raid 5/6/50/60 好得多。RAID 5/6 只有在您放入 SSD 驱动器时才有意义 - 然后显著的 IO 损失将被完全抵消。实际上,考虑到您的数据库大小,使用 2x15 SAS 磁盘在财务上可能很愚蠢。获得 2 x200gb REALSSD 驱动器,如果 RAID 10 超过您的 30 个驱动器,您的 IO 性能将提高约 100 倍。考虑到基础设施的巨大成本,您可能会在此过程中节省大量资金。

实际上最明智的做法是不要订购整个 SAS 东西 - 您有 4 个驱动器插槽,将操作系统放在两个驱动器上,在另一个驱动器上使用 200gb SSD 镜像。完成。而且比您的 SAS 东西快得多 ;) 拥有一个微不足道的数据库大小的乐趣。检查http://www.fastestssd.com就当前状态而言。现代 SSD 在该设置下可实现 200mb 持续随机速率,即使不是顶级的。这将严重抵消您从 SAS 设置中获得的平庸 IO 带来的流量。

或者:30 个 SAS 磁盘可能为 4800 IOPS。RealSSD 在一个磁盘上可达到 50,000 IOPS,在“低谷时期”约为 36,000 IOPS。这意味着一个 SDD 在低谷时期比 12 个磁盘设置快 7.5 倍。在高峰时期快 10 倍左右。哎哟。

请小心正确对齐分区并正确格式化文件系统(提示:不要使用标准的 4kb 节点大小 - 对于 SQL Server 来说很愚蠢)。

我可以做一个由 6 个磁盘组成的大型 RAID 10,并将整个数据库放到上面,但我一直在考虑将 TRAFFIC 及其索引文件拆分到单独的分区上 - 并且可能还有 BILLING。此外,其他所有内容可能在自己的文件中运行良好。

那将是 SQL Server 的愚蠢滥用。考虑到它在文件之间进行负载平衡,并且希望/要求每个组有多个文件(每个逻辑处理器一个),它不会获得任何好处 - 恰恰相反。如果文件和索引最终位于同一磁盘上,那么分离它们将毫无意义。对于您来说,最好使用一个文件组,12 个文件。如果您希望以后具有可扩展性,您可能希望从 48 个数据文件开始 - 为您提供最多 48 个处理器核心的空间。

您可能希望使用两个文件组来将账单数据从波动性较小的文件组中分离出来/请求,但不是为了直接提高速度,而是为了有可能在以后不进行重组的情况下将它们完全移动 - 这就是我对我的财务数据库所做的。

最后一句话:无论是谁购买了服务器,硬件方面的决定都是错误的。没有理由为这么小的东西配备外部 SAS 托盘。我的数据库服务器来自 SuperMicro,在 2 个机架单元高度上有 24 个磁盘插槽。这是没有外部笼子的。我真的不想在这里比较数字 - 但我敢打赌这浪费了很多钱。

答案2

我将链接到一份白皮书,其中介绍了如何回答这个确切的问题。虽然我们所有人都可以提供一般性建议,但实际上,回答这个问题取决于实际 I/O 利用率。以下白皮书讨论了如何测量这一点以及如何相应地规划磁盘子系统(并测试新硬件以确保其达到标准)。此外,最后还有很多其他链接可以真正深入研究这一领域:

部署前 I/O 最佳实践

答案3

这也应该有助于 google dmv all stars!

http://technet.microsoft.com/en-us/library/cc966540.aspx

关联

关联

windchill 条目几乎涵盖了 SQL 服务器性能调优的所有领域

相关内容