整条写(Full-Stripee Write):整条写需要修改奇偶校验群组中所有的条带单元,因此新的奇偶校验值可以根据所有新的条带数据计算得到,不需要额外的读、写操作。因此,整条写是最有效的写类型。整条写的例子,如 RAID 2、RAID 3。它们每次IO总是几乎能保证占用所有盘,因此每个条带上的每个Segment都被写更新,所以控制器可以直接利用这些更新的数据计算出校验数据之后,在数据被写入数据盘的同时,将计算好的校验信息写入校验盘。


重构写(Reconstruct Write):如果要写入的磁盘数目超过阵列磁盘数目的一半,可采取重构写方式。在重构写中,从这个条带中不需要修改的 Segment 中读取原来的数据,再和本条带中所有需要修改的 Segment 上的新数据计算奇偶校验值,并将新的 Segment 数据和没有更改过的 Segment 数据以及新的奇偶校验值一并写入。显然,重构写要牵涉更多的I/O操作,因此效率比整条写低。重构写的例子,比如在RAID 4中,如果数据盘为8块,某时刻一个IO只更新了一个条带的6个Segment,剩余两个没有更新。在重构写模式下,会将没有被更新的两个Segment的数据读出,和需要更新的前6个Segment的数据计算出校验数据,然后将这8个 Segment 连同校验数据一并写入磁盘。可以看出,这个操作只是多出了读两个Segment 中数据的操作和写两个 segment 的操作,但是写的时候几乎不产生延迟开销,因为是宏观同时写入。


读改写(Read-Modify Write):如果要写入的磁盘数目不足阵列磁盘数目的一半,可采取读改写方式。读改写过程是:先从需要修改的 Segment 上读取旧的数据,再从条带上读取旧的奇偶校验值;根据旧数据、旧校验值和需要修改的 Segment上的新数据计算出这个条带上的新的校验值;最后写入新的数据和新的奇偶校验值。这个过程中包含读取、修改和写入的一个循环周期,因此称为读改写。读改写计算新校验值的公式为:新数据的校验数据=(老数据EOR新数据)EOR老校验数据。如果待更新的Segment已经超过了条带中总Segment数量的一半,则此时不适合用读改写,因为读改写需要读出这些 Segment 中的数据和校验数据。而如果采用重构写,只需要读取剩余不准备更新数据的 Segment 中的数据即可,而后者数量比前者要少。所以超过一半用重构写,不到一半用读改写。整条更新就用整条写。


写效率排列为整条写>重构写>读改写。