存储空间回收机制原理及操作指导

问题描述

在云平台部署环境中,底层的云存储通常配置Thin provision精简卷配置的功能,功能实现了存储按需分配的能力。

当前存在一种场景,用户在文件系统中创建了1TB的大文件,使用完之后进行了删除。但实际上,该文件在存储系统上占用的1TB数据空间并没有释放导致云存储空间显示仍然占用1TB,此类情况对云存储空间效率有一定影响

为何会出现这种情况?

  1. 存储系统默认将底层存储资源虚拟化为4M的Object块,按照存储策略(副本/纠删码等)组合为存储池,并从中划分虚拟卷设备,并通过RBD/iSCSI等方式映射给客户端使用;
  2. 客户端接到此虚拟卷设备后,系统将识别为一个存储设备,并将其进行格式化文件系统来进行文件拷贝或软件部署等读写操作,此类操作位于文件系统层面,对于云存储并未发生任何交互,因此客户端对文件系统的普通删除,未告知存储系统来回收响应的数据空间;
  3. 当用户在文件系统中删除一个文件,并不会在块设备上的对应空间填0,而仅仅在磁盘的元数据结构中将这些block标记为未使用或可覆盖写

因此,虽然文件系统知道这些block是未使用或者说可用的,但是底层的存储系统并不知道文件系统做的操作,会认为这些block仍在使用。

Ceph RBD image为例,它本身是稀疏格式的,也就是说它所占用objects会随着用户写入数据的增加而增加(Thin provision)。当用户删除数据以后,这些obejct不再使用,但并没有被释放。

因为从Ceph的角度讲,它并不知道文件系统中发生的事情。

解决办法

比较稳妥的解决方案就是提供一种空间回收机制,文件系统可以主动通知存储系统的块设备释放掉不再使用的block块空间

Linux的Trim/Discard机制正是这样一种机制。从Ceph 0.46,Ceph的块设备开始支持Trim/Discard操作。这意味着,从客户虚拟机中可以发出Trim请求,Ceph块设备就可以释放掉不再使用的空间。商用存储系统默认均支持Trim操作

  需要注意的是,当前只有主流的文件系统,比如Ext4、XFS、Btrfs,支持Trim/Discard操作。

触发Trim/Discard请求

  有两种方式可以触发Trim/Discard请求,一种是由文件系统自动完成,一种是用户通过执行命令来完成。

1、文件系统自动完成

只要在挂载文件系统时指定discard参数即可,比如 mount -t ext4 -o discard  device mountpoint,这样在文件系统中删除文件后会自动触发Trim/Discard操作,在块设备上释放占用的空间。

2、用户执行命令

用户可以执行命令fstrim来触发Trim/Discard操作,采用这种方式mount文件系统时不需要discard参数。比如,fstrim -v mountpoint,就会释放对应块设备上不用的空间。

需要注意的是,mount的discard参数会导致文件系统性能下降,在并发删除大量小文件时变得很慢,而手动执行fsrim命令回收机制时对存储设备也会产生比较大的回收带宽,因此需要根据具体业务场景选择合适的回收方式。

操作指导

在虚拟机平台中,IDE或者SCSI磁盘支持Trim,VirtIO不支持Trim操作。

OpenStack在Icehouse中引入下面两个commit,支持了virtio-scsi,也就是说可以使用Trim/Discard。

需要配置Nova和Glance支持virtio-scsi和discard。

1、glance image-update --property hw_scsi_model=virtio-scsi --property hw_disk_bus=scsi

其中,hw_scsi_model=virtio-scsi 是指libvirt要使用virtio-scsi控制器,hs_disk_bus=scsi是指libvirt使用scsi总线连接磁盘到控制器。

2、编辑nova.conf

[libvirt]

hw_disk_discard = unmap

其中,有效的hw_disk_discard参数包括:

unmap: it unmaps aligned group of sectors

ignore: it ignores the discard request

上述操作其实就是确保磁盘挂载到虚拟机中使用了scsi,最终的libvirt xml描述文件如下:

 <disk type='network' device='disk' >

<driver name='qemu' type='raw'cache='none' discard='unmap'/>

<auth username='compute'>

<secret type='ceph'uuid='a5d0dd94-57c4-ae55-ffe0-7e3732a24455'/>

</auth>

<source protocol='rbd'name='volumes/vdisk1'>

<host name='192.168.1.2'port='6789'/>

</source>

<target dev='sdb' bus='scsi'/>

</disk>

客户端操作释放脏数据

挂载存储块设备添加discard参数

mount -t ext4 -o discard  device mountpoint

或者

删除指定数据后对待回收目录执行

fstrim -v mountpoint

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值