想象你是城市图书馆的馆长。馆里藏了一套 100 万页的《城市百科》,读者随时可能借阅任意一页,而且要求立刻打开——绝不允许“排队等上一任读者看完”。如果整套书只放在一个书库里,翻找太慢、人流拥挤,更可怕的是:一场火灾就会让全部知识灰飞烟灭。于是你做出一系列决定:把全书拆成几千册分册、均匀放到各个分馆;每一册都复印好几份存到不同的分馆;再制定一套严格的馆际同步规则,保证各个分馆的复印件一字不差;还可以随时给整座书库拍一张“全景照片”用作灾难复原。这套“巨型图书馆系统”,就是分布式块存储的生动缩影。云上的数据库、云盘、容器应用,都默默依赖它提供高性能、高可用、可弹性扩展的存储底座。本文就用这座图书馆的视角,带你搞懂数据分片、副本机制、一致性协议、快照等核心概念,看懂云原生存储是如何炼成的。

岗位关联

掌握分布式块存储的架构原理,是云计算存储工程师与架构师的必修课,也是理解云盘、数据库高可用与弹性扩容的坚实地基。

目录
  1. 可视化演示
  2. 1. 块存储基础:认识“块”这块砖
  3. 2. 数据分片:把分册均匀撒向各分馆
  4. 3. 副本机制:每册书都复印多份
  5. 4. 一致性协议:分馆间的同步铁律
  6. 5. 快照功能:给书库拍一张全景照片
  7. 6. 云盘应用:读者随借随还的借阅体验
  8. 7. 数据库支撑:最挑剔的学术研究室
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示分布式块存储的核心机制:数据分片与多副本复制拓扑、条带化并行IO与IOPS/吞吐性能随节点数的线性扩展能力。

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

分布式块存储拓扑架构 数据分片分布 多副本复制流 客户端请求路由 N副本 = 2f+1 三副本架构容忍f个节点故障

1. 块存储基础:认识“块”这块砖

馆长把《城市百科》拆成分册后,发现分册还不够“细”:如果一次只改一页,难道要把整册书重新抄一遍?于是馆员规定:所有藏书统一按 4KB 一“页”管理,借阅、抄录、清点都以页为最小单位。这个“页”就是块存储中的“块”(Block)——一个大小固定、可独立读写的数据单元,常见的块大小有 4KB、16KB、64KB。

把概念搬回计算机世界:块存储是三种存储形态中最“底层”的一种。文件存储关心“文件名和目录”,对象存储关心“钥匙和元数据”,而块存储只回答一个问题——“第几号块里放了什么数据?”。它不管上面是文件系统还是数据库,就像图书馆不管读者用这本百科写论文还是做剪报。一个“卷”(Volume)就是一组连续块的逻辑集合,通过 iSCSI 或 NVMe 等协议挂载给一台云主机,主机把它当成一块裸磁盘,格式化后才能在它上面建文件系统。

一个卷需要多少块,由容量和块大小共同决定:

有了“页”这个标准零件,分布式存储这座大机器才可能高效运转——分片、副本、一致性,都是在一页一页的粒度上操作的。块虽小,却是整座图书馆唯一的地基。

B=⌈Sb⌉B = \left\lceil \displaystyle\frac{S}{b} \right\rceil
通俗地说:卷的总容量 S 除以每块的大小 b,除不尽就向上取整。例如 64GiB 的卷配上 4KiB 的块,大约需要 1677 万个块。
  1. 分子 S(卷容量)卷的总容量,比如一块 64GiB 的云盘。
    S=64 GiBS = 64\,\text{GiB}
  2. 分母 b(块大小)每个数据块的固定大小,常见取值 4KiB。
    b=4 KiBb = 4\,\text{KiB}
  3. 取整符号最后一个块装不满也要按一块计算,保证空间足够。
    ⌈Sb⌉\left\lceil \displaystyle\frac{S}{b} \right\rceil

2. 数据分片:把分册均匀撒向各分馆

书拆成分册后,下一个问题是:这些分册放哪?如果全部堆在东馆一层楼,馆员找书依然费劲,读者也全挤在同一区。馆长的方案是让编号 1-100 的分册去东馆、101-200 的去西馆、201-300 的去南馆……这就是数据分片:把数据打散到多台节点,让每台节点只承担一部分读写压力,整座图书馆的容量也因此可以无限扩张。

