写时复制的核心机制
快照在逻辑上是某一时刻的完整数据视图,物理上却几乎不占空间:创建时只记录时间点与映射关系,不搬数据。真正的内容固化发生在第一次改写某个数据块时,机制先把原块复制到快照保留区,再让源卷写入新内容。此后快照读请求遇到未改写的块回落到源卷,遇到已改写的块则读保留区里的旧副本。
基本信息
| 创建代价 | 只登记元数据,通常为秒级 |
|---|---|
| 初始占用 | 接近零,随源卷改写逐步增长 |
| 读性能 | 基本不受影响,未改写块直接从源卷读取 |
| 写性能 | 首次改写需额外一次复制,随机写放大更明显 |
典型使用场景
- 变更前保护点:改动生效前留一个可回退时间点
- 备份窗口配合:备份系统读取稳定视图而不影响在线写入
- 测试环境准备:以快照为基准快速生成可写副本
- 数据修复:通过只读挂载取回历史版本文件
- 容量评估:用改写量估算保护点带来的空间开销
三个阶段的资源变化
| 阶段 | 数据流 | 空间变化 |
|---|---|---|
| 创建瞬间 | 仅写元数据与映射 | 几乎不增长 |
| 首次改写 | 旧块复制到保留区再写新块 | 按该块大小增长 |
| 重复改写 | 已复制的块不再重复搬运 | 不再增长(该块) |
| 快照读取 | 按映射回源卷或保留区 | 不产生新占用 |
机制时序理解
机制时序理解
# 时刻 T:创建快照,卷与快照共用全部数据块
# 时刻 T+1:卷要改块 A,先复制 A 到保留区,再覆盖 A
# 时刻 T+2:卷再改块 B,同样复制 B 到保留区
# 快照视图:块 A、B 读保留区副本,其余块读源卷当前位置
# 占用口径:等于自快照创建以来被改写过的数据量快照依赖一个可写的保留区或池空间。空间耗尽时,不同产品的处理方式不同:有的让快照失效,有的把卷置为只读,有的暂停写入。上线前必须确认为哪一种,并给保留区设置水位告警。