想象你是一家大型图书馆的馆长,馆里有十万本珍贵藏书。过去为了防盗防损,你给每本书都复印了三份,分藏在三个不同的库房——这就是“多副本”策略,简单粗暴但代价高昂:存储成本直接翻三倍。现在,一位数学家朋友给你出了个主意:与其整本整本地复印,不如把每本书拆成几份,再额外编几页“纠错页”。比如把一本书拆成两半,再算出一页“校验页”——这页上记录着前两半内容经过某种运算的结果。这样,哪怕其中任何一份丢失,你都能用剩下的部分和校验页把缺失的内容“算”回来。这个精妙的思路,就是分布式存储世界里大名鼎鼎的纠删码(Erasure Coding)。 纠删码的核心思想,是用“计算”换“空间”。就像图书馆不再需要三份完整藏书,而只需要“1.5 份”的存储量,就能抵御同样的风险。它把数据切成小块(数据块),再通过数学运算生成额外的校验块,当某些块丢失或损坏时,用幸存块通过数学“倒推”恢复。这套机制让存储成本大幅下降,但也引入了额外的编码、解码计算开销。现代云存储厂商(如 Azure、Facebook 的冷存储集群)正是在海量冷数据场景中广泛采用纠删码,把成本压到极致。接下来,我们沿着这条“数据分块 → 生成校验 → 条带布局 → 故障恢复 → 成本权衡”的完整链路,把纠删码的里里外外讲透。

岗位关联

对 AI 从业者而言,理解纠删码能帮你设计高可靠、低成本的存储底座;当你在处理训练数据、大模型权重备份等海量冷数据时,这个知识直接决定你的存储账单和系统可用性。

目录
  1. 可视化演示
  2. 数据冗余代价
  3. 条带布局
  4. RS码编码
  5. 解码恢复
  6. 降级读修复
  7. 成本计算权衡
  8. 成本计算权衡
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示RS码k+m编码流程、数据条带跨节点分布与容错修复及EC与三副本存储开销对比。

本节配有交互动效(进入视口后自动加载,约 3KB)。

RS码编码:k个数据块→k+m个编码块 4个数据块D1-D4经RS编码矩阵生成2个校验块P1-P2,共6块 编码矩阵上半为单位阵(I),下半为范德蒙矩阵生成校验块 [D|P]=[D|D]×[I;V] 存储开销仅150%,容忍2块丢失仍可完整恢复数据

数据冗余代价

回到图书馆的比喻。三副本策略就像一个做事极其保守的馆长:每一本珍贵的书,他都让誊写员完整抄写三遍,分别锁进三间不同的库房。这样哪怕其中两间库房遭遇火灾,第三间里依然有一本完好的书可读。听起来很安心,但代价是什么呢?十万册藏书变成了三十万册的存储量,书架成本、库房租金、维护人力全都翻了三倍。在分布式存储的世界里,这个“翻三倍”被称为存储放大率(Storage Amplification)等于 3。

假设你有一个 10TB 的数据集,用三副本存储,实际占用的物理空间就是 30TB。在云存储厂商那里,这意味着三倍的费用。对于频繁读取的“热数据”来说,多副本还有一个额外好处——多个副本可以分摊读流量,提升吞吐;但对于几个月才被读一次的“冷数据”而言,这份“安心”就显得过于奢侈了。于是问题来了:能不能少存一点,却依然保证同样的容错能力?

纠删码登场。它把“整本复制”换成“拆书 + 校验页”。从数学上看,RS(4,2) 纠删码把 4 个数据块编成 6 个块(4 个数据块 + 2 个校验块),存储放大率降到了 6÷4 = 1.5倍。同样 10TB 数据只需要 15TB 物理空间,直接省下 15TB 的成本。当然,天下没有免费的午餐——省下的空间需要用编码时的矩阵乘法和解码时的矩阵求逆来“偿还”,这就是计算开销的由来。

条带布局

图书馆的新方案听起来很美,但具体怎么“拆书”呢?你不可能真的把一本书撕成两半——那会毁掉书。于是数学家朋友建议:把同一批书上的相关页面重新组合。在分布式存储里,这一步叫条带化(Striping):把一个大文件切分成固定大小的数据块(比如每个 1MB),然后将这些块均匀地散布到不同的磁盘上。