分布式块存储里最主流的分片策略是哈希取模。每个数据块有一个全局唯一的块 ID,把它丢进哈希函数得到一个均匀分布的整数,再对节点数取模,就得到了“这本分册该放哪家分馆”的答案:

除了哈希映射,系统还会把大块 I/O 做“条带化”——把一个大的读写请求切成多份,同时发给多个节点并行处理,就像把整册书的复印任务分给十台复印机同时开工;节点之间还会不停做负载均衡,防止某个分馆的书架爆满而隔壁空空如也。分册撒得越均匀,整座图书馆的吞吐能力就越强。

node=hash(block_id) mod N\text{node} = \text{hash}(\text{block\_id}) \bmod N
  1. block_id(块编号)数据块的全局唯一编号,相当于书的册号。
    block_id=10086\text{block\_id} = 10086
  2. hash()(哈希函数)把块编号均匀打散成一个大范围内的整数,避免连续编号扎堆到同一节点。
    hash(block_id)=87654321\text{hash}(\text{block\_id}) = 87654321
  3. mod N(对节点数取模)取余得到 0 到 N-1 的节点编号,N 是存储节点总数。
    87654321 mod 4=187654321 \bmod 4 = 1

3. 副本机制:每册书都复印多份

东馆的一场小火警让馆长惊出一身冷汗:如果那 100 册书真的被烧了,百科就永远缺了一块。于是馆长定下铁规矩——每一册书都必须复印三份,分别放到三个互不相邻的分馆,这样哪怕一个分馆被火烧了,另外两处仍能借出完整内容。这就是副本机制:为每个数据块保存多份拷贝,并且把它们放到不同的故障域(不同机架、不同可用区)中,避免“同一个灾难一锅端”。

在分布式块存储中,每个块通常保存 2 到 3 份副本,其中一个是主副本(Primary),负责接收写入,其余是从副本(Secondary)。当一个节点的副本损坏或失联,系统会自动从其他副本把数据“补印”一份,恢复到目标副本数。副本带来的可靠性提升可以用一个公式衡量:

注意:副本数从 1 加到 3,可用性从 0.9 跳到 0.999;但继续加到 5,收益就越来越小,而空间和同步开销却在线性增长。复印机虽多,也要算算房租和电费,副本是可靠性与成本之间的精妙平衡。

A=1−(1−p)rA = 1 - (1-p)^{r}
  1. p(单节点故障概率)一个存储节点在一定时间段内发生故障的概率,例如 0.1。
    p=0.1p = 0.1
  2. r(副本数)一份数据保存的拷贝份数,例如 3 副本。
    r=3r = 3
  3. (1-p)^r(全部副本同灭)所有副本同时故障的概率,因为各副本相互独立,所以相乘。
    (1−0.1)3=0.729(1 - 0.1)^3 = 0.729
  4. 1 - …(至少一份存活)用 1 减去“全军覆没”的概率,就是数据仍然可用的概率。
    A=1−0.729=0.271A = 1 - 0.729 = 0.271

4. 一致性协议:分馆间的同步铁律

复印件多了,新的麻烦随之而来:读者在东馆借到的册子,和西馆那份会不会不一样?馆长规定,任何修改必须先在“主分馆”完成,再按编号顺序同步到各分馆;同时,每次读写都要遵守一条“过半数确认”规则,确保无论读者从哪个分馆借,看到的都是最新版本。这套馆际协作规则,就是一致性协议。

具体到工程实现,写入数据时,主副本负责协调:它把新数据发给所有从副本,要求至少 W 个副本确认写入成功,才向应用返回成功;读取数据时,客户端会并行读取 R 个副本,以内容最新的那份为准。只要读写涉及副本集合有重叠,就能保证读到最新数据,规则如下:

一致性协议还要防住一个经典灾难——“脑裂”。如果两个分馆之间的通信断了,它们各自以为自己是总馆,同时接受写入,等通信恢复就对不上账。解决办法是引入心跳和租约:只有持有“馆长令牌”的节点才能对外提供写服务,令牌过期必须重新竞选。同步铁律越严密,图书馆在极端情况下越不容易精神分裂。

W+R>NW + R > N
  1. N(副本总数)一份数据总共有多少个副本,例如三副本 N=3。
    N=3N = 3
  2. W(写确认数)写操作必须等待几个副本确认才算成功,例如 W=2。
    W=2W = 2
  3. R(读访问数)读操作至少访问几个副本并比较版本,例如 R=2。
    R=2R = 2
  4. W+R>N(集合必有交集)保证读到的副本集合和已写入的副本集合至少重叠一个,从而读到最新数据。
    2+2>32 + 2 > 3

