文档章节

LVM snapshot简述

g
 gongsiai
发布于 2017/04/05 11:58
字数 2226
阅读 6
收藏 1

 

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。我们假定创建一个120M的snapshot,这就意味着在snapshot生命周期里,你仅能有120M的数据量改变。

下面的命令,为/dev/vg/lvdata创建/dev/vg/lvdata-sp


# lvcreate -L20M -s -n lvdata-sp /dev/vg/lvdata

Logical volume "lvdata-sp" created


其中lvdata大小为120MB。


# 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

本文转载自:http://blog.chinaunix.net/uid-20615025-id-29722.html

g

gongsiai

粉丝 1
博文 27
码字总数 10914
作品 0
大兴
程序员
私信 提问
Snapshot Volume 操作 - 每天5分钟玩转 OpenStack(58)

Snapshot 可以为 volume 创建快照,快照中保存了 volume 当前的状态,以后可以通过 snapshot 回溯。snapshot 操作实现比较简单,流程图如下: 向 cinder-api 发送 snapshot 请求 cinder-api...

CloudMAN
2016/07/11
167
0
Manjaro食用指南(1):安装 Manjaro Linux

前言 为什么用Manjaro? “Professional and user-friendly Linux at its best.” Manjaro Linux是基于Arch的发行版本,相较于Arch 他自身的软件仓库比较stable,整个系统比较稳定。 享受Arc...

书书曾
2018/09/03
0
0
lvm 逻辑卷的快照及备份 还原

LVM的快照概述 LVM机制还提供了对LV做快照的功能,以此来获得文件系统的状态一致性备份。LVM采用写时复制技术(Copy-On-Write,COW),不用停止服务或将逻辑卷设为只读就可以进行备份,使用L...

浮生θ谨记
2012/08/02
6.1K
3
LVM的创建与快照和SSM存储管理器的使用

LVM:Logical Volume Manager(逻辑卷管理) 概念(名词):PV:Physical Volume(物理卷)VG:Volume Group(卷组)LV:Logical Volume(逻辑卷) 最小存储单位为:PE总结: 名称 最小存储单...

信自己belive
2017/12/10
0
0
虚拟机linux下扩充硬盘的方法

扩大硬盘的方法有二: 1 新增一个虚拟硬盘 2 扩大原有硬盘 第一: 新增硬盘并将其格式化为lvm格式 第二: 扩大硬盘并利用分区工具,将扩大的部分添加到原有的分区中,再将该分区转为lvm格式 ...

Start-up
2012/05/28
2K
0

没有更多内容

加载失败,请刷新页面

加载更多

可见性有序性,Happens-before来搞定

写在前面 上一篇文章并发 Bug 之源有三,请睁大眼睛看清它们 谈到了可见性/原子性/有序性三个问题,这些问题通常违背我们的直觉和思考模式,也就导致了很多并发 Bug 为了解决 CPU,内存,IO ...

tan日拱一兵
35分钟前
3
0
网络七层模型与TCP/UDP

为了使全球范围内不同的计算机厂家能够相互之间能够比较协调的进行通信,这个时候就有必要建立一种全球范围内的通用协议,以规范各个厂家之间的通信接口,这就是网络七层模型的由来。本文首先...

爱宝贝丶
38分钟前
4
0
Jenkins World 贡献者峰会及专家答疑展位

本文首发于:Jenkins 中文社区 原文链接 作者:Marky Jackson 译者:shunw Jenkins World 贡献者峰会及专家答疑展位 本文为 Jenkins World 贡献者峰会活动期间的记录 Jenkins 15周岁啦!Jen...

Jenkins中文社区
56分钟前
10
0
杂谈:面向微服务的体系结构评审中需要问的三个问题

面向微服务的体系结构如今风靡全球。这是因为更快的部署节奏和更低的成本是面向微服务的体系结构的基本承诺。 然而,对于大多数试水的公司来说,开发活动更多的是将现有的单块应用程序转换为...

liululee
今天
8
0
OSChina 周二乱弹 —— 我等饭呢,你是不是来错食堂了?

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @ 自行车丢了:给主编推荐首歌 《クリスマスの夜》- 岡村孝子 手机党少年们想听歌,请使劲儿戳(这里) @烽火燎原 :国庆快来,我需要长假! ...

小小编辑
今天
1K
13

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部