OpenStack 和 Ceph:RBD discard

shan

OpenStack and Ceph: RBD space reclamation

只有魔法牌玩家可能才会认出这张图片 :) (如果你感兴趣)

我等这个功能已经很久了。Discard,也称为 trim(对于 SSD),是一种空间回收机制,允许你回收磁盘上未使用的块。RBD 镜像默认是稀疏的,这意味着它们占用的空间随着你写入数据的增加而增加(与预分配相反)。因此,在文件系统上写入时,你可能会到达设备的末尾。在 Ceph 侧,没有人知道文件系统上发生了什么,所以我们最终得到了完全分配的块……最终,集群认为 RBD 镜像已完全分配。从操作员的角度来看,能够回收运行实例未使用的空间非常方便。

关于 virtio-scsi

Virtio-scsi 是虚拟机的新存储接口。此驱动程序的目的是通过引入新的虚拟机存储功能来取代 virtio-blk,例如

  • 将设备直通到访客,直接暴露物理存储设备
  • 更好的性能和对真正的 SCSI 设备的支持
  • 通用且标准的设备命名与物理世界相同,从而更容易虚拟化物理应用程序
  • 更好的存储可扩展性,虚拟机可以附加更多设备(更多 LUN 等...)

现在可以将此新的控制器添加到虚拟机,并将块设备附加到该控制器。

OpenStack 支持是在 Icehouse 中添加的,包含以下两个提交

OpenStack 配置

要启用 virtio-scsi 块驱动程序和 discard 支持,我们需要配置 Glance 和 Nova

  • Glance:通过镜像属性,这些属性将被 Nova 检测到,并将应用适当的配置
  • Nova:要启用 discard 支持

将 virtio-scsi 添加到 Glance 镜像

bash $ glance image-update --property hw_scsi_model=virtio-scsi --property hw_disk_bus=scsi

选项说明

  • hw_scsi_model=virtio-scsi:添加 virtio-scsi 控制器
  • hw_disk_bus=scsi:将每个块连接到该控制器

现在,使用以下内容编辑你的计算节点上的 nova.conf libvirt 部分

[libvirt]
...
hw_disk_discard = unmap
...

注意:hw_disk_discard 的有效参数是

  • unmap:它取消映射对齐的扇区组
  • ignore:它忽略 discard 请求

开始吧,超级明星!

以下假设你正在使用 Ceph 作为虚拟机的根磁盘。这可以通过在 libvirt 部分中使用 images_type=rbd 标志来实现。

现在启动一个实例

bash $ nova boot foo ...

检查组成镜像的对象数量

```bash $ sudo rbd -p vms ls e75328d3-1d76-45bb-84d5-b581d7113783_disk

$ sudo rbd info vms/e75328d3-1d76-45bb-84d5-b581d7113783_disk rbd image 'e75328d3-1d76-45bb-84d5-b581d7113783_disk'

    size 20480 MB in 2560 objects
    order 23 (8192 kB objects)
    block_name_prefix: rbd_data.11e86f017fe7
    format: 2
    features: layering
    parent: images/53bd9dbe-23db-412b-81d5-9743aabdfeb5@snap
    overlap: 2252 MB

$ sudo rados -p vms ls |grep rbd_data.11e86f017fe7 | wc -l 315 ```

因此,克隆由 315 个 4M 的对象组成。让我们写入一些虚拟数据

bash $ dd if=/dev/zero of=leseb bs=1M count=200 oflag=direct 200+0 records in 200+0 records out 209715200 bytes (210 MB) copied, 0.650631 s, 322 MB/s

我们再次验证对象数量

bash $ sudo rados -p vms ls |grep rbd_data.11e86f017fe7 | wc -l 333

它从 315 跳到 333。现在我们删除虚拟文件

bash $ rm -f leseb

现在让魔法发生,再次计数

```bash $ sudo fstrim -v / /: 268439552 bytes were trimmed

$ sudo rados -p vms ls |grep rbd_data.11e86f017fe7 | wc -l 320 ```

我无法真正解释为什么我们从 333 降到 320 而不是 315,可能是文件系统元数据。

重要提示:discard 支持尚未在 Cinder 中实现,因此,如果你附加 Cinder 块设备,它将被附加到 virtio-scsi 控制器,但不会获得 discard 选项。这个问题已被提出,但尚未解决。我将看看我们这边能做些什么,因为我真的希望在 Kilo 中拥有这个功能。此外,在查看代码后,似乎可以通过简单地从 Nova 配置继承来获得与 Nova 相同的附件属性。已提交上游补丁