快照(Snapshot)

快照(Snapshot)

Snapshot是关于制定数据集合的一个完全可用拷贝,该拷贝包括相应数据在某个时间节点的映像(一般会维系一个映射表和源数据进行对应)。

快照(snapshot)是完全可用的一个拷贝,但不是完整的拷贝。
原因:如果是针对snapshot进行的读取,完全通过映射表查找源数据,所以不需要与源数据保持完全一致。

snapshot和简单的镜像不同,并非在一开始就占用和源数据完全相同的内存空间,而是根据创建后上层业务产生的数据实时占用必需的存储空间。

使用场景

  1. 数据保护措施:如Git,可以根据之前的数据快照对数据进行回滚。
  2. 提供给上层业务当成源数据:将之前版本的数据快照提供给上层业务当成源数据,不会影响当前版本的开发。

实现方式

1.写时拷贝(COW:Copy On Write)

创建snapshot后,对源数据写数据X,X首先会在缓存排队。
然后源数据将原有数据Y写入snapshot,最后从缓存中读取X更新源数据

  1. 如果是读取源数据,与snapshot不存在任何数据交互。
  2. 如果是读取snapshot,首先由snapshot系统进行判断上层业务需要读取的数据是否在snapshot中,如果在则读取,否则根据映射表源数据读取。

回滚

锁定源数据,将snapshot中的数据拷回源数据

删除snapshot

直接销毁snapshot映射表,对源数据无影响。


2.写重定向(ROW:Redirect On Write)

ROW采用的方式是直接在snapshot上进行写操作,源数据只保存创建snapshot之前的所有数据,不参与后续的写操作更新。
写入一个数据X时,首先在缓存排队,snapshot会判断X应该存入源数据的逻辑地址(但不会实际存入!!!),但将X直接存入snapshot,并将两者的逻辑地址都更新到映射表

优先读snapshot,如果读不到,说明数据是在创建snapshot之前写入的,查映射表可以找到其在源数据中的位置。

回滚

源数据不参与写操作,所以源数据就相当于以前的备份,直接删除snapshot即可。

删除snapshot

删除snapshot,要先锁定源数据,根据映射表,将snapshot中的数据拷回源数据

-------------本文结束感谢您的阅读-------------

本文标题:快照(Snapshot)

文章作者:DragonBaby308

发布时间:2019年07月09日 - 22:02

最后更新:2020年01月30日 - 13:28

原始链接:http://www.dragonbaby308.com/snapshot/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

急事可以使用右下角的DaoVoice,我绑定了微信会立即回复,否则还是推荐Valine留言喔( ఠൠఠ )ノ
0%