这次给大家介绍下RAID 5和RAID 6做后端在写性能上的差异以及原因。这里暂不考虑上层缓存以及跨array创建LUN带来的性能提升,只考虑array本身的性能差异。
随机短步写
对于写入量小于条带数据块的写操作,之前已经讲过,对于RAID 5而言,短步写会从data盘上读取要改写的数据,从parity盘上读取P校验,然后把新数据写入data盘,计算新的P校验值并写入P校验盘,总共是2次读+2次写操作。
对于RAID 6,则需要读取要改写的数据,从P盘读取P校验,从Q盘读取Q校验,把新数据写入data盘,计算新的P和Q校验,再分别写入P盘和Q盘,所以总共是3次读+3次写。
也就是说,假设所有写入的块大小都是Z, 单个磁盘所能处理Z大小的数据块的***IOPS是定值X,组成RAID的磁盘个数都是Y,那么对应的RAID 5可以处理的***IOPS是X*Y/4,而RAID 6可以处理的是X*Y/6,对应的数据传输率就是Z*X*Y/4和Z*X*Y/6。也就是说,由于多了个Q校验的读写,RAID 6在随机短步写性能上和RAID5比会有33%的差距。所以除了增大成员磁盘个数Y外,并没有很好的方法来改进RAID 6的性能,而一味的增大Y又会带来其他问题在此不再详述。
连续整条带写
RAID 5整条带写的过程是,计算出P校验,把数据和P校验一起写入到所有的RAID成员磁盘里。
RAID 6整条带写的过程是,计算出P和Q校验,把数据和P和Q校验一起写入到所有的RAID成员磁盘里。
我们依然假设2种RAID都用相同的磁盘个数Y,RAID 5的条带数据块大小是a,RAID 6的条带数据块是b。那么由于有P校验的存在,RAID 5的条带大小就是a*(Y-1),RAID 6有P和Q两个校验,条带大小就是b*(Y-2)。
不管是RAID 5还是RAID 6,写完整的一个条带,都需要把所有成员磁盘写一次,也就是说需要的磁盘IO数都是Y。如果条带数据块a和b比较小的话,对于现在的大容量机械硬盘来说,寻道时间远大于小块数据的传输时间,所以我们可以假设磁盘处理a和b大小的数据块的***IOPS都是x。那么RAID 5做连续整条带写的数据传输率就是a*(Y-1)*x,RAID 6则是b*(Y-2)*x。由此可见,当RAID 6和RAID 5的条带数据块大小一致时候(a=b),如果都是8个磁盘组成的RAID,RAID 5和RAID 6的传输率对比就是7:6,这是RAID 6多出一个Q校验的代价。同时从上面的公式可以看到,增大RAID 6的条带数据块大小b可以在一定范围内提高RAID 6的性能。当然b是不能***制增大的,当条带数据块大到一定程度的时候,寻道时间不再远小于数据块的传输时间,也就是说对于RAID 5和RAID 6的磁盘处理a和b大小的数据块的***IOPS将不再相等,上面的公式也就不适用了。所以对于连续整条带写,选择一个合适的条带数据块大小对于性能很重要。
综上,RAID 6相对于RAID 5,有天然的写性能上的不足,但是数据安全始终是***位的,随着磁盘容量越来越大,RAID重建(rebuilding)时间也越来越长,RAID 5重建时候用户数据暴露在无保护的时间窗口也越来越大,采用RAID 6可以更好的保护用户数据,这点性能上的付出是值得的,而且通过上层的缓存和跨越更多个rank来建LUN可以一定程度上弥补性能差距。