你知道RAID中的Write Hole问题吗?

RAID系统中会存在一个称之为Write Hole的问题,这到底是一个什么问题?会给用户带来什么影响?目前开源RAID系统中如何解决这个问题?这类问题需要采用什么方式来解决呢?存储老吴从研发的角度和大家一起分析一下这个问题,看看这个问题的本质以及解决思路。

Write Hole是一种非常形象的描述。对于一个采用条带内部通过校验数据进行数据保护的系统,当应用程序正在更新条带内部数据的时候,如果系统突然断电,条带数据无法正常更新完成,那么此时就会出现条带中的数据部分更新完成。在这种情况下,当系统重启之后,条带中的数据是不完整的,校验数据和条带中的有效数据无法匹配上,条带处于数据不一致的情况。这种问题就被称之为Write Hole问题,如下图所示:

在更新条带数据的时候,D2数据被更新成了D2’,但是条带的校验数据P、Q没有被更新完成,此时系统由于发生故障而重启。在这种情况下,条带数据处于不一致的状态。系统重启之后,通常RAID系统无法感知这种数据不一致的条带。在这种情况下,如果条带中的D3再次发生了故障,那么需要通过校验数据P恢复D3。在数据恢复过程中,使用到了D2’数据,那么显然恢复出来的数据会发生错误,不再是原来的D3数据。所以,数据不一致的条带将会进一步引入数据正确性的问题。即Write Hole问题不仅破坏被更新过的数据,进一步会潜在影响未更新数据的正确性,在极端情况下会影响整条带数据的正确性。

考虑在发生Write Hole问题的时候,即在条带数据更新时,系统突然断电,RAID系统中出现若干数据不一致的条带。在系统重启之后,针对这些数据不一致的条带,可以采用全系统扫描的方式对数据不一致条带进行修复。这也是目前很多RAID系统所常用的方法,通过这种方式可以防止数据不一致条带进一步导致未更新数据的正确性问题。在RAID系统中通常存在SYNC功能,当系统非法重启之后,可以通过SYNC功能对RAID中的所有条带进行检查,并且将数据不一致条带进行修复。这种方式可以防止Write Hole问题的扩散,但是还是会导致RAID系统中部分数据的彻底丢失。

为了彻底解决Write Hole问题,在设计RAID的时候可以采用如下两种方法:

1,采用文件系统的Journal(日志)的设计思想,实现写请求的原子处理

2,借助于采用非易失性内存做为写缓存,达到原子写操作的目的

这两种思路本质上是类似的,第二种是对第一种的优化。我们知道文件系统在数据更新的时候为了保证数据更新的原子性,可以采用日志的方式,把一次数据更新操作看成一次transaction(事务)。即不管一次数据更新操作有多少次IO,从外部来看这是一次原子操作,可以称之为atomic write。当atomic write中间过程发生故障时,系统重启之后可以继续操作,保证数据要么更新完成,要么完全没有写入,不会存在中间状态。RAID系统想要解决Write Hole的问题,也需要引入这种Atomic write的机制。很直接的想法是在每次RAID进行条带数据更新的时候,首先记录一下日志,保存事件类型以及相关的数据;然后再将数据提交到条带中;当条带数据全部更新完成之后,清除日志数据。这种方式可以保证原子写,即使在条带数据更新过程中发生系统故障,系统重启之后,通过日志数据可以继续写过程,保证条带数据完全更新完毕,并处于数据一致的状态。

日志的方式看似完美,但是会严重影响性能。在磁盘存储系统中,日志更新非常耗时,一次更新需要进行多次磁盘IO操作,如果日志存储空间和条带存储空间在物理上不连续,那么将会引入磁盘抖动问题,严重影响性能。对于闪存存储系统,引入日志系统之后,所有的数据操作将会引入双倍的数据写入操作,写放大问题变得非常棘手。所以,在开源RAID系统中,都没有提供这种日志操作方式,通常需要上层的文件系统来解决这种write hole的问题。在商用的一些RAID系统中,为了保证极致的数据可靠性,有些系统实现了这种日志数据更新方式,达到Atomic Write的目的。

另一种比日志方式更好的方法是引入非易失内存NVRAM。在更新RAID数据的时候,首先将数据写入非易失内存中,当NVRAM中的数据聚合完毕之后再更新写入条带。当条带中的数据更新完毕之后,再将NVRAM中的数据清楚。在条带数据更新的过程中,如果系统出现异常重启,由于NVRAM中依然存在未完成更新的数据,所以,条带中的数据将会被再次更新,不会存在中间数据状态,不会存在Write Hole的问题。

采用NVRAM的这种方法是比较完美的Write Hole解决之道。对于硬RAID,往往采用热备电池或者超级电容的方式保护RAID卡上的内存,起到的就是这个作用。所以,和软RAID相比,硬RAID在这一点上会更胜一筹。在软RAID中,可以在系统中使用PCIe NVRAM或者NVDIMM来实现RAID的非易失数据缓存。通常在存储系统中,软RAID会和文件系统、上层的应用系统进行配合,因此,NVRAM也会和文件系统进行共享,从而解决掉Write Hole的问题。EMC的很多存储系统就会采用非易失内存NVRAM,让文件系统与RAID进行配合,避免RAID处于Write Hole的状态。

Write Hole是RAID的一个比较难于解决的问题,但是借助于最新NVDIMM等非易失内存技术之后,该类问题可以有效的避免和解决。

