OpenStack 和 Ceph:RBD discard

只有魔法牌玩家可能才会认出这张图片 :) (如果你感兴趣)
我等这个功能已经很久了。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 相同的附件属性。已提交上游补丁。