Logical Volume Manager (LVM)提供了对任意一个Logical Volume(LV)做“快照”(snapshot)的功能,以此来获得一个分区的状态一致性备份。
    在某一个状态下做备份的时候,可能有应用正在访问某一个文件或者数据库,这就是使得备份的时候文件处于一个状态,而备份完后,文件却处于另外一个状态,从而造成备份的非一致性,这种状态恢复数据库数据几乎不会成功。

    状态的解决办法是将其分区挂载为只读,然后通过数据库的表级别锁定(table-level write locks)甚至停止数据库来备份数据。所有这些方法无意严重影响了服务的可用性。使用LVM snapshot既可以获得一致性备份,又不会影响服务器的可用性。

    要提醒一点是,snapshot这种方法仅对LVM有效,对于非LVM文件系统无效。

    LVM中snapshot的“写时复制”(copy on write) 的实现方法。快照不是用来备份的

    当 一个snapshot创建的时候,仅拷贝原始卷里数据的元数据(meta-data)。创建的时候,并不会有数据的物理拷贝,因此snapshot的创建 几乎是实时的,当原始卷上有写操作执行时,snapshot跟踪原始卷块的改变,这个时候原始卷上将要改变的数据在改变之前被拷贝到snapshot预留 的空间里,因此这个原理的实现叫做写时复制(copy-on-write)。

    在写操作写入块之前,CoW讲原始数据移动到 snapshot空间里,这样就保证了所有的数据在snapshot创建时保持一致。而对于snapshot的读操作,如果是读取数据块是没有修改过的, 那么会将读操作直接重定向到原始卷上,如果是要读取已经修改过的块,那么就读取拷贝到snapshot中的块。


    1. 创建快照 (EXT4)
      [root@server0 ~]# lvcreate -L 128M -s -n lv2-snap /dev/vg1/lv2
      [root@server0 ~]# lvs
      LV VG Attr LSize Pool Origin Data% Move Log Cpy%Sync Convert
      lv1 vg1 -wi-ao—— 768.00m
      lv2 vg1 owi-aos—- 512.00m
      lv2-snap vg1 swi-aos—- 128.00m lv2 5.92
      [root@server0 ~]# mount -o ro /dev/vg1/lv2-snap /mnt/lv2-snap/ 不希望破坏快照卷中的数据
      [root@server0 ~]# df -Th
      Filesystem Type Size Used Avail Use% Mounted on
      /dev/mapper/vg1-lv2 ext4 488M 32M 429M 7% /mnt/lv2
      /dev/mapper/vg1-lv2—snap ext4 488M 32M 429M 7% /mnt/lv2-snap
      [root@server0 ~]# lvscan
      ACTIVE ‘/dev/vg1/lv1’ [768.00 MiB] inherit
      ACTIVE Original ‘/dev/vg1/lv2’ [512.00 MiB] inherit
      ACTIVE Snapshot ‘/dev/vg1/lv2-snap’ [128.00 MiB] inherit
      [root@server0 ~]# ls /mnt/lv2
      etc lost+found
      [root@server0 ~]# ls /mnt/lv2-snap/
      etc lost+found
      2. 修改原卷的数据

      3. 观察Snapshot
      [root@server0 ~]# lvs
      LV VG Attr LSize Pool Origin Data% Move Log Cpy%Sync Convert
      lv1 vg1 -wi-ao—— 768.00m
      lv2 vg1 owi-aos—- 512.00m
      lv2-snap vg1 swi-aos—- 128.00m lv2 30.56

    1. **  XFS:**<br />   **[root@server0 ~]# mount -o nouuid,ro /dev/vg1/lv1-snap /mnt/lv1-snap/s**<br />   挂载快照,尽量使用ro(只读)的方式,将不会破坏快照卷中的数据<br />   [root@server0 ~]# dmsetup ls --tree<br />   vg1-lv2--snap (252:5)<br />   ├─vg1-lv2--snap-cow (252:7)<br />    └─ (253:17)<br />   └─vg1-lv2-real (252:6)<br />   ├─ (253:17)<br />   └─ (253:18)<br />   vg1-lv2 (252:1)<br />   └─vg1-lv2-real (252:6)<br />   ├─ (253:17)<br />   └─ (253:18)<br />   快照自动增长:<br />   [root@server0 ~]# vim /etc/lvm/lvm.conf<br />   snapshot_autoextend_threshold = 70<br />   snapshot_autoextend_percent = 20<br />   [root@server0 ~]# systemctl restart lvm2-monitor.service<br />   [root@server0 ~]# systemctl enable lvm2-lvmetad.service<br />   **注:快照卷 原卷 使用同一VG空间**<br />**

    应用场景

    数据一致性: 备份和恢复数据不一致

    保证数据的一致性

    MySQL数据放在LVM中

    1. mysql stop 优点:保证数据的一致性 缺点:业务的不可用性
    2. LV snapshot 优点:数据的一致性,业务的持续性
      1. 全局读锁
      2. LVM snapshot
      3. 释放锁
      4. mount -o snapshot
      5. 从snapshot卷中复制数据
      6. 卸载snapshot
      7. lvremove snapshot