转自:http://blog.csdn.net/wytdahu/article/details/48288681

问题描述

  在OpenStack云环境的部署中,存储通常具备Thin provision的功能,这项功能实现了存储按需分配的能力。现在有这样一种场景,用户在文件系统中创建了大文件,使用完之后进行了删除。但实际上,该文件在存储系统上占用的空间并没有释放。

当用户在文件系统中删除一个文件,并不会在块设备上的对应空间填0,而仅仅在磁盘的元数据结构中将这些block标记为未使用。因此,虽然文件系统知道这些block是未使用或者说可用的,但是底层的存储系统并不知道文件系统做的操作,会认为这些block仍在使用。以RBD image为例,它本身是稀疏格式的,也就是说它所占用objects会随着用户写入数据的增加而增加(Thin provision)。当用户删除数据以后,这些obejct不再使用,但并没有被释放。因为从Ceph的角度讲,它并不知道文件系统中发生的事情。

解决办法

比较理想的解决办法就是,提供一种空间回收机制,文件系统可以通知块设备释放掉不再使用的block。Linux的Trim/Discard机制正是这样一种机制。从Ceph 0.46,Ceph的块设备开始支持Trim/Discard操作。这意味着,从Guest虚拟机中可以发出Trim请求,Ceph块设备就可以释放掉不再使用的空间。

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

触发Trim/Discard请求

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

一、文件系统自动完成

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

二、用户执行命令

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

  需要注意的是,mount的discard参数会导致文件系统性能下降,在并发删除大量小文件时变得很慢,因此需要根据具体场景选择合适的长发方式。

版本要求

  Qemu: 1.5

  Libvirt: 1.0.6

  Ceph: 0.46

  Linux kernel: 3.1

OpenStack中该功能的通用实现

  在虚拟机平台中,IDE或者SCSI磁盘支持Trim,VirtIO不支持Trim操作。OpenStack在Icehouse中引入下面两个commit,支持了virtio-scsi,也就是说可以使用Trim/Discard。

https://review.openstack.org/#/c/70262/

https://review.openstack.org/#/c/70263/

需要配置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>

在AWcloud云平台使用该功能

1、创建云硬盘

2、挂载云硬盘总线类型选择scsi

3、虚拟机里将挂载的磁盘创建分区并挂载

4、删除大文件后执行fstrim -v mountpoint

或者

挂载时使用-o discard参数,那么删除文件时会自动触发Discard/Trim操作,不需要执行fstrim命令。

实验验证

1、创建一个RBD image

2、将创建好的RBD image以scsi的方式挂载到虚拟机中,分区创建文件系统

3、统计该RBD image占用的object数量

[root@node-4 gc]# rados -p volumes ls |grep 3232ae8944a | wc -l

135

4、在虚拟机的文件系统中创建文件

ddif=/dev/zero of=image bs=1M count=10000

5、统计该RBD image占用的object数量

[root@node-4 gc]# rados -p volumes ls |grep 3232ae8944a | wc -l

382

注:(382-135)*4M ~ 1G,和创建的文件大小相符

6、虚拟机中删除创建的文件,并执行fstrim命令

rm -rf image;fstrim –v mountpoint

7、统计该RBD image占用的object数量

[root@node-4 gc]# rados -p volumes ls |grep 3232ae8944a | wc -l

196

注:(382-196)*4M ~ 800M, 绝大部分空间得到回收

参考:

  http://www.sebastien-han.fr/blog/2015/02/02/openstack-and-ceph-rbd-discard/

  http://ceph.com/docs/master/rbd/qemu-rbd/#enabling-discard-trim

  http://cephnotes.ksperis.com/blog/2014/12/18/use-discard-with-krbd-client-since-kernel-3-dot-18/