5. 快照功能:给书库拍一张全景照片

图书馆每周五闭馆后,馆长都会让馆员给所有书架拍一张“全景照片”留档。如果接下来某天有书被撕毁、系统瘫痪,大家就能拿着上周五的照片,把书库还原成那一刻的样子。这张照片在存储世界里叫快照(Snapshot)——它把整个卷在某个时间点的状态完整保存下来,用于灾难恢复、测试和克隆新卷。

聪明的你可能马上问:一个 1TB 的卷,拍快照难道要立刻复制 1TB 数据?馆长才不会这么笨。快照采用的是“写时复制”(Copy-on-Write)技术:拍照那一刻,什么都不复制,只记录一份元数据清单;只有当某个块在快照之后被修改时,系统才先把“旧块”复制到快照区域,再允许新数据覆盖原位置。这样一来,快照初始成本几乎为零,之后只随修改量缓慢增长:

快照还可以串联成“快照链”,每张新照片只记录与上一张的差异,节省大量空间;而基于快照可以秒级生成一个独立的新卷(克隆),供测试或生产使用。照片看似轻巧,却为数据灾难恢复上了最结实的一道保险。

ΔCOW=∑k=1mbk\Delta_{\text{COW}} = \sum_{k=1}^{m} b_k
  1. m(被修改的块数)快照创建后,被写入请求修改过的数据块个数。
    m=128m = 128
  2. b_k(第 k 个旧块大小)每个被修改块的大小,通常是固定的块大小。
    bk=4 KiBb_k = 4\,\text{KiB}
  3. 求和符号(增量累计)把所有被修改块的大小加起来,就是快照额外占用的空间。
    ΔCOW=128×4 KiB=512 KiB\Delta_{\text{COW}} = 128 \times 4\,\text{KiB} = 512\,\text{KiB}

6. 云盘应用:读者随借随还的借阅体验

对读者来说,他根本不需要知道书存在哪个分馆、有几份拷贝——只要到前台报出册号,几分钟内书就送到手上。云盘(云硬盘)就是分布式块存储面向云主机提供的这种“读者体验”:一台云主机就像一位读者,云盘就是它专属的借阅证,随时可以挂载、卸载,容量也能弹性伸缩。

云硬盘在云平台上承担着几个关键职责:一是作为云主机的系统盘和数据盘,操作系统、应用程序都跑在它上面,提供持久化存储——云主机宕机重启后数据依然在;二是支持在线扩容,业务增长时无需停机就能把卷从 100GB 扩到 1TB,就像读者把借阅额度从 10 本升到 100 本;三是共享盘,允许把同一个卷同时挂载给多台云主机,让集群中的多个节点像几位学者共读同一册珍贵文献一样协作。

块存储集群的性能通常用 IOPS(每秒读写次数)和吞吐量衡量,分布式架构通过条带化把多个节点的能力聚合起来:

云盘的体验如此自然,以至于很多开发者都没意识到:自己随手创建的一块系统盘,背后是一个会在几百毫秒内完成多副本同步、故障切换和负载均衡的庞大分布式系统。

IOPStotal=IOPSsingle×nshards\text{IOPS}_{\text{total}} = \text{IOPS}_{\text{single}} \times n_{\text{shards}}
  1. IOPS_single(单节点能力)单个存储节点每秒能处理的读写次数,例如 2 万。
    IOPSsingle=20000\text{IOPS}_{\text{single}} = 20000
  2. n_shards(并行条带数)一个卷的数据条带化分布在多少个节点上,例如 8。
    nshards=8n_{\text{shards}} = 8
  3. 乘积(聚合吞吐)多节点并行工作,总 IOPS 近似放大,但受最慢节点和网络限制。
    IOPStotal=20000×8=160000\text{IOPS}_{\text{total}} = 20000 \times 8 = 160000

7. 数据库支撑:最挑剔的学术研究室

如果把云主机比作普通读者,那数据库就是图书馆里最挑剔的学术研究室:它要求每一本参考书(数据页)必须在极短时间内取到,任何一次借阅记录(事务日志)都必须立刻登记在案,绝不能丢。数据库的持久化与高可用,深深依赖底层块存储的可靠性。

数据库在提交一个事务时,会先把日志写入 WAL(Write-Ahead Logging,预写日志),确保宕机后能通过日志重放恢复数据。这份 WAL 日志就存放在分布式块存储提供的卷上。块存储的每一次写确认延迟,直接决定了数据库每秒能提交多少事务:

