cinder删除lvm卷很慢的问题

cinder删除lvm卷很慢的问题

最近搞kolla部署cinder,使用lvm做后端,在cinder-volume服务删除数据卷,数据卷会删除的很慢,在删除这段时间发现宿主机的load飙高,但是检查虚拟机负载没有异常。

查找原因

使用iotop查看

1
DEBUG oslo_concurrency.processutils [req-beeeb583-c07e-4f23-8b63-1f76fc729c9a 0a266a36e53e4469a376f5baa4375064 0a266a36e53e4469a376f5baa4375064 - default default] CMD "sudo cinder-rootwrap /etc/cinder/rootwrap.conf dd count=0 if=/dev/zero of=/dev/mapper/cinder--volumes-volume--beeeb583--c07e--4f23--8b63--1f76fc729c9a  oflag=direct" returned: 0 in 0.127s execute /usr/lib/python2.7/site-packages/oslo_concurrency/processutils.py:374

从日志里面看到,volume服务调用dd命令对数据卷进行数据清空,同时采用oflag=direct参数直接操作块设备。所以,cinder在删除卷的时间长短和卷的大小有着直接关系。(删除期间iowait值会增高,怪不得load也会飙高)

原因分析

cinder在删除卷之前要对其做dd操作,是因为LVMlvremove后重新lvcreate,新的lv里面还保留着老的数据,原来直接删除的lv并不会抹除卷上的数据。cinder之所以要用dd zero,就是为了避免租户A删除卷后,数据不会串到租户B新创建的数据卷上。这样一方面保证租户A的数据安全性,另一方面也避免租户B在使用数据卷的产生的疑惑。

处理问题

  • 关闭volume安全删除

    1
    2
    # Allowed values: none, zero, shred
    volume_clear = none

    volume_clear采用shred永久删除,

  • 置零volume头部100MB左右数据

    1
    2
    # Size in MiB to wipe at start of old volumes. 0 => all (integer value)
    volume_clear_size = 100
  • 调整dd进程io调度优先策略

    1
    2
    3
    4
    # The flag to pass to ionice to alter the i/o priority of the process used to
    # zero a volume after deletion, for example "-c3" for idle only priority.
    # (string value)
    volume_clear_ionice = -c3

    保证数据绝对安全

    volume_clear采用shred永久删除,根据服务器情况适当调整volume_clear_ionice的值。
    shred会用一些随机内容覆盖文件所在的节点和数据块,cinder在这里条用shred默认参数采用-n 3即重写3次。

    数据相对安全的同时,降低数据卷删除时间

    volume_clear采用zero填充,根据情况设置volume_clear_size大小,我们都知道,磁盘的开头部分保存着文件系统的元数据以及索引,清空这部分可以一定程度上保证数据的安全。

至于volume_clear=none这种直接删除lv而不清空数据的方式,我就不建议采用了


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!