Skip to content

模型Model

磁盘条带与镜像的布局和故障集合

RAID striping and mirroring · RAID 0 and RAID 10 · 条带与镜像

从逻辑块号算出条带成员与盘内位置,比较四盘条带和成对镜像的容量,枚举哪些双盘故障可恢复,并单独说明部分持久写与重建读错。

把四块盘放在一起,可以把相邻数据分散到多块盘并行处理,也可以把同一数据保存两份。这两种安排分别叫条带化与镜像。它们改变设备块I/O下面的地址映射和故障能力;先画清每块数据在哪,才知道一次故障到底丢了什么。

形式陈述 ​

声明故障,才能计算恢复能力 ​

设有四块成员盘D0、D1、D2、D3,每块有 C 个可用块,每块256字节,C 是2的倍数。阵列向上提供连续逻辑块号 b;向下的一次访问使用二元组“成员盘号、盘内块号”。本文的chunk是连续2块,不是2字节。

先研究静态一致内容上的已知整盘失效:失效盘身份可检测且其全部数据不可读,所有未失效盘都返回正确持久内容。计算哪些失效集合仍可读回全部逻辑块时,不假设各盘失效相互独立。静默错字节、重建期间额外读错和写到一半掉电,稍后另行讨论。

RAID0只做条带化,没有副本。RAID10先组成镜像对 (D0,D1)、(D2,D3),再在两对之间条带化。本页固定这一个配对布局;四盘“先条带后镜像”采用不同组织,不能把下面的故障集合直接照搬过去。

可复算的地址函数 ​

RAID0将chunk依次轮流交给四盘。令 k=⌊b/2⌋ 是chunk号,o=bmod2 是chunk内偏移,则

d=kmod4,r=2⌊k/4⌋+o.

逻辑块 b 位于Dd 的盘内块 r。RAID10则把chunk轮流交给两对:

g=kmod2,r=2⌊k/2⌋+o.

逻辑块在D2g与D(2g+1)的盘内块 r 各有一份。RAID0提供 4C 个逻辑块,RAID10提供 2C 个;这只扣除镜像冗余,暂不计阵列元数据和备用空间。

直觉

条带分工,镜像复制 ​

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,两种位置 ​

取 C=8。对逻辑块13,k=6,o=1。RAID0得到 d=6mod4=2,r=2⌊6/4⌋+1=3,因此访问D2的盘内3。逻辑块13在D2上是这一轮chunk的第二块。

RAID10得到 g=6mod2=0,r=2⌊6/2⌋+1=7,因此在D0与D1的盘内7各存一份。此时阵列容量是16逻辑块,13仍合法;RAID0容量是32逻辑块。输入逻辑块号超出各自容量,应先拒绝,不能让取模公式偷偷绕回较小地址。

六种双盘失效,镜像能承受四种 ​

在当前镜像布局中,恢复全部数据当且仅当每一对至少剩一个成员。任意一盘失效都满足这个条件;两盘失效共有六种。

失效集合 能否读回全部数据 原因
否 第一镜像对整对丢失
否 第二镜像对整对丢失
{D0,D2}、 是 两对分别还剩一个
{D1,D2}、 是 两对分别还剩一个

所以“能承受某些两盘故障”正确,“能承受任意两盘故障”错误。RAID0任意单盘失效都会丢失该盘承载的部分逻辑块,因而无法恢复整个逻辑设备;剩余盘上的块仍可能读出,不能将“整个卷不再完整”说成每一个块都物理消失。

已确认写与掉电前半写不是同一状态 ​

本页为健康镜像规定:一次写入两成员,并等待两份数据都可靠flush后才确认持久成功。掉电若发生在确认前,一份可能已持久、一份仍旧;重启后不能在没有恢复判定的情况下,任意选一份作为新的共同内容。静态故障集合证明假设副本本来一致,并没有覆盖这种跨代状态。

若一块盘已失效,系统可能允许降级写入,但确认条件、脏区跟踪与重新加入成员时的同步都要重新规定。把旧盘插回去,并不意味着它保存着缺席期间的最新更新。本文不把“任意一个存活副本能读”扩展成“任意回来的一份都可直接参与正常读”。

重建遇到读错,会多出一个缺失 ​

假定D0失效,需从D1复制整个镜像对。如果D1有一个块也明确读不出来,那个逻辑块的两份副本都不可用;其余盘属于另一个镜像对,不能提供这块数据。若D1无声返回错误字节,静态模型中的“幸存成员正确”前提更已不成立,复制只会把错误传播到替换盘。

两份内容不同时,校验和或外部版本信息有时能帮助判断,但镜像布局本身没有定位错误来源的能力。文件误删若被正常写到两份副本,也同样会复制出去;历史备份解决的是不同的保留目标。

推论与应用

用故障集合表达保证,比只报盘数更准确 ​

令失效集合为 F,本布局的可恢复条件是 {0,1}⊈F 且 {2,3}⊈F。这个条件可以直接用于穷举测试,不需要先给每块盘一个故障概率。若要计算未来一年数据损失概率,则必须额外说明共同电源、批次、恢复时间和相关失效等概率模型;“六种双故障有四种可恢复”不自动等于现实可恢复概率 2/3。

为了减少两份镜像的容量开销,可以用跨盘校验保存额外恢复方程。那会改变布局和更新步骤,也会出现数据与校验处于不同持久版本的写洞。进入该模型前,保留本页的三种地址和明确故障条件,才能判断一个恢复公式是否适用。

参考资料
关系图谱4 个相邻概念 · 1 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组