https://zhidao.baidu.com/question/390419827403884965.html
快照原理:将当前虚拟机的虚拟硬盘文件锁定,不再更改。之后新建一个文件,之后所有更改都放到新建的文件中,读取时,优先读取这个新建的文件中的,没有的话在读取锁定中的数据。所以快照占的空间 取决于 你做了多少更改。
作者:木头龙
链接:https://www.zhihu.com/question/20374919/answer/499376887
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
一句话答案:快照是数据存储的某一时刻的状态记录;备份则是数据存储的某一个时刻的副本。这是两种完全不同的概念。
先说背景知识:我们现在电脑上的数据,记录方式都是地址->数据这样存放的。例如我们最熟悉的机械硬盘,最小存储单位是扇区,老式硬盘一个扇区512字节,新式硬盘一个扇区4096字节。每个扇区都有自己的地址,现在主流的LBA寻址方式,就是从0开始,0,1,2,3,……,N这样。
当然,对于外部存储,我们一般不会这样直接存放数据,我们可能通过硬盘分区,并且格式化对应分区后存放数据,于是就变成这样的情况:
例如上图,我们建立一张逻辑地址和物理地址的映射表,每个逻辑地址 对应两个物理存储单元。当然,这是比较简单的情况:物理硬盘,上面有一个磁盘分区,格式化的时候一个分配单元(Windows叫“簇”)占两个扇区。复杂一点的,可能会有多层逻辑地址,例如分区上有一个虚拟磁盘文件,作为虚拟机的“物理”设备。而虚拟盘的每一个物理扇区号,其实只是虚拟磁盘文件的某个逻辑地址,又对应着文件系统的某个分配单元,同时又是物理磁盘的某个物理扇区号。也就是说可能存在多层逻辑地址,而每一层逻辑地址都会把上一层逻辑地址看做是物理地址对待,这个就不展开了。
如果这个时候,我们做一个快照,快照的数据大概类似这么一个东西:
如果我们要把保存的ABCD改成AACD,在没有快照的时候,是下图的情况(数据在原来的地址上被覆盖了):
很显然,我们找不回ABCD这个数据了。而如果我们做了快照,快照地址0、1 对应的物理地址[0-3] 就被锁定不可更改了,结果会类似这么一个情况:
(PS:因为我们之前做快照,所有逻辑地址[0,1]以及与其对应的物理地址[0,1,2,3]都被锁定了。于是我们在尝试修改被锁定的逻区域的时候,我们会把新的修改存到一个新的区域。例如,我们对原来的逻辑地址0(即物理地址[0,1])进行修改的时候,会将修改写到新的逻辑地址0(物理地址[7,8])中)
这个时候,我们按照0-1-2-3这样的逻辑地址,读取出来的就是AACD,两个空单元。按照快照地址0-1读取数据,我们就能读取到原来的ABCD了。同时,我们可以看到,原来的逻辑地址4没有了。换句话说,我们的存储空间少了一个逻辑存储单元。
当然,上面这是最简单的快照。事实上,我们要考虑将来,逻辑地址1可能要从CD改成EF;将来我们需要再做快照2、快照3,更复杂的,我们可能做了快照3之后,回滚到快照1,然后继续修改数据,之后再做一个快照4……又或者这是一个虚拟硬盘文件,放入一份原始数据之后,做了一个快照;然后我们在这个基础上创建了虚拟硬盘2、3、……、N,用于存放不同逻辑的数据处理结果。这些更复杂的情况就不展开说了。
一般来说,原则就是就是快照时锁定物理单元内容,并记录本次快照和上一次快照的所对应的物理地址(或者是上一层逻辑地址)的差异。上面例子中,快照完成后,物理地址0-3的数据是不可改动的。如果改写后再做第2次快照,则物理地址8-9也会锁定,同时第二次快照会记录下逻辑地址0所对应的物理地址从0改为8。
因为快照仅仅记录逻辑地址和物理地址的对应关系,因此快照的速度非常快。在上面例子中,一个逻辑地址对应2个物理扇区,按照现代硬盘一个扇区4KiB,就算按照ZFS的地址宽度128bit=16Byte算,加上物理地址宽度,做一次快照的写入的数据量可能只有整体数据量的0.5%不到。
而备份,则是另外一份数据副本,例如这样的:
或者这样的:
另外,备份又分全量备份和增量备份,全量备份就是上面的情况了。增量备份则类似快照,但不同的地方在于两次快照之间只记录了两层地址之间的对应关系的差异,而增量备份则把这些差异中,新增地址所对应的底层数据也复制了一份出来。
快照和备份的不同在于:
最后,快照在很多地方都有使用,例如文件系统层面,ZFS、BtrFS、NTFS(MS管快照叫卷影复制,Volume Shadow copy Service,VSS)这些文件系统都提供快照功能;各种虚拟机有快照;很多关系数据库也有快照。
作者:李志松
链接:https://www.zhihu.com/question/20374919/answer/15155664
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
快照与备份是两个不同的概念.
先来看快照.
快照,其本质类似于数据库的照片,也就是在某个特定时间点(创建快照的时间点)给数据库拍个照放在那儿.但是这个照片是一个新的数据库,可以应用SQL语句.
快照数据库里的数据是不变的.创建快照后,系统会对原数据库的所有数据页做个标识,如果数据页在创建快照后被修改,会复制一个数据页出来,没有修改的数据页则不会有快照(原数据库和快照数据库共用该数据页).
从这样来看,快照存在的时间越长,对系统的压力会越大(要维护的变化数据页太多).
一般来说,快照用在数据库的镜像机上,因为镜像机上的数据库永远是Restoring状态,可以在某个特定的时间点生成一个快照,这样就可以在镜像机上提供一个可访问的数据库,用来为数据仓库提供数据源比较合适.
再来看备份.
备份,其本质是一个副本.相当于在某个时间点把数据库里的所有对象内容都COPY一份,放到一个特定的文件里(备份文件,一般是.bak).
这个文件不是一个数据库,不能直接应用SQL,必须先通过还原的方式还原到一个数据库(可以是和原数据库名称一致,也可以是一个新的数据库),之后才能访问里面的数据.
因为备份的结果是文件,这个文件可以被COPY走,或者写入磁带(放到银行里),从而实现离线容灾.
此外,备份是个很复杂的概念,还涉及到数据库的恢复模型、日志处理等很复杂的东西,需要自己先系统学习下备份还原的相关概念。
作者:幽灵代笔
链接:https://www.zhihu.com/question/20374919/answer/168631711
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
快照这个词常用来表达某种事物的确切状态,因为事物是变动的,文件系统中的文件便是如此,文件快照就是文件本身,只是增加了时间副词而已
取个栗子,假设我有一个hello.txt文件需要备份,随着版本的变化,文件内容的变化如下图所示:
在的第一个版本,文件的内容是123,第二个版本内容是123456789,第三个版本内容是123456。当我们说snapshot1(快照1)指的是内容为123的hello.txt文件,说snapshot2(快照2)说的是内容为123456789的hello.txt文件。
在以快照方式备份的系统中(如git),文件一旦发生变化,备份时就会根据内容生成一个快照(其实就是包含某内容的文件)存储到数据库中,文件没有变化则不会生成新的快照,这些快照(文件)和版本号联系在一起,所有可以通过版本号来恢复文件的历史状态。