我们常常接触到快照这个词,那么,快照是什么?有什么用?一般怎么做快照?
开始
存储网络行业协会SNIA(StorageNetworking Industry Association)快照的定义:关于指定数据集合的一个完全可用拷贝,该拷贝包括相应数据在某个时间点(拷贝开始的时间点)的映像。快照可以是其所表示的数据的一个副本,也可以是数据的一个复制品。
啥叫快照?
使用场景
数据备份:阿里云或其它云服务器,都提供有相应的快照服务,客户可以选择在某个时间点创建快照。创建完成后,可以在之后某个时间点,将服务器中的数据恢复到快照的时间节点。Redis等存储服务,也提供快照功能。快照的一个基本用处就是数据备份。注意,这种备份是某个时间节点的数据备份。
数据源:快照也可以当做数据源来使用。因为快照可以是其所表示数据的一个副本或者复制品,所以,快照也可以当然数据源来使用。
不是完整副本
快照是一份完整的数据拷贝吗?我们说,你可以把快照当成是一份数据拷贝来使用,读或写都可以,但是,快照事实上是不完整的。假如,一份源数据,在今天0点做了一份快照,到了2点时,由于一些错误的操作,导致数据发生混乱,想要恢复到0点时的数据,可以利用快照轻松做到。但是,如果发生了很大的故障(比如恐怖分子炸毁了服务器),导致源数据完全丢失,那么,快照将无法继续提供数据服务,也无法利用快照将数据恢复到0点时的状态。为什么?
怎么做
先来自己思考一下,快照可能需要做些什么?怎么做?(思考是学习的重要组成部分)
我们把存放源数据的容器称之为源数据卷,存放快照的数据称之为快照卷。假设我们要在今天0点进行快照的创建,那么,我们最终目标就是,在以后的某个时间点,可以通过某种方式,将源数据恢复到0点时的样子。
最简单的方式当然是做一份完整的拷贝,到时候直接复制回去即可。但是,这样做往往耗时较长,空间占用也比较多。所以,暂不考虑这种方式。
另外一种方式就是把有变化的数据存储下来,即将发生了改变的数据的原始状态保存下来。这样,在恢复时,将这部分数据和没发生过变化的数据合并起来,就达到了恢复的目的。没错,快照就是这么做的。
快照主要有两种技术方式实现,它们的核心区别是,一种将原始数据保留在数据源卷,另一种将原始数据保留在快照卷。
写时拷贝COW
这种方式,将原始数据保留在快照卷。
写操作:
COW写操作
注意:只在快照创建后,第一次写时,会发生将原始数据从源数据卷复制到快照卷的操作。之后再写时,由于原始数据已经在快照卷中备份过了,所以,直接写就可以了。
读操作:读数据时,由于这种快照创建方式,对源数据卷中的数据是没有影响的,即源数据卷中的数据就是最新数据,所以,直接从源数据卷中读取就可以了。
而如果要针对快照卷进行读取操作,那么,在读操作时,要进行判断,如果数据在快照卷中有,就直接读取,如果没有,就重定向到源数据卷中进行读取。当然,这种读取方式,只能读取到快照创建前的数据,快照创建后,发生改变的数据是读取不到的。
数据回滚:在数据回滚时,要先将源卷锁定,然后根据映射表,用快照中的数据拷贝覆盖源数据卷中的数据,解除源卷锁定,即完成数据回滚。
删除快照:如果快照不需要了,直接将快照删除即可。由于以这种方式创建快照,数据在源卷中就是完整的,所以,直接删除即可,无需和源卷进行交互。
写时重定向ROW
这种方式,将原始数据保留在源卷。
写操作:
ROW写操作
注意:每次写,都要将新数据写到快照卷,源数据卷中始终保持快照创建时的状态。
读操作:针对源数据卷读取时,源数据卷中有完整的快照创建前的数据。如果想要读取到创建后变化的新数据,则需要根据映射表重定向到快照卷中读取。针对快照卷读取时,只能读取快照创建后发生变化的数据,如果要读取没有发生变化的数据,或者快照创建前的原始数据,则需要重写向到源卷中读取。
数据回滚:这种方式下,快照创建后发生变化的数据都存放到了快照卷上,所以,回滚时,只需要保持读操作全在源卷中,不进行重定向即可。
快照删除:快照删除时,根据需要,一般要将快照中的数据回写到源卷中(这些数据都是最新的)。操作流程是将源卷锁定,根据映射回写数据,解除源卷锁定,删除快照。
怎么用
结语
快照在很多地方都有应用,了解它的原理有助于我们了解其它相关的应用。快照的实现原理也是一种很经典的程序设计思路,可以给我们很多的启发。
举报/反馈

简单说架构

166获赞 807粉丝
从简单的角度切入系统架构
关注
0
0
收藏
分享