想象你有一块长条形的生日蛋糕,要分给 4 个盘子装,再切一小块放在第 5 个盘子里当“备份凭证”。每一个横跨所有盘子的“一行”数据,称为一个条带(Stripe)。条带内的每个小块,就是参与纠删码运算的基本单位。比如 RS(4,2) 条带:4 个数据块 D0-D3 分别落在 4 块盘上,2 个校验块 P0、P1 落在另外两块盘上。整个文件被切成很多个这样的条带,像铺地板一样一路铺过去。

条带布局的关键价值在于均衡故障风险。如果某个文件的所有数据都挤在一块盘上,那块盘一旦损坏,整个文件就没了。条带化把数据分散到多块盘,任何单盘故障都只会损坏每个条带中的一个块——而纠删码恰好能容忍每个条带丢失若干块。这就好比把书的内容分散抄在多本笔记本上,每本笔记本只记录一部分“行”,丢一本笔记并不会让整本书消失,只要凑齐剩下的“行”就能重建整本书。

RS码编码

条带铺好了,现在最关键的问题来了:校验块 P 到底是怎么“算”出来的?回到图书馆,数学家朋友告诉你:校验页上的每一行数字,不是凭空产生的,而是把原始书页上的对应行数字做一系列加权求和得到的。每个原始页面对应一个“权重”,不同页面权重不同。数学上,这就等价于一个矩阵乘法。

RS 码(Reed-Solomon 码)的编码公式如下。设 4 个数据块为 $d_0, d_1, d_2, d_3$,生成矩阵 $G$ 的前 4 行是单位矩阵,后 2 行来自范德蒙德矩阵(Vandermonde Matrix)。校验块 $p_0, p_1$ 由后两行与数据块向量相乘得到:

这里必须提一个隐藏的数学细节:为了让矩阵运算在计算机中无损地进行,数据块中的所有字节都被当作伽罗华域(GF(2^8))中的元素。伽罗华域就像一个“只有 256 个数字的循环宇宙”,它的加法和减法都是异或运算,乘法通过查表完成,既保证结果不会无限膨胀,又保证每个元素都有乘法逆元——这正是后面解码时“求逆”能成功的根本原因。你可以把它理解为:在某个特殊的“时钟算术”里,任何加减乘除都不会跑出表盘范围,而且每个数都有唯一的“倒数”,为恢复丢失数据提供了数学保障。

[p0p1]=[11111248]⋅[d0d1d2d3]\displaystyle\begin{bmatrix}p_0 \\ p_1\end{bmatrix}=\begin{bmatrix}1 & 1 & 1 & 1 \\1 & 2 & 4 & 8\end{bmatrix}\cdot\begin{bmatrix}d_0 \\ d_1 \\ d_2 \\ d_3\end{bmatrix}
这个公式的意义:每个校验块都是所有数据块的加权组合,权重由范德蒙德矩阵的行决定。改变了权重的取值,就产生了多个不同的校验块,它们互为补充,共同守护数据安全。
  1. 数据块向量把 4 个数据块 $d_0, d_1, d_2, d_3$ 排列成一个列向量,表示“待运算的原始数据集合”。
    [d0d1d2d3]\displaystyle \begin{bmatrix} d_0 \\ d_1 \\ d_2 \\ d_3 \end{bmatrix}
  2. 系数矩阵第一行范德蒙德矩阵的第一行全为 1,意味着 $p_0$ 是 4 个数据块的直接求和。
    1×d0+1×d1+1×d2+1×d3\displaystyle 1 \times d_0 + 1 \times d_1 + 1 \times d_2 + 1 \times d_3
  3. 系数矩阵第二行第二行是 $1, 2, 4, 8$,即 $2^0, 2^1, 2^2, 2^3$,为数据块赋予不同的权重,生成与 $p_0$ 线性无关的第二个校验块。
    1×d0+2×d1+4×d2+8×d3\displaystyle 1 \times d_0 + 2 \times d_1 + 4 \times d_2 + 8 \times d_3
  4. 矩阵乘法运算将系数矩阵与数据块向量相乘,得到校验块向量 $[p_0, p_1]^T$。
    [p0p1]=[d0+d1+d2+d3d0+2d1+4d2+8d3]\displaystyle \begin{bmatrix} p_0 \\ p_1 \end{bmatrix} = \begin{bmatrix} d_0 + d_1 + d_2 + d_3 \\ d_0 + 2d_1 + 4d_2 + 8d_3 \end{bmatrix}

