我听说RAID 5的写入性能有时会令人震惊。 虽然我想要它提供的冗余,我不想牺牲我的数据库插入/更新时间。
这是我应该担心的事情吗?如果是这样的话,那么build议如何在冗长的写作performance上取得成功呢?
通常build议使用RAID 10,因为I / O是非常随机的。 这是一个例子。 计算有点简单,但很有代表性。
假设您有6个驱动器arrays,您的驱动器可以每秒执行100个I / O(IOPS)。 如果读取率达到100%,则将使用全部六个驱动器,RAID 10和RAID 5的IOPS均将达到约600。
最坏的情况是100%写入。 在这种情况下,RAID 10的性能将被削减一半(因为每个写入到两个驱动器),所以它将获得300 IOPS。 RAID-5会将每个写入转换为两个读取,然后是两个写入,因此它将获得1/4的性能或大约150 IOPS。 这是一个非常大的打击。
您的实际读/写模式将介于这两个极端之间,但这就是为什么RAID 10通常build议用于数据库的原因。
但是,如果您没有繁忙的数据库服务器,那么您甚至可以使用RAID-6。 我经常这样做,如果我知道数据库不会成为瓶颈,因为它比RAID 10或RAID 5更安全。
事务数据库
由于控制器需要加载足够的数据来重新计算写入时的奇偶校验,所以RAID-5写入相对较慢。 写入操作至less需要四次磁盘操作:
读取奇偶校验块
读取旧块(假设它不在高速caching中)与奇偶校验块异或。
写新的奇偶校验块(旧的奇偶校验块XOR旧的数据块XOR新的数据块)
编写新的数据块。
如果系统不使用写回caching,则意味着所有这些操作都处于I / O完成的关键path上。 通常情况下,数据库写入就是这种情况 – 事实上,Microsoft(例如)有一个与SQL服务器一起使用的SAN设备authentication程序,要求供应商保证这种行为。 有时候旧的RAID-5设备没有使用这种优化,必须重新计算整个条带的奇偶性。
RAID-10为每个驱动器都有一个镜像,不需要读取额外的数据来计算奇偶校验。 这意味着写入需要更less的物理I / O。
RAID-50位于中间的某个位置,卷被拆分成多个RAID-5卷,然后进行条带化。 在由3 + 1scheme组成的组中制作的RAID-50上,写入最多会产生三个额外的磁盘I / O请求。 如果您觉得如此倾向,可以将RAID-5和RAID-10视为RAID-50的特例。 RAID-50主要用于跨多个物理磁盘提供大容量卷
其他奇偶校验scheme如RAID-6(每套有两个冗余磁盘的奇偶校验scheme)也是存在的,现代磁盘足够大,重新引导arrays可能需要相当长的时间 – 足够长的时间重build是相当重要的。 RAID-6通过拥有第二个奇偶校验磁盘来减轻这种风险,需要三次磁盘故障才能导致数据丢失。 RAID-50scheme的类似技巧可以用来制作RAID-60arrays。
最后,单个镜像对(称为RAID-1)可以为某些任务提供冗余和足够好的性能。 尤其是,您可能会发现RAID-1可以为您提供足够的吞吐量来处理大量的数据库日志stream量。 更多关于这个下面。
如果您有一个写入繁重的工作负载,您可能会从RAID-10卷中获得性能提升。 这可能是一个胜利,因为假设磁盘有足够的空间,可以从较小数量的物理磁盘获得所需的吞吐量)。 数据库服务器上的某些项目(例如日志或临时区域)应位于RAID-1或RAID-10卷上,因为这些项目会获得大量写入stream量。
日志
日志卷的特点是大多是连续的数据访问模式,本质上是一个环形缓冲区,由沿着'将数据写入该块'的命令组成。它们由核心DBMS引擎作为生产者写出,并作为conumer由日志阅读器function。 单个镜像对实际上会处理相当多的日志stream量。
繁重的系统和文件服务器
在诸如数据仓库等重读系统上,您可能需要使用一个或多个RAID-5卷。 在文件服务器上,磁盘访问将主要在整个文件的基础上完成,所以写操作可能会写出组成奇偶校验块的大部分块。 在这种情况下,RAID-5的性能将更轻。
在过去,磁盘上的成本节省可能很大,但现在不太可能成为问题。
回写式caching和RAID-5
在具有电池备份caching的SAN或内部RAID控制器上,您可以启用“回写”caching。 这将caching写入并将控制权返回给应用程序。 控制器报告I / O已完成。 但是,它不一定立即将数据写入磁盘。 该function可以使RAID-5奇偶读/写操作得到充分优化,并且可以减轻RAID-5x卷的写入性能损失。
但是,这仍然存在数据完整性问题的风险。 主机系统已经被告知,当事实并非如此,这个写入已经完成。 硬件故障可能会在数据库服务器上(例如)日志和数据卷之间造成数据不一致。 出于这个原因,回写caching不推荐用于事务性系统,虽然它可能是ETL过程之类的性能优势。
概要
如今的磁盘空间非常便宜,事务处理系统应该使用RAID-1或RAID-10作为日志卷,使用RAID-10作为数据卷。 物理磁盘大小可能比数据库大得多,而且RAID-10将允许相同数量的磁盘具有更高的写入吞吐量,这可能会减less支持系统所需的磁盘卷数量。
就像数据仓库一样,您仍然可以使用大量索引很大的事实表来咀嚼空间,因此您可能会在RAID-5或RAID-50数据量方面获得小小的价格优势。 但是,日志和tempdb仍应放置在RAID-10卷上,因为它们在ETL处理期间可能会有很多工作。 但是,在磁盘上节约成本可能相当小。
那么,这很大程度上取决于您的错误/风险承受能力。 RAID5有很多问题 。 我的数据库服务器目前有两个镜像驱动器,如果我要扩展,我会去找更多的奇偶校验,可能是RAID6或RAID10。
此外,如果您的应用程序是正常运行时间的,那么我可能会推荐使用两个数据库服务器来进行复制,而不是使用master-master或hot-spare。 RAID只能帮助防止磁盘故障,但是在服务器上会出现更多的错误:)
取决于你在做多less写作。
如果这是一个相当轻量级的“networking应用”,那么你不太可能在RAID5上看到任何性能问题。
如果您正在构build一个具有大型ETL的多GB数据仓库,那么RAID 5上的写入缓冲区将很快溢出,并直接进入RAID 5的“糟糕的写入性能”。
每个RAID5写入将导致至less3个写入(加上一个CRC计算)。 当被缓冲时,这是很好和快速的(活动的短小突发 – 单个logging更新和插入)。 如果这是持续写入(大批量插入/更新),那么它会被注意到。
这是性能和空间之间的平衡。 RAID 10(条带驱动器的镜像)既具有性能又具有弹性,但容量却减less了50%。
RAID5具有更高的容量,更好的读取性能,但是写入性能差(大)。
RAID 1,这是我的最终答案
原因:
镜像对为故障磁盘提供足够的冗余,RAID继续运行到最后一个磁盘。
如果您仔细地放置数据和索引,镜像对会为读取产生更大的I / O性能… [提示:使用单独的卷来存储数据及其索引]。 通过双工控制器可以获得更高的性能。
对于很less的“为什么不”指南,这一直非常受我与之合作的Oracle DBA的欢迎。
反对任何袭击五的战斗 – http://www.miracleas.com/BAARF/
简短的回答:不。
长的答案:除非你有一个非常小的数据库或非常低的要求,没有。 数据检索在很大程度上依赖于每秒磁盘I / O操作,并且分段开销会耗尽磁盘访问时间, 特别是在查询运行时间较长的情况下。 大多数数据库都在RAID 10样式设置上运行,或者使用特定卷来保存数据的分区。 是的,RAID 10会花费你的写入,但是你的读取性能(使用正确的设置)将会变得越来越好 。
如何获得冗长的写入性能?
一个大的写回caching。 增加硬件RAID控制器上的RAM或软件RAID解决scheme可用的RAM(例如,对于Linux的MDADM增加系统RAM,MDADM气球以使用未使用的系统RAM作为写入caching)。 这个build议适用于给定的“大”值 – 如果你经常(5%的时间?)以足够快的速度写入数据以填充写caching,不pipe它有多大,那么这将没有什么区别。
真的是关于从你的操作系统文件分离你的数据文件,日志文件。 日志顺序写入数据会产生大量随机读取和一些随机写入
通过构build支持这些特性的RAIDconfiguration,您可以大大提高性能
Raid 1 – 镜像对于日志文件来说非常棒Raid 10适合您的数据文件。 它也值得分离TempbDB和备份到单独的驱动器。 添加文件组是另一种提高性能的方法。 对于SAN来说,这并不是很清楚。 这取决于您是在为每个LUN构build特定的RAIDconfiguration还是依靠主轴数量。
在最近的StackOverflow博客文章的精神说,我们不应该重新呈现互联网上已有的答案,我指出你在这个
RAID-5在提供的冗余方面并不是独一无二的,它只是在消耗更less的附加磁盘的情况下做到这一点。 您可以select其他相同或更好的冗余,并更好地写入性能
从RAID5运行数据库通常是一个错误。 我只在两种情况下看到它的完成 – 精心devise的数据库,读取密集,写入less,而由于RAID5造成的“浪费空间”的数据库在政治上是不可行的。
RAID5将破坏事务性能。
另外,如果你正在考虑RAID5,看看你是否可以让RAID6工作。 理论上的可靠性要好得多,但由于实施不成熟,现实世界的可靠性往往更差。