Azure Infrastructure · VO System Design

Microsoft Azure 双节点字节 RAID:读写映射、故障确认与恢复边界

从 read_byte/write_byte 和两节点约束出发,比较镜像与条带化;明确降级读写、写确认及重同步不变量。

题目重点:从 read_byte/write_byte 和两节点约束出发,比较镜像与条带化;明确降级读写、写确认及重同步不变量。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 训练主方案选双副本镜像:逻辑 byte offset 在两个节点同位置各存一份;目标是容忍单节点故障后仍可读取。
  • write_byte(offset,value) 需要明确返回成功的确认级别;本文强持久版只在两节点写入并持久确认后返回成功。
  • 单节点故障时允许降级读取;是否接受降级写入未由题目定义,训练版默认暂停新写以免分叉,另讨论可用性替代方案。
  • 同一 offset 并发写须按版本排序,不能只靠两份磁盘最终完成顺序。

解题路线

  1. 首先问面试官:优先容量还是容错?两节点 RAID0 条带化可用近两倍容量但任一节点坏就丢部分数据;RAID1 镜像只有单节点容量却能在一节点坏后读。
  2. 明确逻辑接口的 offset 范围、返回错误码、字节写入是否原子、持久确认与并发次序。主方案将同一 (offset,value,version) 写两副本,完成两侧 fsync/持久队列确认后才 ack。
  3. 读正常时选健康副本并比对版本;若数据不一致,以已提交日志/版本为准,不因某副本响应快就任意取值。一个节点故障时从另一节点读,写默认阻塞;若要可用的单节点写,须引入 fencing/epoch 和持久日志,防旧节点恢复后带旧状态服务。
  4. 节点恢复先隔离旧副本,按已提交版本快照+增量日志重同步,校验全量/分段 checksum,追上水位后才加入读取。
  5. 只有两个节点时难以仅靠多数投票判定谁是新的合法主;外部 witness/协调存储或更严格写停顿属于重要取舍。

手动走一遍

offset=7 原值 0;新写 5 先到节点 A、B 宕机。如果接口要求两节点持久确认,调用不得返回成功,恢复后要依据提交日志决定回滚或补齐;不能把 A 的 5 与 B 的 0 都当成已提交真值。若已确认写 5 后 B 故障,读可从 A 返回 5,重同步 B 后再恢复双副本。

规模与取舍

一次镜像写至少两次持久写和一次网络协调,延迟由较慢副本决定;正常读可一次副本读取,强读需版本/提交状态校验。存储开销约 2×逻辑数据量,加日志/checksum 元数据;重建需传输 O(数据量) 或 O(变更量),取决于日志保留和故障时长。RAID0 方案容量/容错特征不同,不能混称。

易错点与追问

容易失分的边界

  • 两节点镜像与两节点条带化不加区分。
  • 只在一侧写成功就对强持久接口 ack,随后故障可能丢已承诺数据。
  • 没有 fencing,让恢复的旧节点接受写并造成分叉。
  • 恢复时直接上线旧副本,客户端可能读到过期字节。
  • 题目明确说题目模糊,不能把本文设的 RAID1、同步确认说成面试官给定条件。

继续深挖

  • 如要求单节点故障期间继续写,怎样用 witness/epoch 保证不产生双主?
  • 跨机房副本延迟过高时,哪些一致性或可用性目标需要放松?
  • 如何让大范围批量字节写具有原子性?
  • 坏块静默损坏而节点未宕机,校验与修复如何做?
✓已复制微信号!