我正在寻找一些关于为 SQL Server 设置磁盘/分区的最佳方法的建议。以下是我的一些主要担忧:
应该如何分隔 SQL 文件(数据文件、日志、临时文件)?
RAID 大量 HDD 并分区空间或创建多个 RAID,每个 RAID 的磁盘更少?
数据和日志文件是否应该在不同的 RAID 类型上?
默认数据库(master、msdb 等)应该位于 C: 上还是应该与其他数据/日志文件位于同一位置?
我正在寻找一些关于为 SQL Server 设置磁盘/分区的最佳方法的建议。以下是我的一些主要担忧:
应该如何分隔 SQL 文件(数据文件、日志、临时文件)?
RAID 大量 HDD 并分区空间或创建多个 RAID,每个 RAID 的磁盘更少?
数据和日志文件是否应该在不同的 RAID 类型上?
默认数据库(master、msdb 等)应该位于 C: 上还是应该与其他数据/日志文件位于同一位置?
这是一篇不错的博文: http: //sqlserveradvisor.blogspot.com/2009/03/sql-server-disk-configuration.html
关于磁盘对齐的白皮书:http: //msdn.microsoft.com/en-us/library/dd758814.aspx
简而言之,您的操作系统应该在 RAID 1 上,数据文件在 RAID 10(最好)上,日志文件在 RAID 1 上。
SQL 性能文章:http ://www.sql-server-performance.com/faq/raid_1_raid_5_p1.aspx
PDF 上的 10 大最佳性能提示: http: //www.stlssug.org/docs/Best_Practices_for_Performance.pdf
还记得出于性能原因将您的 TEMPDB 放在单独的磁盘上。我相信 Paul Randal 会来这里并让你大吃一惊。
MS 说明了 tempdb 的原因:http: //msdn.microsoft.com/en-us/library/ms175527.aspx
这是一个很大的“取决于”问题。
我无法回答如何为您创建单个 RAID 阵列的问题,因为我不是存储专家,但我可以帮助您解决剩下的问题。
您需要考虑的第一件事是各种数据库的工作负载 - OLTP(读/写)或 DSS/DW(主要读)。对于读/写工作负载,您应该考虑 RAID 1 或 RAID 10 (RAID 1+0),因为它们提供冗余和出色的读/写性能。对于以读取为主的工作负载,您可以使用 RAID 5。RAID 5 不应用于读/写工作负载的原因是您在写入时会付出性能损失。
事务日志本质上是读/写的(或主要写,取决于您是否将事务日志用于任何事情 - 例如日志备份或复制),因此永远不应将其放在 RAID 5 上。
这意味着对于某些数据库和工作负载,您可能在 RAID 5 上拥有数据文件,在 RAID 1/10 上拥有日志文件,而对于其他数据库,您可能在 RAID 1/10 上拥有一切。更进一步,如果您有一个分区数据库,它可能包含一些以读取为主的数据和一些读/写数据,甚至可能在同一个表中。这可以分成单独的文件组,然后将每个文件组放在适当的 RAID 级别。
实际数据库的分离再次取决于工作负载和底层 IO 子系统的功能 - 例如,在单个 RAID 阵列上存储内容可能需要比在 SAN 上更高程度的分离。
Tempdb 本身就是一个特殊情况,因为它通常是一个负载很重的数据库,应该与其他数据库分开存储。系统数据库不应该被大量使用,只要有冗余就可以放在任何地方。
这是我帮助编写的白皮书的链接,它应该对您有所帮助:物理数据库存储设计。还要确保您的 IO 子系统可以处理预期的工作负载 - 请参阅此白皮书:部署前 I/O 最佳实践。最后,确保使用正确的 RAID 条带大小(在较新的系统上通常为 64K 或更高)、正确的 NTFS 分配单元大小(通常为 64K),并且在 Windows Server 2008 之前的系统上,正确设置磁盘分区偏移量. 有关这些的信息,以及指向更多信息的指针以及为什么要以这种方式配置它们,请参阅此博客文章:您的磁盘分区偏移量、RAID 条带大小和 NTFS 分配单元设置是否正确?.
底线:了解您的工作负载和您的 IO 子系统功能,然后相应地实施。
我希望这对你有帮助。
PS 就 tempdb 而言,您应该如何配置它是一大堆蠕虫,并且存在各种相互冲突的信息。我在Misconceptions around TF 1118上写了一篇关于 tempdb 数据文件配置的综合博文。
我设置的服务器的简短答案一直是
在单独的物理磁盘上记录日志,raid 1 或 10(条带化 + 镜像)
数据库在自己的磁盘上,取决于性能需求,通常是 RAID5
RAID 控制器上有大量缓存
最好将您的操作系统和 Windows 页面文件再次粘贴到单独的阵列上,通常只是一个镜像(Raid 1)。这使所有写操作保持分离,因此重型性能不会拖累一切。
我过去的经历是,数据库写入 + 日志写入 + 页面文件写入会使 Raid5 阵列陷入困境,并且性能将一败涂地。问题是你在测试、开发等方面的表现会很好。但是当你进入生产和使用猛增时,这个问题会出现“突如其来”并且用户投诉猛增。
这里有比我更好的 MSSQL 人员,但总的来说,我建议以下内容;
C 上的操作系统和代码: - 这应该是本地磁盘,应该是 RAID1 阵列对 - 我们为此使用 2 个 2.5 英寸 SAS 146GB 10krpm 磁盘,但您可以使用 2 个 SATA 7.2 磁盘。数据应该在一个非常快(10krpm 或更高)的 RAID 1/10、5/50/6/60 阵列上,无论您需要什么大小 - 我们将我们的存储在 FC SAN LUN 上,通常在“第 2 层”/10krpm 磁盘组上. 日志应该在一个单独的非常快(15krpm)小(10GB 或更少?)RAID 1 阵列对上 - 我们将我们的放在 FC SAN LUN 上,通常在一个非常小的“tier1”/15krpm 磁盘组或“tier0”/固态硬盘组。
无论哪种方式,您都希望将这些中的每一块放在单独的主轴/阵列上以提高性能-当然,它们都可以在单个磁盘上运行,但我想您正在寻找性能和成本的平衡点。
我们将 master/tempdb 与常规数据库一起存储,但您可以将其分解为单独的数据阵列 LUN。
希望这可以帮助。