快照实现方法简析

快照功能和实现方法简析

一、什么是快照

  刚入存储这行,一直很好奇,快照是个什么东西,查了很多资料,总算弄明白了。快照,用通俗的话说,就是数据在某个瞬间的一个“影像”。这个数据,可以是文件级别的数据,可以是块级别的。利用快照,可以实现在线备份、搭建临时测试环境等等。创建快照只需要10ms左右。这么短的时间,不会影响系统业务。这是快照比备份最大的优势所在。

二、快照的实现方式

  快照的实现方式主要分为三种:写前复制、写时转向和镜像分离三大类。

  1. 写前复制
    一般都听说过copy-on-write,但是对于写前复制,我是第一次接触到。顾名思义,写前复制需要在真正的写之前,进行一次复制。这种方法也叫做首次写复制。在首次写的过程中,会影响系统的整体性能。在实际应用中,可以使用这种方法,构建多级快照,即对快照做快照,将第一个快照配置成可写快照。那么在快照上做出修改,测试新软件的功能。如果通过,可以前滚。如果失败可以回滚,不用担心影响本机的环境受到影响。很多时候,测试是在虚拟机中测试,也不会影响性能。但是当测试需要与具体的硬件配合时,快照方法更有优势。如何执行呢?假设目前的快照技术是建立在块级别上的,并且快照盘和源盘分属不同的LUN。快照的创建过程如下:
    1. 启动快照。启动快照将创建另一个逻辑卷,这个逻辑卷的大小不一定需要和源卷相等。根据源卷的数据更新频率、快照的保存时间可以分配源卷的5%-110%左右的空间。而本快照上可以读取到的数据就是创建快照的瞬间的数据。
    2. 假设此时上层首次发起一个源卷上A块的更新。快照卷上没有找到对应于A的块,那么先在快照卷上选定一个大小相同的块A1,指向A,再将A块上的数据,复制到A1上,最后再对A进行更新;
    3. 假设此时上层第二次发起对A块的更新。搜索快照卷发现已经有该块的快照,那么直接更新数据即可。这么做保证了数据的一致性;
    4. 假设此时上层需要读取A块的源数据,那么直接读取A块即可;
    5. 假设此时上层需要读取A块对应的快照,那么先搜索快照卷,查看该块是否做过快照,找到对应的A1,那么读取A1中数据;
    6. 假设此时上层需要读取B块对应的快照,那么在快照卷中搜索不到指向B的块,那么说明创建快照那一时刻到此时,B没有被更新,那么直接读取源卷中的B就可以。
    7. 销毁快照或者回滚。释放快照卷占用的空间。回滚先读回快照卷中的数据,再释放快照卷。
  2. 写时转向
    写时转向和写前复制的实现方式可以说是相反的一种实现方式。写前复制,相当于将快照写到新的地盘,但是写时转向是将更新的数据,写到新的地盘。操作过程和写前复制及其类似,不过还是有一点区别。这种方法,不会造成首次更新数据时发生两次IO,效率较高。但是,这种方法如果同时创建了多个快照,管理将较为复杂,特别是删除快照的时候。详述如下:
    1. 启动快照。当前源卷立即转换成快照卷。并创建一个空的源卷,该空的源卷大小也不一定要和之前相等。
    2. 假设此时上层首次发起一个快照卷上A块的更新。源卷上没有找到对应于A的块,那么先在源卷上选定一个大小相同的块A1,指向A,并且将上层指向A的指针指向A1,再直接将新数据更新到A1即可;
    3. 假设此时上层第二次发起对A块的更新。由于指针已经更新到A1,并且,发现A1是一个新的块,那么直接更新A1即可;
    4. 假设此时上层需要读取A块的源数据,由于指针已经更新到A1,直接读取A1即可;
    5. 假设此时上层需要读取A块对应的快照,由于指针已经更新到A1,并发现该块是新块,那么读取A块;
    6. 假设此时上层需要读取B块对应的快照,发现该块是未被更新过,直接读取即可;
    7. 销毁快照或者回滚。销毁过程需要将新的指针重新指回。并将快照卷转回到源卷。
  3. 镜像分离
    这种方法其实严格意义上来说不是快照技术。它的实现方法最简单,也最影响性能。顾名思义,其实镜像分离就是在正常的写操作时候,就将数据写两份,在需要创建快照的时候,其中一份数据就成了快照。这种方法的局限性非常明显:
    1. 时时刻刻影响系统性能。副本数越多,越影响性能;
    2. 若只有两个副本。则不能同时创建两个快照。
  4. CDP连续数据保护
    这种方法是写前复制+时间戳。对每一条更新都执行复制,并附带时间戳。能够保证数据能恢复到任何时刻。但是对于存储资源和系统计算资源的消耗也是很大的。
posted @ 2017-07-16 13:53  自然技术搬运工  阅读(2000)  评论(0编辑  收藏  举报