RAID对应用程序性能的影响解析

在讨论了VMworld大会上和围绕VMworld大会涌现的存储新闻后,现在是时候让我们回到存储性能的讨论中。在前两篇文章中,我们观察了基本的存储性能指标以及每秒输入输出操作(IOPs)和存储系统延迟对数据库这样的应用程序的性能的影响要大于简单的系统吞吐率。这篇文章中,我们将讨论RAID(独立磁盘冗余阵列)是如何影响应用程序性能的。

基本上,RAID提高了你的存储系统的可靠性和可用性。不过,它所提供的冗余度是有代价的——不仅是消耗额外的磁盘空间,同时还增加了你的磁盘(无论是旋转式机械磁盘还是固态磁盘)在将数据写入RAID集时候必须进行的工作量。好消息是这种写入放大效应——有些人称之为写入惩罚——可以因为多磁盘并行所带来的读取性能提升而得到抵消。让我们来看看一个理论上的RAID控制器在读取和写入某种通用RAID设置的时候是如何表现的,这样我们就能知道RAID对性能的影响了:

在一个像RAID 1或RAID 10这样的镜像设置中,控制器将所有的写入都复制到RAID集中的一对驱动器中,这样来自应用程序的每个写入操作都变成面向后端磁盘的2个IO。因此,一个镜像RAID集所能提供的写入IOPS数量只是RAID集中驱动器所能提供的IOPS总和的一半。一个智能RAID控制器可以将读取请求分布到镜像式驱动器对中,Novell称之为磁盘复制,因此一个镜像式RAID集可以提供的读取IOPS数量几乎是写入IOPS的四倍。

让事情更复杂的是,基于校验码的RAID框架,比如RAID5和RAID6,磁盘需要进行的工作量是随着写入请求的大小而改变。如果写入请求小于RAID条带大小(这在数据库应用程序中很普遍,数据库引擎一般将4KB或8KB页面写入到RAID集,而RAID集驱动器条带是将64KB数据写入每个驱动器),一个运行校验码RAID的存储系统将必须执行多个IO操作来满足单个写入请求。

为了在校验码RAID集合中希尔一个小的变化,控制器必须将当前在RAID集的数据读取到记忆体,插入新的数据,计算新的校验码条带值,然后将新的数据和校验码写入到后端磁盘。

校验码RAID更适合用于像文件服务器和流媒体这样的环境,在这样的环境中,I/O大小一般大于条带大小。如果你要一次性将超过512KB数据在64KB条带大小下写入8+1 RAID 5或8+2 RAID 6集合中的话,RAID控制器不需要读取现有数据——它只要计算一下校验码然后将新数据和校验码写入到磁盘驱动器就行了。

不过,亲爱的读者,你应该注意的是厂商们可能会玩一些花样,制造出更复杂的阵列控制器,使它的性能优越于我们这里所描述的简单RAID控制器性能。一个非易失性记忆体高速缓存可以让阵列在将数据写入到后端存储之前先确认写入请求,这样阵列就可以降低写入延迟,在另一波数据高峰到达之前将高峰传输冲入高速缓存。类似的,基于日志的数据架构让控制器可以始终写入全RAID条带以释放空间,减少小型写入给基于校验码的RAID集造成的写入放大效应。

虽然有些过度简化,不过存储管理员确实可以用RAID 10来应对随机I/O工作负荷,用校验码RAID来应对顺序型工作负荷。当然,顺序型工作负荷,除了备份以外,在如今的虚拟化数据中心中正在变得越来越罕见。

在这里,我感谢Duncan Epping在Yellow Bricks博客中发表的这个主题的文章,感谢所有在那篇文章中发表评论的朋友。那次讨论帮助我将思路集中在了RAID和存储性能的主题上。