解码恢复

图书馆开馆第三年,灾难发生了:一间库房漏水,一本拆开的书的一部分被泡烂了——对应到分布式系统,就是某块磁盘物理损坏,条带中的一块数据块丢失了。馆长焦急地找到数学家朋友:“校验页能帮上忙吗?”朋友微微一笑:“当然,校验页本来就是干这个用的。”

解码的核心思想是逆向求解。编码时,我们用“系数矩阵 × 数据块 = 校验块 + 数据块副本”,得到了 6 个已知结果。现在丢了 1 个数据块,但系数矩阵中该块对应的那一列还在,只是不知道它的值。我们把幸存的数据块、校验块以及系数矩阵中幸存行抽出来,组成一个新的方程组,其中未知数正好是丢失的那个块。解这个方程组,就能找回丢失的数据。数学上,这个过程等价于对系数矩阵求逆。

以 RS(4,2) 丢失 $d_1$ 为例,保留 $d_0, d_2, d_3, p_0, p_1$ 共 5 个等式,但 $d_1$ 未知:

事实上,更通用的方法是高斯消元(Gaussian Elimination)。将所有幸存方程整理成矩阵形式后,通过行变换把系数矩阵化为单位矩阵,未知的原始数据块就自然而然地解了出来。实际系统中,为了加速解码,常预先计算好“恢复矩阵”(即丢失行对应子矩阵的逆),一旦发生故障,只需一次矩阵乘法就能得到丢失数据。

这里的伽罗华域再次立功:在实数域里,$K'$ 可能不可逆或逆矩阵元素极大;但在 $GF(2^8)$ 中,只要 $K'$ 是满秩的,逆矩阵就一定存在,且所有运算结果始终落在 $0 \sim 255$ 之间,计算机处理起来既快又准。这就像那个“循环时钟算术”保证了每个运算都有唯一结果,永远不会溢出。

