Ceph 和 KRBD 的丢弃功能

shan

Ceph and KRBD discard

内核 RBD 模块的空间回收机制。拥有这种支持对于运维人员来说至关重要,并能简化您的容量规划。RBD 镜像通常是稀疏的,因此创建后的初始大小为 0 MB。稀疏镜像的主要问题在于镜像最终会增长到其全部大小。问题在于 Ceph 不知道在块之上发生了这种情况,尤其是在您拥有文件系统的情况下。您可以轻松地写入整个文件系统,然后删除所有内容,Ceph 仍然会认为该块已完全使用,并会保留该指标。但是,由于块设备上的丢弃支持,文件系统可以将丢弃刷新命令发送到该块。最终,存储将释放块。

此功能已添加到内核 3.18 中。

让我们创建一个 RBD 镜像

```bash $ rbd create -s 10240 leseb $ rbd info leseb rbd image 'leseb': size 10240 MB in 2560 objects order 22 (4096 kB objects) block_name_prefix: rb.0.1066.74b0dc51 format: 1

$ rbd diff rbd/leseb | awk '{ SUM += $2 } END { print SUM/1024/1024 " MB" }' 0 MB ```

将其映射到主机并在其上放置文件系统

```bash $ sudo rbd -p rbd map leseb /dev/rbd0

$ sudo rbd showmapped id pool image snap device 0 rbd leseb - /dev/rbd0

$ sudo mkfs.xfs /dev/rbd0 log stripe unit (4194304 bytes) is too large (maximum is 256KiB) log stripe unit adjusted to 32KiB meta-data=/dev/rbd0 isize=256 agcount=17, agsize=162816 blks

     =                       sectsz=512   attr=2, projid32bit=0

data = bsize=4096 blocks=2621440, imaxpct=25

     =                       sunit=1024   swidth=1024 blks

naming =version 2 bsize=4096 ascii-ci=0 log =internal log bsize=4096 blocks=2560, version=2

     =                       sectsz=512   sunit=8 blks, lazy-count=1

realtime =none extsz=4096 blocks=0, rtextents=0

$ sudo mount /dev/rbd0 /mnt ```

好的,我们已经准备就绪,现在让我们写入一些数据

```bash $ dd if=/dev/zero of=/mnt/leseb bs=1M count=128 128+0 records in 128+0 records out 134217728 bytes (134 MB) copied, 2.88215 s, 46.6 MB/s

$ df -h /mnt/ Filesystem Size Used Avail Use% Mounted on /dev/rbd0 10G 161M 9.9G 2% /mnt ```

然后我们再次检查镜像的大小

bash $ rbd diff rbd/leseb | awk '{ SUM += $2 } END { print SUM/1024/1024 " MB" }' 142.406 MB

我们现在有 128MB 的数据和约 14,406MB 的文件系统数据/元数据。检查设备上是否正确启用了丢弃功能

bash root@ceph-mon0:~# cat /sys/block/rbd0/queue/discard_* 4194304 4194304 1

现在让我们检查默认行为,当不支持丢弃时,我们删除 128 MB 的文件,从而释放文件系统上的空间。不幸的是,Ceph 没有注意到任何事情,并且仍然认为这 128 MB 的数据仍然存在。

bash $ rm /mnt/leseb $ rbd diff rbd/leseb | awk '{ SUM += $2 } END { print SUM/1024/1024 " MB" }' 142.406 MB

现在让我们运行 fstrim 命令来指示块释放未使用的空间

bash $ fstrim /mnt/ $ rbd diff rbd/leseb | awk '{ SUM += $2 } END { print SUM/1024/1024 " MB" }' 10.6406 MB

瞧!Ceph 释放了我们的 128 MB。

如果您想随时运行丢弃功能并让文件系统持续检查丢弃功能,可以使用 discard 选项挂载文件系统

```bash $ mount -o discard /dev/rbd0 /mnt/

$ mount | grep rbd /dev/rbd0 on /mnt type xfs (rw,discard) ```

请注意,使用 discard 挂载选项可能会严重影响性能。因此,通常您希望通过每日 cron 作业触发 fstrim 命令。