快照和备份的区别、快照原理(一)——COW技术
快照原理
1、快照和备份的区别
快照和备份是有区别的,在讲他们之前我们首先要知道逻辑错误和物理错误。
逻辑错误:人为通过一些命令或者操作,导致数据丢失或者文件损坏的。如果这时候有备份,没有快照,我们此时的解决办法是通过备份进行还原操作。但是如果我们仅仅只是丢失了一个不重要的文件,这时候通过备份来恢复的话,有点大动干戈,甚至可能还会对业务造成影响。 备份相对于快照来说是一个重量级的操作;如果这时候有快照的话,我们就可以通过快照直接还原,速度快且影响小。
物理错误:硬盘损坏、磁盘坏道、主板损坏等物理介质损坏。物理错误造成的数据丢失等通过快照是没办法恢复的。
所以备份可以解决逻辑错误和物理错误所产生的问题,快照只能解决逻辑错误产生得问题。备份业务比较大,所消耗的时间周期比较长,相对来说是重量级的,快照相对来说是轻量级的,这就是备份和快照的区别。
2、COW和ROW技术
提到快照,我们需要知道快照里边有两种技术:cow 和 row
cow:copy on write.。写时复制。cow技术主要应用在存储LUN、裸设备等存储设备。
row: redirect on write。写时重定向。row技术主要应用在我们的fusioncompute、vmware中。
3、COW技术
cow:写时复制。写的时候,去提前复制。
在说这个之前。我们需要先了解一些别的知识。我们知道我们的内存底层是数据块,一个数据块的默认大小是4K,一个数据块有两部分组成,header和body。heder部分保存的是元数据,元数据就是描述数据的数据,例如数据的位置,id等,举个例子,我们的个人信息表就是我们的元数据,我们本身这个人就是数据。所以header中保存的是元数据,body中保存的是真实数据,header和body是一一指向关系。如下图所示:
知道了数据块之后我们在说文件,文件在系统中也分为两部分,一部分叫inode,一部分叫block。inode: index node。索引node信息,这里边存的也是元数据,block里边存的则是真实数据。他们之间也是指向关系。如下图所示:
知道这个之后,我们再来说cow快照。如下图所示,假设这就是我们的磁盘,左边上边是我们的inode,里边有12345,下边是block,里边也有12345,因为inode和block是指向关系,所以12345之间是指向的,如图左边所示。如果这个时候我们来拍快照,我们拍的是什么的?如图右边所示,这时候我们拍的只是inode,相当于复制了inode,假设这个快照叫snapshot 01,里边同样的也有12345,它和block之间也会有一一指向关系。我们通常拍快照的过程很快,快照很快就拍好了,就是因为拍快照的过程我们只是复制了当前时间点的inode元数据(索引数据),并没有复制真正的数据。
拍完照之后,数据发生改变,数据改变包括删除、更改、新增三种情况:
删除:我们把inode中的数据删掉了,会发生什么情况呢?如下图所示,假设我们删除inode中的5,快照会怎么办呢?当我们删除inode中的数据5时,快照什么都不做,因为snapshot1中的inode和block还是一一对应关系,什么都没有改变,所以快照什么都不用做。
更改: 如果我们把inode中的5改成6呢?如下图所示,它会把原来bolck中的5先复制出来,然后在block中的对应位置写入6,覆盖之前的5(这个过程就是写时复制),最后更改snapshot1中的索引指针指向5。那么把5复制出来是复制到什么地方呢?当我们在拍快照的时候,它会默认生成一个cow区域,每拍一个快照,就会生成一个cow区域,5就是复制到了cow区域中,可以说cow区域就是用来存放快照中的索引所对应的改变的数据的。另外整个snapshot1快照其实也是存在于cow区域中的。最后结果就是如下图所示。那么如果我们继续修改呢?比如把6在改成7,这个时候快照会有变化吗?答案是不会的,cow只关注snapshot中的索引数据,snapshot中有什么,cow才会做什么,所以因为没有6,即使6在怎么修改,快照也不会有任何变化。
新增:如果我们新增了数据应该怎么办呢?假设我们新增了数据7,8,inode中写入7,8,如下图所示。因为inode和block是一一对应关系,所以这时候block中会产生两个空块,然后snapshot1会把这两个空快拷贝到cow区域,然后在往这两个空快中写入7,8。空快的作用是,到时候还原快照时,因为是没有78数据的,所以空块可以直接把block中的78覆盖掉。
这里要注意的是,当我们没有快照时,我们平常所说的删除文件是把索引和底层block中的数据都删了,但是当有快照存在时,我们所说的删除数据只是删除了索引数据,真正底层block中的数据是不会被删除的。
4、COW实验
下面我们进行一个实验来演示COW快照技术
(1)我们创建一个3G的LV,把它挂载在data目录下,这个LV使用了240M的空间。然后我们用 lvcreat -L 32M -s -n snap data /dev/vg0/data为这个data目录创建一个32M大小的快照。我们可以看到,虽然data目录有3个G,且有240M的数据,我们仅用32M小的空间来创建快照也能创建成功。这就是我们前边说的快照只是对索引元数据做了快照,并没有对底层的block数据做快照。
(2)然后我们用lvdisplay /dev/vg0/snap_data命令来查看这个快照lv的情况。我们可以看到COW区域是32M,即我们创建快照时给它的大小,而快照的大小只占COW的0.04%。我们前边说到,每创建一个快照,就会生成一个COW区,而快照本身也是存在于COW区里边,就是这个意思。所以说快照也是cow区的一部分,快照只占很小的一部分。
(3)我们把这个快照lv也挂载到一个目录下边,之后我们再用df -Th命令查看。我们可以看到快照lv挂载的目录snap和我们做快照的data目录大小和使用率都是一模一样的,进去看里边的文件内容也一模一样。
(4)还原快照。假设我们把data目录里边的文件删除了一部分,我们需要通过snap快照来还原。该怎么做呢。这里我们需要使用dump命令,需要提前安装dump相关的包。我们输入命令:dump -0 -f /tmp/snapdata.dump /snap/ 先将快照创建成一个dump文件。
然后我们输入restore -rf /tmp/snapdata.dump命令来还原快照。
5、cow技术总结
cow快照技术写性能不怎么好,因为他要写两次,比如更改数据的时候,先复制一次,在写入一次,这就写了两次,所以cow快照写性能不好。而且快照越多,性能越差,因为快照越多,COW区域就越多,自然而然性能就会变差。
那么ROW技术是怎样的呢?我们下一篇在给大家讲解ROW技术。
#########################################################################################################题外话
FC平台虚拟机中Tools的作用:
没有tools的话,虚拟机连网卡都没有。我们也没办法在界面上看到虚拟机的CPU、内存信息等情况。也没办法做一致性快照,我们可以看到tools的重要性。
tools可以给我们提供驱动、监控等。