Logical Volume Manager (LVM)提供了对任意一个Logical Volume(LV)做“快照”(snapshot)的功能,以此来获得一个分区的状态一致性备份。
在某一个状态下做备份的时候,可能有应用正在访问某一个文件或者数据库,这就是使得备份的时候文件处于一个状态,而备份完后,文件却处于另外一个状态,从而造成备份的非一致性,这种状态恢复数据库数据几乎不会成功。
状态的解决办法是将其分区挂载为只读,然后通过数据库的表级别锁定(table-level write locks)甚至停止数据库来备份数据。所有这些方法无意严重影响了服务的可用性。使用LVM snapshot既可以获得一致性备份,又不会影响服务器的可用性。
要提醒一点是,snapshot这种方法仅对LVM有效,对于非LVM文件系统无效。
snapshot的实现有多种方式(参考文章最后的连接),这里说说LVM中snapshot的“写时复制”(copy on write) 的实现方法。
当一个snapshot创建的时候,仅拷贝原始卷里数据的元数据(meta- data)。创建的时候,并不会有数据的物理拷贝,因此snapshot的创建几乎是实时的,当原始卷上有写操作执行时,snapshot跟踪原始卷块的改变,这个时候原始卷上将要改变的数据在改变之前被拷贝到snapshot预留的空间里,因此这个原理的实现叫做写时复制(copy-on- write)。
在写操作写入块之前,CoW将原始数据移动到snapshot空间里,这样就保证了所有的数据在snapshot创建时保持一致。而对于snapshot的读操作,如果是读取数据块是没有修改过的,那么会将读操作直接重定向到原始卷上,如果是要读取已经修改过的块,那么就读取拷贝到snapshot中的块。
这样,通常的文件I/0流程有一个改变,那就是在文件系统和设备驱动之间增加了一个cow层,变成了下面这个样子:
file I/0 —> filesystem — >CoW –> block I /O
下面的图也许可以比较容易了解CoW的原理:
采取CoW实现方式时,snapshot的大小并不需要和原始卷一样大,其大小仅仅只需要考虑两个方面:从shapshot创建到释放这段时间内,估计块的改变量有多大;数据更新的频率。一旦 snapshot的空间记录满了原始卷块变换的信息,那么这个snapshot立刻被释放,从而无法使用,从而导致这个snapshot无效。所以,非常重要的一点,一定要在snapshot的生命周期里,做完你需要做得事情。当然,如果你的snapshot大小和原始卷一样大,甚至还要大,那它的寿命就是“与天齐寿”了。
snapshot其实除了备份以外,还有很多其他用途:
1)虚拟化
在使用 LVM2 时,快照可以不是只读的。这意味着,在创建快照之后, 可以像常规块设备一样挂载和读写快照。
因为流行的虚拟化系统(比如 Xen、VMWare、Qemu 和 KVM)可以将块设备用作 guest 映像,所以可以创建这些映像的完整拷贝,并根据需要使用它们,它们就像是内存占用量很低的虚拟机。这样做的好处是部署迅速(创建快照的时间常常不超过几秒)和节省空间(guest 共享原映像的大多数数据)。
设置的步骤如下:
1. 为原映像创建一个逻辑卷。
2. 使用这个 LV 作为磁盘映像安装 guest 虚拟机。
3. 暂停这个虚拟机。内存映像可以是一个常规文件,所有其他快照都放在里面。
4. 为原 LV 创建一个可读写的快照。
5. 使用快照卷作为磁盘映像生成一个新的虚拟机。如果需要的话,要修改网络/控制台设置。
6. 登录已经创建的虚拟机,修改网络设置/主机名。
完成这些步骤之后, 就可以让用户访问刚创建的虚拟机了。如果需要另一个虚拟机,那么只需重复步骤 4 到 6(所以不需要重新安装虚拟机)。还可以用一个脚本自动执行这些步骤。
在使用完虚拟机之后, 可以停止虚拟机并销毁快照。
2)数据回溯
在一个生产系统上要执行一些操作,需要慎之又慎,即便在模拟环境中做过很多次测试都没有问题,但是并不能保证在生产环境就一定成功,于是这个时候,我们把系统做一个snapshot,这样一旦新操作出现问题,立刻回溯到创建 snapshot的时间点,当然你也可以认为这是一个备份的扩展使用。
最后,我们举一些例子,加深对snapshot的理解。
a) 创建一个20M的snapshot,执行一些操作看看CoW的动作。
我们举一个例子来说明如何创建和使用snapshot。我们假定创建一个20M的snapshot,这就意味着在snapshot生命周期里,你仅能有20M的数据量改变。
下面的命令,为/dev/vg/lvdata创建/dev/vg/lvdata-sp
# lvcreate -L20M -s -n lvdata-sp /dev/vg/lvdata
Logical volume “lvdata-sp” created
其中lvdata大小为20MB。
# lvdisplay /dev/vg/lvdata-sp
— Logical volume —
LV Name /dev/vg/lvdata-sp
VG Name vg
LV UUID Yl0fQU-Ve9T-lfmp-xJPq-Uwrd-RVVM-lDDVz0
LV Write Access read/write
LV snapshot status active destination for /dev/vg/lvdata
LV Status available
# open 1
LV Size 200.00 MB
Current LE 50
COW-table size 20.00 MB
COW-table LE 5
Allocated to snapshot 0.27%
Snapshot chunk size 8.00 KB
Segments 1
Allocation inherit
Read ahead sectors 0
Block device 253:0
上面的 Allocated to snapshot 0.27%是我们关心的,表示目前还有99.73%的空间没有使用。
我们尝试在lvdata创建一个10M的文件,再看看这个参数值。
# mount /dev/vg/lvdata /media/lvdata/
# dd if=/dev/hda of=/media/lvdata/10M bs=1M count=10
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.272393 seconds, 38.5 MB/s
# lvdisplay /dev/vg/lvdata-sp
— Logical volume —
LV Name /dev/vg/lvdata-sp
VG Name vg
LV UUID Yl0fQU-Ve9T-lfmp-xJPq-Uwrd-RVVM-lDDVz0
LV Write Access read/write
LV snapshot status active destination for /dev/vg/lvdata
LV Status available
# open 0
LV Size 200.00 MB
Current LE 50
COW-table size 20.00 MB
COW-table LE 5
Allocated to snapshot 51.02%
Snapshot chunk size 8.00 KB
Segments 1
Allocation inherit
Read ahead sectors 0
Block device 253:0
”Allocated to snapshot 51.02%“,符合我们的预期。此时snapshot还剩下大概10M不到的空间了,如果我么再在lvdata上创建一个12M的文件,会发生什么呢?
#dd if=/dev/hda of=/media/lvdata/12M bs=1M count=12
12+0 records in
12+0 records out
12582912 bytes (13 MB) copied, 0.288311 seconds, 43.6 MB/s
device-mapper: snapshots: Invalidating snapshot: Unable to allocate exception.
创建文件的过程中,一个报错出现了,snapshot已经无效。我们看看snapshot卷的详细信息。
# lvdisplay /dev/vg/lvdata-sp
/dev/vg/lvdata-sp: read failed after 0 of 4096 at 0: 输入/输出错误
— Logical volume —
LV Name /dev/vg/lvdata-sp
VG Name vg
LV UUID Yl0fQU-Ve9T-lfmp-xJPq-Uwrd-RVVM-lDDVz0
LV Write Access read/write
LV snapshot status INACTIVE destination for /dev/vg/lvdata
LV Status available
# open 0
LV Size 200.00 MB
Current LE 50
COW-table size 20.00 MB
COW-table LE 5
Snapshot chunk size 8.00 KB
Segments 1
Allocation inherit
Read ahead sectors 0
整个snapshot卷已经出现I/0错误了,而且snapshot的状态也是“INACTIVE”。
是否能挂载上来呢?
# mount /dev/vg/lvdata-sp /media/snapshot/
mount: you must specify the filesystem type
#dmesg
Buffer I/O error on device dm-0, logical block 0
Buffer I/O error on device dm-0, logical block 1
Buffer I/O error on device dm-0, logical block 2
Buffer I/O error on device dm-0, logical block 3
Buffer I/O error on device dm-0, logical block 4
Buffer I/O error on device dm-0, logical block 5
Buffer I/O error on device dm-0, logical block 6
Buffer I/O error on device dm-0, logical block 7
Buffer I/O error on device dm-0, logical block 8
Buffer I/O error on device dm-0, logical block 9
hfs: unable to find HFS+ superblock
从dmesg的错误信息来看,超级块的信息也丢失了
尝试激活一下lvdata-sp
# lvchange -ay /dev/vg/lvdata-sp
/dev/vg/lvdata-sp: read failed after 0 of 4096 at 0: 输入/输出错误
恩,这个snapshot已经被释放了,所以剩下要做得事情就是删除它。
# lvremove /dev/vg/lvdata-sp
/dev/vg/lvdata-sp: read failed after 0 of 4096 at 0: 输入/输出错误
Do you really want to remove active logical volume “lvdata-sp”? [y/n]: y
Logical volume “lvdata-sp” successfully removed
b)利用snapshot在线备份MySQL数据库(或者其他数据库)
流程是先做一个flush操作,并锁定表,然后创建snapshot,然后解锁,然后备份数据,最后释放snapshot。这样,MySQL几乎不会中断其运行。
FLUSH TABLES WITH READ LOCK;
! lvcreate –size 100m –snapshot –name snap /dev/VolGroup01/LogVol00
UNLOCK TABLES;
接着做一些备份的工作
mkdir /snap
mount /dev/VolGroup01/snap /snap
# This is where you back up whatever you need from /snap, e.g. rsync(1)
umount /snap
lvremove /dev/VolGroup01/snap
rmdir /snap
FROM: http://club.topsage.com/thread-530633-1-1.html
分享到:
相关推荐
LVM snapshot 优化 文档 论文
本文给大家详细的说明了使用LVM快照的方式来为Mysql制作备份的方法和步骤,有需要的小伙伴可以参考下
KMV的MATLAB的代码lvmsnapshot.sh 用于自动创建和挂载LVM快照的shellscript。 有关详细信息,请参见此。 用法 ~# lvmsnapshot -h lvmsnapshot version 0.3 LVM VG: /dev/vmstore MOUNT PATH: /mnt/lvmsnapshot/...
Amanda LVM快照插件该插件为Amanda转储中的LVM快照提供支持。 它通过与Amanda交互。安装抱歉,还没有Makefile。 只需将amlvm-snapshot.pl脚本复制到Amanda的应用程序目录中即可。 例如: install -m 755 -o root -g ...
Linux上LVM快照数据一致性迁移.pdf
linux下使用PE创建LVM快照.docx
LVM之快照及PV迁移详细操作,,...................
Mysql物理备份以及逻辑备份,还有LVM备份案例,还有相关的备份例子。
使用lvm快照将日记的MongoDB目录树备份到Swift 使用lvm快照备份MySQL 从特定日期自动将数据还原到文件系统 存储量低,因为备份是作为流上传的 灵活的备份策略(增量和差异) 数据以GNU Tar格式归档,用于基于...
linux系统下lvm及逻辑卷的快照功能.doc
快照建立的关键命令是lvcreate加上-s的参数。而且如果要更新快照内容只需将其卸载并删除卷再从新建立即可,感兴趣的你可以参考下本文,或许可以帮助到你
本文详细介绍了LVM用法,以及LVM的制作,扩容,缩容,快照等常规操作记录,希望能帮助到有用到的朋友!
教程名称:LVM动态磁盘逻辑卷讲解视频(11集)课程目录:【】1、LVM逻辑卷应用场景【】2、LVM逻辑卷扩展概念【】3、LVM逻辑卷快照概念【】4、LVM逻辑卷pv介绍【】5、LVM逻辑卷vg介绍【】6、LVM逻辑卷vg创建【】7、LVM...
对于传统的分区类型,其尺寸是固定的,不能够动态扩展。因此在使用之前,管理员需要提前规划分区的用途和需要的尺寸。一旦某个分区的尺寸不能满足需求了,管理...4,LVM快照 5,LVM条带化 6,LVM在双机(RHCS)中的使用
lvmsync, 只发送快照更改,通过网络同步 LVM LVs lvmsync你是否曾经想在块设备上进行部分同步,可以能是通过网络进行的,但由于rsync没有工作。只要你为你的块设备使用 LVM,你也可以以有更高效的增量转换。:它有...
2、利用LVM快照+二进制日志实现备份 3、使用Xtrabackup备份 一:实验环境介绍: 系统介绍:CentOS6.4_X64 数据库版本:mysql-5.5.33 二:基于Mysqldump命令实现备份恢复 2.1、思路概念 Mysqldump是一个逻辑备份命令...
Snapmount Snapmount是用于创建和安装备份快照的工具。 作为备份策略的一部分,我为文件系统创建了短暂的LVM快照并将其挂载到临时位置。 备份程序将在这些文件上运行,从而确保在备份过程中不会对其进行修改。 完成...
AIX LVM管理介绍 AIX LVM管理介绍 AIX LVM管理介绍 AIX LVM管理介绍
zimbra-lvm-备份 在专用 LVM 逻辑卷上备份 Zimbra 的脚本。 这个脚本已经从 Zimbra 社区上讨论的旧脚本得到改进,能够将计划备份作为 cronjob 运行,进行增量备份以通过 rsync 每天进行完整备份,备份后自动发送...