RAID5 Write Hole

    技术2026-01-02  5

     

    这些文章已经写了好几年了,可能已经过时了。在MSN space和QQzone几经辗转之后,我想也许这些技术文章还是放在搞技术的博客中更能帮助人。于是做了一个艰难的决定,把这些文章一篇篇搬过来!绝对是原创的。

     

    最近一段时间又重新接触了RAID,这次是关于RAID5 Write Hole的问题。这里把我对这个问题的理解描述一下。

    Write Hole是RAID5的一个重大缺陷,这个问题在我以前的日志中已经提到过,但是只是作为解释代码的引子,而没有强调它的重要性。要了解这个问题,首先要对RAID5的rcw和rmw有一定了解。我以前的文章(RAID-5(五)rmw与rcw )已经解释过这些动作。为了方便说明,假设有一个5个盘的RAID5(为什么是5个盘?因为rmw)。

    我们知道在RAID5的一个IN_SYNC的stripe中,必须满足D1+D2+D3+D4+P=0,这样任何一个数据Dx才能由其他数据和P计算出来。但是在Power failure的情况下会使得D1+D2+D3+D4+P!=0。为什么呢?假设这样一种情况:我们要写D1',那么新的P'都会写到disk上,然而不幸的是在还没写完呢就停电了。这时候可能出现的情况D1和P就会变成未知数据X和Y。X当然有可能是D1也有可能是D1',更可能是D1和D1'的混合物,Y也是如此。总而言之,X+D2+D3+D4+Y = 0成立的可能性不大。这种情况我这里都统一叫Parity损坏。

     

    来看看会出现什么问题。最大的问题是就是这个RAID5已经没有了容许失去一个盘的功能了,换句话说,就是这个RAID5如果少了一个盘很可能就会造成数据丢失。要知道任何一个数据盘x丢失都可能造成Dx(x=1~4)的数据丢失,因为用这个错误的P算出来的Dx是错误的。假设这些是关键数据比如说文件系统的meta data...对做存储的来说数据完整性是关乎生存和发展的大事!!更为可怕的是,这个漏洞可能潜伏下来。还记得RAID5的rmw?rmw并不用其他数

    据来计算P'而是用老的P来算P',那么如果P是坏的,那么P'也就是坏的。这个问题,如果RAID5是healthy的,那是可以补救的。Linux软件RAID就通过发起resync来同步Parity。它通过in_sync flag来检测是否需要resync。还可以通过设定bitmap file来减少做resync的stripe的数量。

    然而第二个问题如果没有外界辅助似乎就没有办法了。那就是对degraded的RAID5,只要发生掉电导致Parity损坏,数据丢失就在所难免。为什么会这样?还是来看个例子,假设degraded RAID5少了disk4,还是写D1'而且P'被写坏,那么D4的数据就损坏了而且无法恢复。因为在degraded的情况下,D4的正确性完全依赖于disk5上的P或者P'。一旦P和P'损坏,就会导致D4损坏。而D4没有记在实体disk上,那么一旦损坏就没有办法找回了。你可能觉得这种情况应该

    算是合理的,因为毕竟少了一个盘。但是你想一想,如果是4个盘的RAID0,就不会有Write Hole。

    Write Hole同样存在于Linux RAID6中,但是因为RAID6没有rmw,所以如果是healthy的disk漏洞潜伏的可能性要小。但是对Degraded的RAID6,数据损坏依然不可避免(是不是这样我倒没有仔细研究过代码,但从分析上看应该是这样的)。

    Write Hole是RAID5的天然缺陷,依靠RAID5本身是无法解决这个问题的。为此很多公司提出了自己的解决方案,或者干脆绕开RAID5提供替代方案。有兴趣的朋友可以自己google。

     

    最新回复(0)