时间: 2024-08-08 20:44:25

你知道RAID中的Write Hole问题吗?的相关文章

RAID中可以做TRIM操作吗?

不知道大家有没有考虑过这样一个问题:在RAID中是否可以支持TRIM操作? 试想在SSD上建立RAID之后,应用软件(文件系统)直接运行在RAID软件之上,那么此时如何通过TRIM命令将SSD中的数据块unmap掉呢?看起来这好像不是一个问题,其实对于RAID而言这是一个比较大的问题.存储老吴可以带领大家从研发人员的角度一探RAID中TRIM所引入的问题,从中也可以一窥用户所应该注意的问题. 目前,RAID方面的开源软件是MD,很多用户对MD这套软件是非常热衷的.认为这套软件运行非常的稳定,性能

RAID中条带的概念

raid把数据分成条带,一个条带横跨所有数据磁盘,每个磁盘上存储条带的一部分,称为sagment,也称为条带深度.一个条带包含的扇区或块的个数,称为条带长度. raid向操作系统提供的是卷,是连续的扇区(或者叫LBA)空间地址,而卷向文件系统所展示的是分区,相对于卷,分区就是将大片连续地址再次切开.文件系统用扇区组成所谓"簇",或者叫cluster,或者叫分配单元,fs存放数据只以簇为单位,而不会出现"读入或者写出半个簇"这种io命令.而卷之下的各层都可以以单个扇区

Write Hole 问题

Write Hole 是一种非常形象的描述.在出现系统异常情况(双转单.级联框掉电.系统异常复位或掉电)易出现WriteHole现象. 为了彻底解决 Write Hole 问题,在设计 RAID 的时候可以采用如下两种方法: 1,采用文件系统的Journal(日志)的设计思想,实现写请求的原子处理 2,借助于采用非易失性内存做为写缓存,达到原子写操作的目的 WriteHole起因:WriteHole的出现是为了解决在下盘过程中由于某些操作导致数据分条校验不一致,如:RAID组级别为RAID5,成

L​inux 中使用mdadm创建软raid

Linux 中使用mdadm创建软raid raid 磁盘阵列: raid0 raid1  raid5   raid10 raid0 : 优点:读写速度快 缺点:安全性不高 raid1: 优点:安全性高,读取速度快 缺点:写入速度慢 raid5: 安全性介于0和1之间读写速度介于0和1之间 优点:可以做冗余磁盘 完整创建raid5过程: 1.新建4个分区: [[email protected] Desktop]# fdisk /dev/sdb 2.创建raid5: [[email protect

一个IO的传奇一生(13)—— Linux中的MD开源RAID(1)

1.前言 RAID是IO路径中的关键模块,甚至在整个存储系统中,RAID是最为核心和复杂的模块.在Linux操作系统中,提供了一个开源的RAID,那就是MD RAID.该RAID可以实现RAID0.RAID1.RAID5和RAID6的功能,在产业界得到了广泛的应用.MD RAID对外采用块设备的形式导出,因此,通过块设备层的调度,BIO请求会被发送到RAID模块进行进一步的IO处理.在MD RAID一层,请求会被按照条带的方式进行切分,然后再按照RAID中磁盘的个数进行磁盘请求的映射.在请求的处

正确删除linux中软raid的方法

1.先umount组建好的raid:umount /dev/md0 2.停止raid设备:mdadm -S /dev/md0 3.此时如果忘了raid中的硬盘名称,要么重启系统,要么运行:mdadm -A -s /dev/md0 然后再用mdadm -D /dev/md0查看raid中包含哪几个硬盘.再次运行第二步停止命令:mdadm -S /dev/md0 4.删除raid里的所有硬盘:mdadm --misc --zero-superblock /dev/sdc, mdadm --misc

linux中的软RAID实现,逻辑卷和btrfs文件系统

RAID: Redundant Arrays of Inexpensive Disks,廉价磁盘冗余阵列:             Redundant Arrays of Independent Disks,独立磁盘冗余阵列: 1988年,UC Berkeley提出的"A case for Redundant Arrays of Inexpensive Disks"旨在将多个相对廉价IDE接口的磁盘组合成一个"阵列",并不是将磁盘简单罗列在一起,而是根据特定规则进行

linux中的raid

参考文档 http://www.cnblogs.com/ivictor/p/6099807.html 制作raid5 http://blog.51cto.com/11134648/2103384 RAID 0 又称为Stripe或Striping,它代表了所有RAID级别中最高的存储性能.RAID 0提高存储性能的原理是把连续的数据分散到多个磁盘上存取,这样,系统有数据请求就可以被多个磁盘并行的执行,每个磁盘执行属于它自己的那部分数据请求.这种数据上的并行操作可以充分利用总线的带宽,显著提高磁盘

Linux中的LVM和软RAID

? ? 在实际工作中,会经常碰到所给的服务器硬盘容量太小,而实际的应用软件中却需要一个容量较大的分区进行数据存储等,除了通过硬件RAID卡来实现合并多硬盘外,其实我们也可以通过软件的方式来实现. 实验环境 虚拟机:CentOS 6.6 x64 硬盘1:/dev/sdb 硬盘2:/dev/sdc 硬盘3:/dev/sdd ? 详细硬盘列表信息如下所示: 使用LVM合并硬盘 使用LVM目的如下所示: 将两块独立的硬盘合并为逻辑上的一块,并挂载到指定的挂载点中,达到在一个目录中使用两块硬盘所有空间的效