除了 WAL,数据库还利用块存储的弹性扩展能力——数据量增长时在线扩容数据卷;利用快照能力做定期备份;存储层发生故障时,底层的副本切换对数据库透明,数据库几乎察觉不到。学术研究室的桌椅板凳可能很普通,但它脚下的大楼地基,必须足够坚固。分布式块存储就是那栋大楼最可靠的地基。

Tcommit=Twal+TackT_{\text{commit}} = T_{\text{wal}} + T_{\text{ack}}
  1. T_wal(日志落盘耗时)WAL 日志块写入主副本并刷新到磁盘的时间。
    Twal=2 msT_{\text{wal}} = 2\,\text{ms}
  2. T_ack(副本确认耗时)主副本等待 W 个从副本确认写入的额外时间。
    Tack=1 msT_{\text{ack}} = 1\,\text{ms}
  3. 求和(提交总延迟)二者之和决定一次事务提交的最小延迟,延迟越低 TPS 越高。
    Tcommit=3 msT_{\text{commit}} = 3\,\text{ms}

AI 应用场景

AI 训练集群的共享数据盘

阶段:模型训练阶段的数据读取与持久化

解决的问题:训练数据集动辄数百 GB 到数 TB,传统本地盘容量受限且单点故障会导致训练中断;多台 GPU 节点需要并发读取同一份数据,本地盘无法共享。分布式块存储通过多副本和条带化,让多节点共享一个高吞吐卷,且任一分馆(节点)失火都不影响训练。

具体案例:一个 Kubernetes 上的 PyTorch 大模型训练任务,把 2TB 的图片数据集挂载为分布式云盘,8 台 GPU 节点并发读取。训练调参过程中频繁保存 checkpoint,每 5 分钟快照一次,某次训练崩溃后从快照秒级恢复现场。

特征库与元数据库的弹性底座

阶段:在线推理与业务元数据存储

解决的问题:推荐系统每天产生海量用户特征和埋点数据,数据库存储容量增长快、访问延迟要求高。传统物理磁盘扩容要停机迁移,分布式块存储卷可以在线扩容、自动负载均衡,像图书馆随时把分册移到更空闲的分馆。

具体案例:某电商推荐系统的 MySQL 集群,底层数据盘全部使用分布式块存储。大促前数据库容量告警,存储团队在线将数据卷从 2TB 扩展到 5TB,全程业务无感知;底层某存储节点故障后自动切换到副本,数据库连接仅抖动 200ms。

模型版本的快照备份与回滚

阶段:模型版本管理与灾备恢复

解决的问题:模型文件、训练中间状态、配置文件需要定期备份,误删除或算法事故后要快速回滚到历史版本。分布式块存储的快照功能以近乎零成本记录卷的某个时间点状态,配合快照链还能按时间点精确恢复。

具体案例:算法团队每周对模型仓库挂载的云盘做一次快照,保留最近 4 周快照链。某次调参脚本误删了验证集数据,团队基于前一天快照克隆出一个新卷挂载回去,5 分钟内恢复训练。

Python 演示

python63 行
import hashlib  class Block:    """一个数据块,模拟固定大小的一块数据"""     def __init__(self, block_id, data):        self.block_id = block_id        self.data = data  class DistributedBlockStore:    """模拟分布式块存储:哈希分片 + 多副本写入"""     def __init__(self, node_count, replica_count):        self.nodes_map = [{} for _ in range(node_count)]        self.replica_count = replica_count        self.write_count = 0     def _targets(self, block_id):        """返回该块应写入的节点列表(主副本 + 从副本)"""        start = int(hashlib.md5(str(block_id).encode()).hexdigest(), 16) % len(self.nodes_map)        result = []        for i in range(self.replica_count):            result.append((start + i) % len(self.nodes_map))        return result     def write_block(self, block):        targets = self._targets(block.block_id)        for node_id in targets:            self.nodes_map[node_id][block.block_id] = block.data        self.write_count += 1        return targets     def read_block(self, block_id):        for node_id in self._targets(block_id):            if block_id in self.nodes_map[node_id]:                return self.nodes_map[node_id][block_id]        return None     def kill_node(self, node_id):        """模拟节点故障:清空该节点的所有块"""        self.nodes_map[node_id] = {}  def main():    store = DistributedBlockStore(node_count=4, replica_count=3)     for bid in range(10):        data = b"block-%d" % bid        targets = store.write_block(Block(bid, data))        print("write block %d -> nodes %s" % (bid, targets))     print("read block 0:", store.read_block(0))     store.kill_node(2)    print("after node 2 down, read block 0:", store.read_block(0))    print("after node 2 down, read block 1:", store.read_block(1))    print("total writes:", store.write_count)  if __name__ == "__main__":    main()
目的:用 Python 模拟一个含 4 个节点、3 副本的分布式块存储,演示哈希分片、多副本写入、节点故障后的读取容错。
  1. self.nodes_map = [{} for _ in range(node_count)]每个节点用字典保存块数据,模拟一台存储节点。
  2. start = int(hashlib.md5(...), 16) % len(self.nodes_map)对块 ID 哈希取模,决定主副本落在哪台节点。
  3. result.append((start + i) % len(self.nodes_map))从主副本起轮转选择从副本,把副本分散到不同节点。
  4. for node_id in targets: self.nodes_map[node_id][block.block_id] = block.data同一份数据写入多个副本,模拟冗余存储。
  5. def read_block(self, block_id)读取时从主副本开始尝试,失败则顺延到下一个副本,模拟容错转移。
  6. store.kill_node(2)模拟节点 2 宕机,验证其他副本仍能提供数据。

