“条带与镜像用完整副本恢复丢失成员。另一种办法是为一组数据加一条校验方程:少一块时用其余块算回来。困难在于,修改数据时也要修改方程;两块各自能原子写入,不代表跨盘的两次更新能一起持久。”
把四块盘放在一起,可以把相邻数据分散到多块盘并行处理,也可以把同一数据保存两份。这两种安排分别叫条带化与镜像。它们改变设备块I/O理路设备I/O、DMA与完成边界Device I/O and DMA · Polling interrupt DMA给设备请求建立提交、数据搬运、命令完成和稳定存储四个边界,核验描述符所有权、DMA地址与缓冲生命周期。下面的地址映射和故障能力;先画清每块数据在哪,才知道一次故障到底丢了什么。
形式陈述
声明故障,才能计算恢复能力
设有四块成员盘D0、D1、D2、D3,每块有
先研究静态一致内容上的已知整盘失效:失效盘身份可检测且其全部数据不可读,所有未失效盘都返回正确持久内容。计算哪些失效集合仍可读回全部逻辑块时,不假设各盘失效相互独立。静默错字节、重建期间额外读错和写到一半掉电,稍后另行讨论。
RAID0只做条带化,没有副本。RAID10先组成镜像对
可复算的地址函数
RAID0将chunk依次轮流交给四盘。令
逻辑块
逻辑块在D
直觉
条带分工,镜像复制
RAID0前八个逻辑块的分布是D0拿0、1,D1拿2、3,D2拿4、5,D3拿6、7。接着逻辑8、9再回到D0,但放到它的盘内2、3,而不是覆盖盘内0、1。逻辑连续并不意味着所有数据都在同一盘连续。
RAID10前四个逻辑块则是0、1同时在D0和D1,2、3同时在D2和D3。两份副本承载相同逻辑身份;读可以选一个有效成员,正常写需要维护两份。副本之间若出现不同内容,单靠“有两份”不能投票判定哪份更新或正确,还需要版本与恢复合同。
容量、请求数和耗时分开看
未命中缓存的一次正常单块镜像写,会产生两份成员数据写入;RAID0只产生一份。两份写可以并行,所以请求数翻倍不等于耗时必定翻倍。反过来,一次跨很多条带的读有并行机会,也不证明任意小请求都快四倍;盘内位置、调度、缓存与接口吞吐都会影响实际耗时。
例子与边界
同一个逻辑块13,两种位置
取
RAID10得到
六种双盘失效,镜像能承受四种
在当前镜像布局中,恢复全部数据当且仅当每一对至少剩一个成员。任意一盘失效都满足这个条件;两盘失效共有六种。
| 失效集合 | 能否读回全部数据 | 原因 |
|---|---|---|
| 否 | 第一镜像对整对丢失 | |
| 否 | 第二镜像对整对丢失 | |
| {D0,D2}、 | 是 | 两对分别还剩一个 |
| {D1,D2}、 | 是 | 两对分别还剩一个 |
所以“能承受某些两盘故障”正确,“能承受任意两盘故障”错误。RAID0任意单盘失效都会丢失该盘承载的部分逻辑块,因而无法恢复整个逻辑设备;剩余盘上的块仍可能读出,不能将“整个卷不再完整”说成每一个块都物理消失。
已确认写与掉电前半写不是同一状态
本页为健康镜像规定:一次写入两成员,并等待两份数据都可靠flush后才确认持久成功。掉电若发生在确认前,一份可能已持久、一份仍旧;重启后不能在没有恢复判定的情况下,任意选一份作为新的共同内容。静态故障集合证明假设副本本来一致,并没有覆盖这种跨代状态。
若一块盘已失效,系统可能允许降级写入,但确认条件、脏区跟踪与重新加入成员时的同步都要重新规定。把旧盘插回去,并不意味着它保存着缺席期间的最新更新。本文不把“任意一个存活副本能读”扩展成“任意回来的一份都可直接参与正常读”。
重建遇到读错,会多出一个缺失
假定D0失效,需从D1复制整个镜像对。如果D1有一个块也明确读不出来,那个逻辑块的两份副本都不可用;其余盘属于另一个镜像对,不能提供这块数据。若D1无声返回错误字节,静态模型中的“幸存成员正确”前提更已不成立,复制只会把错误传播到替换盘。
两份内容不同时,校验和或外部版本信息有时能帮助判断,但镜像布局本身没有定位错误来源的能力。文件误删若被正常写到两份副本,也同样会复制出去;历史备份解决的是不同的保留目标。
推论与应用
用故障集合表达保证,比只报盘数更准确
令失效集合为
为了减少两份镜像的容量开销,可以用跨盘校验理路RAID校验更新与写洞RAID parity write hole · RAID 5 parity update · 校验阵列写洞通过四盘异或校验计算擦除重建和更新I/O,枚举数据与校验的持久组合,展示部分写入如何破坏未改块,并界定日志与部分校验保护的能力。保存额外恢复方程。那会改变布局和更新步骤,也会出现数据与校验处于不同持久版本的写洞。进入该模型前,保留本页的三种地址和明确故障条件,才能判断一个恢复公式是否适用。
参考资料
- Arpaci-Dusseau与Arpaci-Dusseau,OSTEP, Ch.38,§38.2故障模型、§38.4条带化、§38.5镜像:已知失效模型与容量/可靠性/性能三个分析维度。本文固定四盘两块chunk和RAID10配对,地址函数及六种失效集合为独立展开。
- Patterson、Gibson与Katz,“A Case for Redundant Arrays of Inexpensive Disks (RAID)”,SIGMOD 1988, 109–116:原始RAID设计背景。本文不使用其特定独立故障假设推算现实可靠性。