克隆与快照的本质差异
克隆(Clone)与快照(Snapshot)在底层往往共用同一套写时复制(CoW)或重定向写(RoW)机制,但交付给主机的形态完全不同。快照记录的是一个卷在某一时刻的数据状态,本身不改变原卷的身份,主机通常看不到它;克隆则从源卷或快照派生出一个具有独立卷标识与映射的卷,主机能像使用普通卷一样对它读写。因此快照回答的是"数据在那一刻长什么样",克隆回答的是"如何在不影响生产卷的前提下拿到一份可以随便改的数据"。
基本信息
| 快照对象 | 卷或一致性组在某一时刻的映像 |
|---|---|
| 克隆对象 | 从源卷/快照派生的独立可读写卷 |
| 底层机制 | CoW 写时复制或 RoW 重定向写 |
| 空间增长 | 按变化块增量增长,不复制全量 |
| 依赖关系 | 快照依附源卷;克隆可与源卷解耦 |
| 典型定位 | 快照用于回滚与备份源;克隆用于测试与分发 |
典型使用场景
- 升级或变更前打一份快照,失败时整卷回滚,避免长时间还原备份
- 给测试与开发环境提供接近生产的数据,用克隆隔离,测试可任意写入
- 备份软件挂载快照做流式读取,避免备份窗口内长时间占用生产卷
- 报表与分析任务克隆一份数据副本,不干扰生产库的读写负载
- 从一个快照派生多个克隆,快速向多套环境分发同一份基线数据
关键差异对照
| 维度 | 快照 | 克隆 |
|---|---|---|
| 可写性 | 通常只读,部分产品支持可写快照 | 独立可读写 |
| 卷身份 | 依附源卷,不是独立卷 | 拥有独立标识与映射 |
| 回滚能力 | 支持整卷或一致性组回滚 | 一般不用于回滚,直接使用 |
| 生命周期 | 源卷删除后可能失效 | 可脱离源卷独立保留 |
| 空间占用 | 只存变化块 | 只存与源卷的差异块 |
| 恢复粒度 | 整卷或卷组级 | 整卷级,上层可再细分 |
时间线示意
时间线示意
# t0 对源卷 LUN-A 打快照 s1,仅记录指针,几乎不占空间
# t1 LUN-A 写入块 B,触发 CoW,B 的旧数据被写入快照空间
# t2 从 s1 克隆出 c1,c1 与源卷共享未改动块
# t3 删除 s1,c1 失去共享来源,需要完整化后才能继续使用
# t4 在 c1 上做破坏性测试,不影响 LUN-A 的生产数据克隆的空间效率通常依赖与源卷或源快照共享未修改数据块。一旦源快照被删除、源卷被覆盖或产品策略要求解耦,克隆需要把共享块复制成私有块,这个过程在部分产品中称为断开依赖或完整化,期间会额外占用容量并产生后台 IO。
快照不能当作备份。快照与源数据通常位于同一存储池、同一控制器、同一机房,阵列整体故障、存储池损坏、误删源卷或勒索加密会同时波及源数据与快照。备份的必要条件是副本与源数据在不同故障域,并且可以被独立恢复。