OpenStack+Ceph存储空间回收《转》的更多相关文章

  1. 理解 OpenStack + Ceph (5):OpenStack 与 Ceph 之间的集成 [OpenStack Integration with Ceph]

    理解 OpenStack + Ceph 系列文章: (1)安装和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和逻辑结构 (4)Ceph 的基础数据结构 (5)Ceph 与 OpenS ...

  2. 理解 OpenStack + Ceph (2):Ceph 的物理和逻辑结构 [Ceph Architecture]

    本系列文章会深入研究 Ceph 以及 Ceph 和 OpenStack 的集成: (1)安装和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和逻辑结构 (4)Ceph 的基础数据结构 ...

  3. 理解 OpenStack + Ceph (4):Ceph 的基础数据结构 [Pool, Image, Snapshot, Clone]

    本系列文章会深入研究 Ceph 以及 Ceph 和 OpenStack 的集成: (1)安装和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和逻辑结构 (4)Ceph 的基础数据结构 ...

  4. 理解 OpenStack + Ceph (9): Ceph 的size/min_size/choose/chooseleaf/scrubbing/repair 等概念

    本系列文章会深入研究 Ceph 以及 Ceph 和 OpenStack 的集成: (1)安装和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和逻辑结构 (4)Ceph 的基础数据结构 ...

  5. 理解 OpenStack + Ceph (8): 基本的 Ceph 性能测试工具和方法

    本系列文章会深入研究 Ceph 以及 Ceph 和 OpenStack 的集成: (1)安装和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和逻辑结构 (4)Ceph 的基础数据结构 ...

  6. 理解 OpenStack + Ceph (7): Ceph 的基本操作和常见故障排除方法

    本系列文章会深入研究 Ceph 以及 Ceph 和 OpenStack 的集成: (1)安装和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和逻辑结构 (4)Ceph 的基础数据结构 ...

  7. 理解 OpenStack + Ceph (3):Ceph RBD 接口和工具 [Ceph RBD API and Tools]

    本系列文章会深入研究 Ceph 以及 Ceph 和 OpenStack 的集成: (1)安装和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和逻辑结构 (4)Ceph 的基础数据结构 ...

  8. 理解 OpenStack + Ceph (1):Ceph + OpenStack 集群部署和配置

    本系列文章会深入研究 Ceph 以及 Ceph 和 OpenStack 的集成: (1)安装和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和逻辑结构 (4)Ceph 的基础数据结构 ...

  9. OpenStack,ceph

    · Hypervisor或Container项目 · 基础设施即服务(IaaS) · 平台即服务 (PaaS) · 配置管理工具 · 储存服务 (Storage) 在虚拟层类别中,KVM收获了48%的 ...

随机推荐

  1. guess-number-higher-or-lower

    // Forward declaration of guess API. // @param num, your guess // @return -1 if my number is lower, ...

  2. iOS开发--整理常用的第三方资源

    一:第三方插件 1:基于响应式编程思想的oc 地址:https://github.com/ReactiveCocoa/ReactiveCocoa 2:hud提示框 地址:https://github. ...

  3. Binary Tree Inorder Traversal leetcode java

    题目: Given a binary tree, return the inorder traversal of its nodes' values. For example: Given binar ...

  4. B - Sort the Array

    找出一个递减序列,假设有两个或两个以上递减序列直接no了,然后对递减序列两端数start.end,然后比較a[start]和a[end+1] . a[end] 和a[start-1] #include ...

  5. Discuz常见大问题-如何允许用户插入视频-如何自己在页面中插入视频

    从视频的下面分享中获取html代码 然后粘贴到你创建页面的指定位置(注意从优酷复制的视频宽度和高度可能比较小,你可以自己调整,或者占据100%) 最终的实现效果

  6. ArcGIS Pro体验02——启动、创建工程

    所有的猜测都是眼睛看到的,自己想到的,可能不一定正确哈. 任务界面十分简洁,左上是创建新工程,右上是账户名称,左上是关于. 可以直接创建一个工程,Blank应该是无类型,最后保存再选择:Global ...

  7. 几种流行Webservice框架性能对比(转载)

    1摘要 开发webservice应用程序中离不开框架的支持,当open-open网站列举的就有很多种,这对于开发者如何选择带来一定的疑惑.性能Webservice的关键要素,不同的框架性能上存在较大差 ...

  8. 如何用代码组织多个Storyboard(故事板)

    1. 新建一个Storyboard取名为OtherStoryboard.storyboard 2. 使用下面代码加载 UIStoryboard *newStoryboard = [UIStoryboa ...

  9. mac 终端 使用 gnu coreutils 工具 ls 颜色显示

    mac 终端默认 ls 命令无颜色显示: 1: 使用 ls -G 可以显示基本颜色 2:使用 gnu coreutils 工具 mac 终端 使用 gnu coreutils 工具 ls 颜色显示 以 ...

  10. Windows下安装配置SBT

    1:安装包下载界面 http://www.scala-sbt.org/download.html 下载后进行安装. 安装路径:D:\Java\sbt\conf 2:进行配置 (1)sbtconfig. ...