Because each Snapshot contains only pointers and blocks that have changed, the size of the Snapshot is very small compared to the complete  system it represents.

下面的图很好地讲述了Netapp Snapshot的实现原理。

1、 文件系统写block  A, B, C,  D 到磁盘并且用指针指向它们(元数据)

es snapshot恢复_es snapshot恢复

2、 这个时候创建一个快照-snapshot1,没有读写数据或copy数据到磁盘,这个snapshot仅仅是指向目前的位置

es snapshot恢复_es snapshot恢复_02

3、文件系统修改block C,并且写C‘到磁盘中,而原来的block C没有任何变化。因此现有的文件系统指向C’而不是指向C。而步骤1中创建的snapshot1仍然指向C。

es snapshot恢复_hadoop_03

4、文件系统此时再做snapshot2用于指向现有的块,没有数据被读、写、或copy到磁盘,因此没有性能影响。

es snapshot恢复_hadoop_04

5、如果文件系统还有变化,那么文件系统继续写到新的block中。

es snapshot恢复_hadoop_05

 以上就是Netapp snapshot的实现机制,图形化解释非常形象,也易于理解。这种快照实现方式是NetApp独有的,基于NetApp看家本领Write anywhere file layout技术,而其他厂家(比如IBM DS3K/4K/5K)的实现方式(即copy-on-write)是另一种,如下图。和其他厂家相比,NetApp这种快照实现方式对性能影响较小(只有一次写操作,而其他厂商是2写1读),无需预留区,无论快照还是快照恢复,都是秒级别,大大提高性能。

es snapshot恢复_java_06

Netapp数据快照的优势

不管拍多少份快照,对系统性能没有任何影响

不需要给快照提前分配存储空间,这样就不会造成如下两种情况

–给快照空间分配过大,造成空间浪费

–给快照空间分配过小,导致快照失效

可以对一份数据最多进行255份快照

Snaprestore

如上图,NetApp的快照没有改变原有的block,因此在做快照restore的时候不需要任何的数据拷贝过程,只涉及到一些标志位的修改和数据块的释放,因此,不管需要恢复的数据量多大,都能在很短的时间内完成数据恢复

注: 分布式文件系统MooseFS也有mfsmakesnapshot命令,可以对文件或文件夹做快照,并且能支持多个源文件采用append方式将快照追加到同一个快照文件中。下面是摘自MooseFS中的一段话,由此可见,实现原理都是类似的。

mfsmakesnapshot prepares a copy of the whole file (or files) in one operation. Furthermore, until modification of any of the files takes place, the copy does not take up any additional space.)

 下篇--《netapp学习(十三)---Snapshot实验(下)》