常见误区

误区我平时用的就是文件、文件夹、目录这些,块存储应该也差不多吧?不都是存数据的东西吗?它们只是叫法不同而已。

正解块存储和文件存储是两个层次。块存储只提供“第几号块、写什么数据”的裸服务,完全不关心文件名;文件系统是盖在块存储之上的一层“泥瓦匠”,把砖(块)砌成墙(文件)。云盘挂到云主机后,还要先格式化、创建文件系统,才能看到一个个文件。文件存储是“成品墙”,块存储是“砖厂”。

为何常见:日常接触最多的就是文件系统,容易把上层能力当成存储本身,忽略了底层的块设备。

误区提高数据可靠性最简单的方法就是加副本,三副本不行就五副本,无非多花点存储成本而已,为什么不直接拉满?

正解副本增加会带来三重代价:写放大(每次写入要同步更多副本)、空间占用线性上涨、网络同步开销变大。而且收益递减明显:单节点故障率 0.1 时,3 副本可用性 0.999,5 副本也就 0.99999,但写入开销几乎翻倍。副本数是可靠性、成本和性能三方博弈的平衡点。

为何常见:只看到可用性公式里 r 越大值越接近 1,没看到等号右边的成本项也在悄悄放大。

误区分布式存储就应该时刻保证强一致,否则读到旧数据怎么办?数据错了谁来负责?

正解强一致需要写入等待 W 个副本确认、读取比较 R 个副本,延迟明显更高。很多场景(如缓存、临时文件、日志归档)允许最终一致,用更低的成本换取更高性能。块存储面向数据库这类对一致性敏感的场景通常要求强一致,但工程师要理解它的代价,而不是无脑套用。

为何常见:单机时代的“读完必是最新”习惯被带到了分布式世界,忽略了网络延迟和副本同步的物理成本。

误区做快照肯定要把整个卷的数据全部复制一遍,1TB 的卷快照就要占 1TB 空间,所以轻易不敢做快照。

正解快照采用写时复制,创建那一刻不复制任何用户数据,只记录元数据;之后每修改一个块,才在覆盖前把旧块复制到快照区。初始成本几乎为零,后续只随修改量缓慢增长。这正是快照可以秒级完成、并能频繁执行的根本原因。

为何常见:“拍照”的直觉让大脑默认快门一闪就要复制所有画面,忽略了工程上的巧妙优化。

面试题

Q1. 块存储中最基本的读写单元是什么?

单选题 · easy

  • A.固定大小的数据块← 正确答案
  • B.任意大小的数据文件
  • C.完整的数据库文件
  • D.网络协议的数据报文

答案:A。块存储的核心特征是固定大小(如 4KB)的数据块作为读写最小单位。文件是文件系统组织出来的上层概念,不是块存储的直接单元,就像“页”是书的最小物理单元,而“章节”是内容组织。

Q2. 数据分片时,块 ID 到存储节点的常见映射方式是?

单选题 · easy

  • A.哈希取模映射← 正确答案
  • B.随机猜测映射
  • C.按文件名长度映射
  • D.按访问时间排序映射

答案:A。分布式块存储最常用 hash(block_id) mod N 把数据块均匀映射到节点。随机猜测无法保证确定性,按文件名或访问时间排序与块的寻址方式无关。哈希取模就像按册号分馆,稳定且均匀。

