如何确定 LVM 快照的最佳大小?

Dmi*_*riD 3 linux backup lvm snapshot

我想创建一个在备份期间使用 LVM 快照的备份脚本。该脚本将在多台 Linux 机器上运行。我想避免创建太小并且在备份期间变满的快照。我只有卷大小、此卷上已用和可用空间的百分比作为输入参数。在此卷的备份期间,我没有平均磁盘 I/O 速度和数据量更改。有没有办法根据这种情况计算卷的最佳快照大小?可用于创建快照的可用空间是有限的。

小智 7

请记住,您可以即时调整快照的大小,例如使用 lvextend。所以你可以给它们一个合理的初始大小,然后在它们变得太满时增加它们。

这甚至可以自动完成:使用 dmeventd 并在 lvm.conf 中进行设置:

    # 'snapshot_autoextend_threshold' and 'snapshot_autoextend_percent' define
    # how to handle automatic snapshot extension. The former defines when the
    # snapshot should be extended: when its space usage exceeds this many
    # percent. The latter defines how much extra space should be allocated for
    # the snapshot, in percent of its current size.
    #
    # For example, if you set snapshot_autoextend_threshold to 70 and
    # snapshot_autoextend_percent to 20, whenever a snapshot exceeds 70% usage,
    # it will be extended by another 20%. For a 1G snapshot, using up 700M will
    # trigger a resize to 1.2G. When the usage exceeds 840M, the snapshot will
    # be extended to 1.44G, and so on.
    #
    # Setting snapshot_autoextend_threshold to 100 disables automatic
    # extensions. The minimum value is 50 (A setting below 50 will be treated
    # as 50).

    snapshot_autoextend_threshold = 50
    snapshot_autoextend_percent = 50
Run Code Online (Sandbox Code Playgroud)

自动扩展不会立即起作用,dmeventd 需要几秒钟的时间才能做出反应……并且 50% 的填充等级和 50% 的增长是非常苛刻的,但是对于使用非常小的快照进行测试(从而快速用数据填充快照),它们需要。

# lvcreate -n TEST_LV -L 1G /dev/base_vg
  Logical volume "TEST_LV" created
# mke2fs -t ext4 /dev/base_vg/TEST_LV
mke2fs 1.42.5 (29-Jul-2012)
[...]
Writing superblocks and filesystem accounting information: done
# mount /dev/base_vg/TEST_LV /mnt
Run Code Online (Sandbox Code Playgroud)

无需以 root 身份写入文件

# cd /mnt
# chown USER .
#

$ for i in 1 2 3 4 5 6 7 8 9 10 11 12 ; do 
    dd if=/dev/urandom bs=1024k count=10 > /mnt/File$i
  done
$

# lvcreate -n TEST_LV-SNAP -s /dev/base_vg/TEST_LV -L 25M
  Rounding up size to full physical extent 28.00 MiB
  Logical volume "TEST_LV-SNAP" created
# lvs /dev/base_vg/TEST_LV-SNAP; \
  while true; do 
      lvs /dev/base_vg/TEST_LV-SNAP | 
          grep -v Origin
      sleep 1
  done | uniq 
Run Code Online (Sandbox Code Playgroud)

在此运行时,启动

$ for i in 1 2 3 4 5 6 7 8 9 10 11 12 ; do
      dd if=/dev/urandom bs=1024k count=10 > /mnt/File$i
      sleep 10
  done
Run Code Online (Sandbox Code Playgroud)

为了让 dmeventd 赶上 --- IIRC 它只每 10 秒检查一次,需要在写作中睡眠。

回到我们的输出:

  LV                        VG      Attr     LSize  Pool Origin           Data%  Move Log Copy%  Convert
  TEST_LV-SNAP base_vg swi-a-s- 28.00m      TEST_LV   0.04                        
  TEST_LV-SNAP base_vg swi-a-s- 28.00m      TEST_LV   0.04                        
  TEST_LV-SNAP base_vg swi-a-s- 28.00m      TEST_LV  35.90                        
  TEST_LV-SNAP base_vg swi-a-s- 28.00m      TEST_LV  36.01                        
  TEST_LV-SNAP base_vg swi-a-s- 28.00m      TEST_LV  71.86                        
  TEST_LV-SNAP base_vg swi-a-s- 44.00m      TEST_LV  45.82                        
  TEST_LV-SNAP base_vg swi-a-s- 44.00m      TEST_LV  68.63                        
  TEST_LV-SNAP base_vg swi-a-s- 68.00m      TEST_LV  44.46                        
  TEST_LV-SNAP base_vg swi-a-s- 68.00m      TEST_LV  59.22                        
  TEST_LV-SNAP base_vg swi-a-s- 104.00m      TEST_LV  38.75                        
  TEST_LV-SNAP base_vg swi-a-s- 104.00m      TEST_LV  48.40                        
  TEST_LV-SNAP base_vg swi-a-s- 104.00m      TEST_LV  48.43                        
  TEST_LV-SNAP base_vg swi-a-s- 156.00m      TEST_LV  38.74                        
  TEST_LV-SNAP base_vg swi-a-s- 156.00m      TEST_LV  45.17                        
  TEST_LV-SNAP base_vg swi-a-s- 156.00m      TEST_LV  45.19                        
  TEST_LV-SNAP base_vg swi-a-s- 156.00m      TEST_LV  51.63                        
  TEST_LV-SNAP base_vg swi-a-s- 156.00m      TEST_LV  51.65                        
  TEST_LV-SNAP base_vg swi-a-s- 236.00m      TEST_LV  34.14                        
  TEST_LV-SNAP base_vg swi-a-s- 236.00m      TEST_LV  38.39                        
  TEST_LV-SNAP base_vg swi-a-s- 236.00m      TEST_LV  38.40                        
  TEST_LV-SNAP base_vg swi-a-s- 236.00m      TEST_LV  42.66                        
  TEST_LV-SNAP base_vg swi-a-s- 236.00m      TEST_LV  42.67                        
  TEST_LV-SNAP base_vg swi-a-s- 236.00m      TEST_LV  46.92                        
  TEST_LV-SNAP base_vg swi-a-s- 236.00m      TEST_LV  46.94                        
  TEST_LV-SNAP base_vg swi-a-s- 236.00m      TEST_LV  51.19                        
  TEST_LV-SNAP base_vg swi-a-s- 236.00m      TEST_LV  51.20                        
  TEST_LV-SNAP base_vg swi-a-s- 356.00m      TEST_LV  33.94                        
Run Code Online (Sandbox Code Playgroud)

看着它成长...