版权声明:
本文遵循“署名非商业性使用相同方式共享 2.5 中国大陆”协议
您可以自由复制、发行、展览、表演、放映、广播或通过信息网络传播本作品
您可以根据本作品演义自己的作品
您必须按照作者或者许可人指定的方式对作品进行署名。
您不得将本作品用于商业目的。
如果您改变、转换本作品或者以本作品为基础进行创作,您只能采用与本协议相同的许
可协议发布基于本作品的演绎作品。
对任何再使用或者发行,您都必须向他人清楚地展示本作品使用的许可协议条款。
如果得到著作权人的许可,您可以不受任何这些条件的限制。
                                                                                                                  asram
     随着计算机技术日新月异的发展,人们对于数据的重视性也越来越大。数据保护的方法也取得的重大突破。目前较为流行的就是snapshot。SNIA(存储网络行业协会)对快照(Snapshot)的定义是:关于指定数据集合的一个完全可用拷贝,该拷贝包括相应数据在某个时间点(拷贝开始的时间点)的映像。快照可以是其所表示的数据的一个副本,也可以是数据的一个复制品。
     目前snapshot技术分为:
  • 镜像分离(split mirror)
        镜像分离,是为了让镜像卷保持拆分一瞬间的状态,而不再继续被写入数据。而拆分之后,主卷所做的所有写IO动作,会以bitmap的方式记录下来。bitmap就是一份位图文件,文件中每个位都表示卷上的一个块(扇区,或者由多个扇区组成的逻辑块),如果这个块在镜像分离之后,被写入了数据,则程序就将bitmap文件中对应的位从0变成1。待备份完成之后,可以将镜像关系恢复,此时主卷和镜像卷上的数据是不一致的,需要重新做同步。程序搜索bitmap中所有为1的位,对应到卷上的块,然后将这些块上的数据,同步到镜像卷,从而恢复实时镜像关系。
  • 改变块(changed block)
        快照创建成功后,源和快照共享同一份物理数据拷贝,直到数据发生写操作,此时源上老数据或者新增数据将被写向新的存储空间。为了记录和追踪块的变化和复制信息,需要一个位图(bitmap),它用于确定实际拷贝数据的位置,以及确定从源还是目标来获取数据。
  • 并发(concurrent)
       它与改变块非常相似,但它总是物理地拷贝数据。当即时拷贝执行时,没有数据被复制。取而代之,它创建一个位图来记录数据的复制情况,并在后台进行真正的数据物理复制。
      由改变块和并发发展而来的写时复制(copy-on-write,COW)和写重定向(Redirect-on-write,ROW)目前还是比较主流的。
写时复制(copy-on-write,COW)
      写时复制快照在快照时间点之后,没有物理数据复制发生,仅仅复制了原始数据物理位置的元数据。因此,快照创建非常快,可以瞬间完成。然后,快照副本跟踪原始卷的数据变化(即原始卷写操作),一旦原始卷数据块发生写操作,则先将原始卷数据块读出并写入快照卷,然后用新数据块覆盖原始卷。这样我们访问快照卷上的数据仍旧是写操作前的,可以保证我们备份数据的一致性。
原理图:
p_w_picpath
写重定向(Redirect-on-write,ROW)
      对于原始数据卷的首次写操作将被重定向到预留的快照空间。该快照维持的是指向所有源数据的指针和拷贝数据。当数据被重写时,将会给更新过的数据选择一个新的位置,同时指向该数据的指针也被重新映射,指向更新后的数据。如果拷贝是只读的,那么指向该数据的指针就根本不会被修改。重定向写操作提升了快照I/O 性能,只需一次写操作,直接将新数据写入快照卷,同时更新位图映射指针;而写时拷贝需要一次读和两次写操作,即将原始卷数据块读入并写入快照卷,然后将更新数据写入原始卷。不难发现,快照卷保存的是原始副本,而原始卷保存的则是快照副本。这导致删除快照前需要将快照卷中的数据同步至原始卷,而且当创建多个快照后,原始数据的访问、快照卷和原始卷数据的追踪以及快照的删除将变得异常复杂。此外,快照副本依赖与原始副本,原始副本数据集很快变得分散。
原理图:
p_w_picpath
LVM snapshot   
     我们最常用的就是基于卷管理的快照—LVM snapshot。要提醒一点是,以下内容是针对安装了LVM的系统。写时复制在文件系统和磁盘I/O之间增加了一层COW层。变成了下面这个样子:
file I/0 —> filesystem — >COW –> block I /O
     采取COW实现方式时,snapshot的大小并不需要和原始卷一样大,其大小仅仅只需要考虑两个方面:从shapshot创建到释放这段时间内,估计块的改变量有多大;数据更新的频率。一旦 snapshot的空间记录满了原始卷块变换的信息,那么这个snapshot立刻被释放,就无法使用,从而导致这个snapshot无效。所以,一定要在snapshot的生命周期里,做完你需要做得事情。
大致操作:
1.创建一个快照卷
   以/dev/ops/databases为源来创建一个名为dbbackup的快照。
# lvcreate -L592M -s -n dbbackup /dev/ops/databases
lvcreate -- WARNING: the snapshot must be disabled if it gets full
lvcreate -- INFO: using default snapshot chunk size of 64 KB for "/dev/ops/dbbackup"
 lvcreate -- doing automatic backup of "ops"
lvcreate -- logical volume "/dev/ops/dbbackup" successfully created
这样databases的快照就建立完毕了。将其挂在到目录上就可以查看里面的内容了。
2.挂在快照
# mkdir /mnt/ops/dbbackup
# mount /dev/ops/dbbackup /mnt/ops/dbbackup
mount: block device /dev/ops/dbbackup is write-protected, mounting read-only
3.备份
A.如果只是备份资料的话建议先将源卷以只读的形式挂在然后再创建快照并备份
#mount -o remount,ro /dev/ops/databases
# lvcreate -L592M -s -n dbbackup /dev/ops/databases
#dd if=/dev/ops/dbbackup of=/mnt/ops/dbbackup/
#mount -o remount,rw /dev/ops/databases
# umount /mnt/ops/dbbackup
# lvremove /dev/ops/dbbackup
lvremove -- do you really want to remove "/dev/ops/dbbackup"? [y/n]: y
lvremove -- doing automatic backup of volume group "ops"
lvremove -- logical volume "/dev/ops/dbbackup" successfully removed
B.如果是数据库的话需要先锁住表在创建快照并备份。以mysql为例:
#mysql –uroot –pmysql
mysql> flush tables with read lock;
mysql>flush logs;
mysql>system lvcreate -L592M -s -n dbbackup /dev/ops/databases
mysql>show master status;
mysql>unlock tables;
mysql>quit
开始备份。
4.删除快照
备份结束后删除快照
# umount /mnt/ops/dbbackup
# lvremove /dev/ops/dbbackup
 
本人知识有限,难免疏漏,请指正。
参考文献:
2.What is a Logical Volume Manager (LVM) snapshot and how do I use it? http://kbase.redhat.com/faq/docs/DOC-1455
3.16.2 高级数据保护方法 http://book.51cto.com/art/200812/×××0.htm
4.Back Up (And Restore) LVM Partitions With LVM Snapshots http://www.howtoforge.com/linux_lvm_snapshots