Q3. 单节点故障率 p=0.1,采用 3 副本时数据可用性约为?

单选题 · easy

  • A.0.9990
  • B.0.9000
  • C.0.7290
  • D.0.2710← 正确答案

答案:D。代入公式 A = 1 - (1-p)^r = 1 - 0.9^3 = 0.271。三个副本全部故障的概率是 0.729,所以至少一个副本存活的概率是 0.271。这也说明单副本(r=1)时可用性只有 0.9,三副本让数据安全了约 27 倍。

Q4. 分布式块存储中“脑裂”问题的核心是什么?

单选题 · mid

  • A.副本分属多个互不通信的阵营← 正确答案
  • B.数据块切分得过于细小
  • C.多个副本放在同一个机柜
  • D.快照导致磁盘空间耗尽

答案:A。脑裂指网络分区后,集群分裂成多个互相不知道对方存在的团体,各自接受写入,导致数据版本分叉。多个副本放同一机柜是故障域设计问题,与脑裂无关。心跳和租约就是用来防止“两个分馆都以为自己是总馆”。

Q5. 快照的“写时复制”是指?

单选题 · mid

  • A.修改前先复制旧块保存← 正确答案
  • B.修改前先删除旧数据
  • C.所有写入都先复制新块
  • D.写入时暂停所有快照

答案:A。写时复制的精髓是“懒”:快照创建时不复制任何数据,直到某块要第一次被修改时,才把旧块复制到快照区,再允许新数据覆盖。这样既保留了旧状态,又避免了全量复制的高昂成本。

Q6. 下列哪些属于分布式块存储的核心机制?

多选题 · mid

  • A.数据分片与条带化← 正确答案
  • B.多副本冗余存储← 正确答案
  • C.一致性协议协调← 正确答案
  • D.自然语言语义解析

答案:ABC。分片解决“如何扩展”,副本解决“如何容错”,一致性协议解决“多个副本如何保持同步”,三者共同构成分布式块存储的骨架。自然语言语义解析属于 NLP 领域,与底层存储机制无关。

Q7. Quorum 规则 W+R>N 能保证什么?

单选题 · mid

  • A.读写副本集合必有重叠← 正确答案
  • B.数据一定存储在三副本节点
  • C.读写延迟一定达到最低
  • D.副本之间无需任何通信

答案:A。W+R>N 是鸽笼原理的体现:写入至少覆盖 W 个副本,读取至少访问 R 个副本,两者数量之和超过 N,必然至少重叠一个副本,于是读操作一定能遇到包含最新数据的副本。它不保证延迟最低,也不免除副本间通信。

Q8. 关于副本数与可用性 1-(1-p)^r,正确的理解是?

多选题 · hard

  • A.副本增加可降低数据丢失概率← 正确答案
  • B.副本增加会提升写入开销← 正确答案
  • C.副本数越多占用的空间越大← 正确答案
  • D.副本数可以无限增加无代价

答案:ABC。副本数 r 增大确实让可用性曲线逼近 1,但同时带来写放大、空间占用和网络同步开销线性上涨,所以副本数不可能无限增加。工程上通常在 2 到 5 之间权衡,而不是盲目堆副本。

Q9. 云主机访问云盘的数据路径顺序是?

单选题 · mid

  • A.应用-文件系统-块设备-网络-存储节点← 正确答案
  • B.应用-网络-文件系统-存储节点-块设备
  • C.存储节点-网络-块设备-应用-文件系统
  • D.文件系统-应用-存储节点-网络-块设备

答案:A。应用先通过文件系统发起读写,文件系统把文件操作翻译成块的读写,经过块设备驱动封装成 iSCSI/NVMe 请求,再经网络到达远端存储节点。其他顺序都颠倒了数据流的逻辑层级。

Q10. 数据库的 WAL 日志与块存储快照的关系是?

单选题 · extreme

  • A.两者配合提升数据恢复能力← 正确答案
  • B.两者作用完全相同可以互换
  • C.快照可以完全替代 WAL 日志
  • D.WAL 日志只保存在内存中

答案:A。WAL 记录的是“增量的事务修改”,保证崩溃后能逐条重放;快照记录的是“某个时间点的全量状态”,用于快速恢复和回滚。两者是互补关系:用快照做基座、用 WAL 做增量,是数据库恢复的经典组合。WAL 必须落盘才有意义,快照也替代不了逐条日志的精确性与灵活性。