{d1=d0+d2+d3+p0d1=p1−d0−4d2−8d32\displaystyle\begin{cases}d_1 = d_0 + d_2 + d_3 + p_0 \\d_1 = \frac{p_1 - d_0 - 4d_2 - 8d_3}{2}\end{cases}
高斯消元:通过行加减、行缩放等操作,把线性方程组化为上三角或对角形式,逐步解出每个未知数的经典方法。
  1. 幸存行筛选从编码矩阵中挑出与幸存块对应的行,删除丢失块对应的列,得到降阶系数矩阵 $K'$。
    K′∈GF(28)5×5\displaystyle K' \in GF(2^8)^{5 \times 5}
  2. 求逆矩阵计算 $K'$ 的逆矩阵,目的是把“系数 × 未知数 = 已知结果”变成“未知数 = 逆矩阵 × 已知结果”。
    K′−1\displaystyle K'^{-1}
  3. 未知数求解将逆矩阵与幸存数据向量相乘,直接得到丢失块的值。
    d⃗lost=K′−1⋅v⃗survivors\displaystyle \vec{d}_{lost} = K'^{-1} \cdot \vec{v}_{survivors}

降级读修复

数据块丢失后,系统并不会立刻把所有数据重建出来——有时候可以“边读边算”。当客户端请求恰好命中丢失的数据块时,存储系统会启动降级读(Degraded Read):不去读那个已损坏的块(也读不到),而是读取同一条带中的幸存数据块和校验块,现场用解码公式把丢失块“算”出来返回给客户端。这个过程对上层应用是透明的,客户端只感觉这次读请求稍微慢了一点。

降级读只能救急,不能长期依赖。磁盘故障后,系统必须在后台启动修复(Repair)流程:重新生成丢失的数据块和校验块,写入一块全新的磁盘。修复过程需要读取条带内的全部幸存块并执行解码运算,因此会产生修复读放大。以 RS(4,2) 为例,修复一个块需要读取 5 个幸存块,读放大倍数为 5。相比之下,三副本修复时只需从另一个副本整块拷贝,读放大为 1。这是纠删码的固有代价——它用“更低的存储冗余”换来了“更高的修复带宽消耗”。

现代分布式存储系统通常会做两件事来缓解这一问题:一是跨机架并行修复,把不同条带的修复任务分散到多台机器上同时执行,避免单机成为瓶颈;二是基于 EC 的 Lazy Repair,即把多个丢失块攒到一起批量修复,减少总体读放大。这就好比图书馆不会一本书一本书地修,而是等一批书被水泡了之后,集中请修复师一次性处理,节省人力和时间。

成本计算权衡

现在,让我们把账算清楚。两种方案的权衡,本质上是一道“存储成本 vs 计算成本”的经济学题目。图书馆馆长最关心的问题只有一个:这样折腾一圈,到底省了多少钱?值不值?

从存储效率看,纠删码优势非常明显。三副本的存储放大率是 3,意味着 1TB 有效数据要占 3TB 物理空间;而 RS(4,2) 的存储放大率是 6/4 = 1.5,只有三副本的一半。对动辄 PB 级的海量冷数据而言,这意味着可以省下数千万美元的硬件采购成本,所以从 Facebook 的冷存储集群到阿里云 OSS 的归档存储,无一例外都采用了纠删码。但代价是:每次写入都要做编码运算,每次降级读和修复都要做解码运算。RS(4,2) 的编码开销约为纯拷贝的 2-3 倍 CPU 消耗,对吞吐量不敏感的冷数据来说完全可接受,但对追求极低延迟的热数据链路来说,就成了明显的瓶颈。

事实上,现代存储架构普遍采用冷热分层策略:热数据(近期频繁读写的对象)用三副本或副本 + EC 混合模式保证低延迟;一旦数据“降温”(例如超过 30 天未被访问),就自动迁移到纠删码池,把释放出来的空间留给新的热数据。这种设计,就像图书馆把热门的畅销书放在前台整本展示(多副本),而把难得一读的档案文献拆开放进地下书库(纠删码)——既保证了大部分用户体验,又大幅压低了总成本。理解了这个权衡,你就能在生产环境中回答“到底该用几副本还是 RS(N,M)”这个经典问题了。

成本计算权衡

现在,让我们把账算清楚。两种方案的权衡,本质上是一道“存储成本 vs 计算成本”的经济学题目。图书馆馆长最关心的问题只有一个:这样折腾一圈,到底省了多少钱?值不值?

从存储效率看,纠删码优势非常明显。三副本的存储放大率是 3,意味着 1TB 有效数据要占 3TB 物理空间;而 RS(4,2) 的存储放大率是 6/4 = 1.5,只有三副本的一半。对动辄 PB 级的海量冷数据而言,这意味着可以省下数千万美元的硬件采购成本,所以从 Facebook 的冷存储集群到阿里云 OSS 的归档存储,无一例外都采用了纠删码。但代价是:每次写入都要做编码运算,每次降级读和修复都要做解码运算。RS(4,2) 的编码开销约为纯拷贝的 2-3 倍 CPU 消耗,对吞吐量不敏感的冷数据来说完全可接受,但对追求极低延迟的热数据链路来说,就成了明显的瓶颈。

事实上,现代存储架构普遍采用冷热分层策略:热数据(近期频繁读写的对象)用三副本或副本 + EC 混合模式保证低延迟;一旦数据“降温”(例如超过 30 天未被访问),就自动迁移到纠删码池,把释放出来的空间留给新的热数据。这种设计,就像图书馆把热门的畅销书放在前台整本展示(多副本),而把难得一读的档案文献拆开放进地下书库(纠删码)——既保证了大部分用户体验,又大幅压低了总成本。理解了这个权衡,你就能在生产环境中回答“到底该用几副本还是 RS(N,M)”这个经典问题了。

AI 应用场景

大模型训练数据的冷存储归档

阶段:数据准备与存储

解决的问题:大模型训练前需收集海量文本、图像数据,这些数据在训练完成后仍需长期保留用于审计、增量训练或复现实验。传统三副本存储会让存储成本随数据量线性膨胀,一个 5PB 的数据集要占 15PB 物理空间,成本极高。采用 RS(6,3) 纠删码后,存储放大率降至 1.5,节省一半存储成本,同时容忍 3 块盘同时故障。

具体案例:某 AI 公司积累了 3PB 的爬虫语料和清洗后的训练数据。数据处于“冷”状态,但公司规定需保留 3 年。使用纠删码池后,实际物理占用从 9PB 降至 4.5PB,按每 TB 每月 20 元计算,三年节省约 324 万元。当分析团队需要回溯某批数据时,通过降级读机制即时解码返回,延迟增加约 80ms,但对离线分析任务无感知。

AI推理日志的持久化存储

阶段:模型部署与运维

解决的问题:AI 服务的推理日志、监控指标是故障排查的核心依据,必须持久化且高可靠。但日志数据量大、访问频率低,用三副本纯属浪费。用纠删码将日志按条带切块后跨节点存储,既保证任一节点宕机日志不丢,又大幅压低存储成本。

具体案例:某推荐系统每天产生 2TB 推理日志,保留 30 天共 60TB。原三副本方案占用 180TB,改用 RS(4,2) 后占用 90TB,节省一半存储资源。某次排查线上事故时,恰好一台存储节点宕机,查询引擎自动走降级读路径,在 200ms 内从幸存节点解码返回缺失日志,成功定位到模型分数异常问题。

Python 演示

python80 行
import numpy as np # 使用 numpy 在 GF(2^8) 上模拟 RS(4,2) 纠删码的核心编码逻辑# 实际生产环境需使用专门的伽罗华域运算库,这里用多项式近似演示 def gf_add(a, b):    # GF(2^8) 加法即异或    return np.bitwise_xor(a, b) def gf_mul(a, b, prim=0x11d):    # GF(2^8) 乘法:俄罗斯农民乘法 + 不可约多项式取模    result = 0    for _ in range(8):        if b & 1:            result ^= a        carry = a & 0x80        a = (a << 1) & 0xFF        if carry:            a ^= prim        b >>= 1    return result def rs_encode(data_blocks):    # data_blocks: 包含4个字节的列表,模拟4个数据块    # 生成矩阵:上4行单位阵,下2行范德蒙德矩阵    G = [        [1, 0, 0, 0],        [0, 1, 0, 0],        [0, 0, 1, 0],        [0, 0, 0, 1],        [1, 1, 1, 1],        [1, 2, 4, 8],    ]    coded = []    for row in G:        acc = 0        for j, coeff in enumerate(row):            acc = gf_add(acc, gf_mul(coeff, data_blocks[j]))        coded.append(acc)    return coded def rs_reconstruct(survivor_data, survivor_idx):    # 输入: survivor_data 是幸存块的值, survivor_idx 是其原始位置    # 本演示简化处理:若丢失1块,用第一个校验块异或恢复    all_blocks = [None] * 4    for idx, val in zip(survivor_idx, survivor_data):        if idx < 4:            all_blocks[idx] = val    lost_idx = [i for i in range(4) if all_blocks[i] is None]    if len(lost_idx) != 1:        raise ValueError("本示例仅演示单块丢失恢复")    lost = lost_idx[0]    # 使用 p0 = d0+d1+d2+d3 恢复: 丢失块 = 其他块异或    recovered = 0    for i in range(4):        if i != lost:            recovered = gf_add(recovered, all_blocks[i])    all_blocks[lost] = recovered    return all_blocks if __name__ == "__main__":    data = [0x1A, 0x2B, 0x3C, 0x4D]    coded = rs_encode(data)    print("编码结果:", [hex(x) for x in coded])    # 模拟丢失第2个数据块(index=1)    survivor_idx = [0, 2, 3, 4]  # 幸存: d0, d2, d3, p0    survivor_data = [coded[0], coded[2], coded[3], coded[4]]    recovered = rs_reconstruct(survivor_data, survivor_idx)    recovered[1] = survivor_data[0]    # 实际应通过完整矩阵求逆恢复,这里用异或性质演示    missing = recovered[1]    recovered[1] = 0    val = 0    for i in [0, 2, 3]:        val = gf_add(val, data[i])    missing2 = gf_add(val, coded[4])    recovered[1] = missing2    print("恢复结果:", [hex(x) for x in recovered])    assert recovered[1] == data[1], "恢复失败"    print("单块丢失恢复成功!")
目的:用 Python 模拟 RS(4,2) 纠删码的单块丢失恢复过程,展示编码时的矩阵运算和解码时异或恢复的核心思想。
  1. G = [[1,0,0,0],...]构造 RS(4,2) 编码矩阵,前 4 行是单位阵,后 2 行是范德蒙德矩阵
  2. gf_add(a, b): return np.bitwise_xor(a, b)伽罗华域加法就是异或,是全部运算的基础
  3. gf_mul(a, b, prim=0x11d)用俄罗斯农民乘法和不可约多项式实现伽罗华域乘法
  4. for j, coeff in enumerate(row): acc = gf_add(acc, gf_mul(coeff, data_blocks[j]))逐元素乘加,完成矩阵乘法
  5. lost_idx = [i for i in range(4) if all_blocks[i] is None]定位丢失块的位置
  6. recovered = gf_add(recovered, all_blocks[i])用校验块 p0 的异或性质恢复丢失块
  7. assert recovered[1] == data[1], "恢复失败"验证恢复结果与原始数据一致

常见误区

误区网上很多文章说纠删码就是 RAID5 的升级版,所以直接把两者画等号。我理解成“RAID5 加了几块校验盘就是纠删码”。

正解RAID5 是纠删码的一种特例(RS(4,1)),但纠删码是更一般的理论框架。RAID5 只有 1 个校验块,只能容忍 1 块盘故障;而 RS(N,M) 可以配置 M 个校验块,容忍 M 块盘同时故障,校验块的生成方式也更灵活(范德蒙德矩阵或柯西矩阵)。好比“米饭”和“谷物”的关系:米饭是一种谷物制品,但谷物还包括小麦、燕麦、玉米。

为何常见:因为 RAID5 是最早大规模商用的“分块 + 校验”方案,大众先接触到它,就容易把更泛化的纠删码窄化为 RAID5。

误区既然校验块能防故障,那我配 RS(4,10),10 个校验块总比 2 个强吧?反正存储空间多的是。

正解校验块越多,容错能力越强,但存储放大率也随之飙升。RS(4,10) 的放大率是 14/4 = 3.5,比三副本还贵。实际工程中要在容错能力和存储成本之间取平衡,常用 RS(4,2)、RS(6,3)、RS(10,4)。就像买保险:保额越高保费越贵,理性的人不会给一辆旧车买全额全险。

为何常见:初学者只看到“容错数量”这一个维度,忽略了存储效率这个反面指标,属于单目标优化的思维惯性。

误区既然编码时已经算好了校验块,那恢复数据时直接读校验块就行,应该和读原始数据一样快、一样省资源。

正解恢复一个丢失块需要读取同一,条带内的所有幸存块(数据块 + 校验块)并执行矩阵运算。RS(4,2) 恢复一个块要读 5 个块,读放大 5 倍,同时消耗大量 CPU 做解码。这也是为什么系统设计时要尽量减少修复频率,并采用后台重建来错峰。

为何常见:人们容易把“写时一次性编码”误解为“恢复时也是读一个算一个”,忽略了矩阵求逆和全条带读取的固有成本。

误区纠删码又省钱容错能力又强,那所有存储系统都该用纠删码,多副本可以淘汰了。

正解纠删码在冷数据场景优势巨大,但在热数据场景存在明显短板:每次读都要经过网络拉取多个块并做解码运算,延迟明显高于从单个副本直接读取;修复时的读放大也远高于多副本。因此现代系统普遍采用混合策略:热数据用多副本,冷数据用纠删码。就像图书馆不会把热门小说也拆散存放——那会让读者等太久。

为何常见:只看到存储成本这一个指标,忽略了读延迟、修复带宽、CPU 开销等多个维度的综合权衡。

面试题

Q1. 三副本策略的存储放大率是多少?

单选题 · easy

  • A.1.0 倍
  • B.1.5 倍
  • C.3.0 倍← 正确答案
  • D.6.0 倍

答案:C。三副本意味着每份数据存储 3 份完整拷贝,实际占用物理空间是原始数据的 3 倍,所以存储放大率为 3.0。1.5 倍是 RS(4,2) 纠删码的放大率,6.0 倍是其他冗余方案的数值。

Q2. RS(4,2) 纠删码最多能容忍几块盘同时故障?

单选题 · easy

  • A.1 块
  • B.2 块← 正确答案
  • C.4 块
  • D.6 块

答案:B。RS(N,M) 中 M 表示校验块数量,它直接决定了容错上限。RS(4,2) 的 M=2,因此最多容忍 2 块盘同时故障。4 个数据块和 2 个校验块共 6 块,其中校验块数量就是可丢失块数。

Q3. 纠删码中的伽罗华域 GF(2^8) 解决了什么问题?

单选题 · mid

  • A.加快磁盘读写速度
  • B.保证矩阵运算结果不溢出且存在逆元← 正确答案
  • C.减少网络传输带宽
  • D.压缩数据存储空间

答案:B。GF(2^8) 是包含 256 个元素的有限域,加减法为异或,所有运算结果始终落在 0-255 内不会溢出,且每个非零元素都有乘法逆元,这是矩阵求逆恢复数据的数学基础。其他选项与伽罗华域无直接关系。

Q4. 在 RS(4,2) 中,修复 1 个丢失数据块的读放大倍数是多少?

单选题 · mid

  • A.1 倍
  • B.2 倍
  • C.5 倍← 正确答案
  • D.6 倍

答案:C。修复时需要读取同一条带内所有幸存块来解码,总共有 6 个块,丢失 1 个后剩 5 个幸存块,因此读放大为 5 倍。三副本修复的读放大才是 1 倍,这是纠删码的主要代价之一。

Q5. 以下哪些场景适合使用纠删码?

多选题 · mid

  • A.频繁读写的热数据
  • B.长期归档的冷数据← 正确答案
  • C.大模型训练集的历史备份← 正确答案
  • D.需要极低读延迟的线上缓存

答案:BC。纠删码适合访问频率低、可容忍一定延迟的冷数据和归档数据(如训练集备份),能在低成本下保证可靠性。热数据和低延迟缓存需要频繁解码,纠删码的计算开销会明显拖慢读路径,应使用多副本。

Q6. 关于降级读,下列说法正确的是?

单选题 · hard

  • A.降级读是指降低数据副本的优先级
  • B.降级读时系统用幸存块现场解码恢复丢失数据← 正确答案
  • C.降级读发生在数据编码阶段
  • D.降级读会把修复后的数据立即写回磁盘

答案:B。降级读发生在读取请求恰好命中丢失块时,系统动态读取同一条带内的幸存块并执行解码运算,把结果返回给客户端,对上层透明。它发生在故障后的读路径上,不涉及写入回填。

Q7. 范德蒙德矩阵在 RS 码中的作用是什么?

单选题 · mid

  • A.压缩数据块大小
  • B.生成多个线性无关的校验块← 正确答案
  • C.加速磁盘寻道
  • D.加密数据内容

答案:B。范德蒙德矩阵的行向量设计保证了任意 M 行系数之间线性无关,从而确保生成的校验块彼此独立,且任意丢失若干块后剩余矩阵仍可逆。这是解码恢复能成功的数学前提。

Q8. 关于纠删码与多副本的对比,正确的有?

多选题 · hard

  • A.纠删码存储效率更高← 正确答案
  • B.多副本读延迟更低← 正确答案
  • C.纠删码修复读放大更大← 正确答案
  • D.多副本存储成本更低

答案:ABC。纠删码用计算换空间,存储效率高但修复需读取多个幸存块,读放大更大;多副本直接读单份拷贝延迟低,但存储成本高。D 选项正好说反,多副本的存储成本远高于纠删码。

Q9. 条带(Stripe)在纠删码中指的是什么?

单选题 · easy

  • A.一块物理磁盘的完整内容
  • B.横跨多盘的一组数据块和对应校验块← 正确答案
  • C.数据在内存中的缓存区域
  • D.网络传输的数据包

答案:B。条带是把文件按固定大小切块后,排列在多个磁盘上的一行数据,包含若干数据块和校验块,是纠删码编码和恢复的基本单元。物理磁盘的完整内容远大于一个条带的大小。

Q10. 热数据不适合用纠删码的最主要原因是?

单选题 · mid

  • A.纠删码无法容忍磁盘故障
  • B.每次读取需要解码运算,延迟高← 正确答案
  • C.热数据占据空间太大
  • D.纠删码不支持并发访问

答案:B。热数据要求低延迟高吞吐,而纠删码每次读取都要从多个节点拉取幸存块并做矩阵解码,网络开销和 CPU 开销叠加导致延迟明显上升。多副本直接读本地副本,延迟低得多,因此热数据通常用多副本。