比你的 Ceph 集群更大的 RBD 镜像

shan

一些关于巨大的过度配置 RBD 镜像的实验。

首先,创建一个大型镜像,比如 1 PB

1
2
3
4
5
6
7
$ rbd create --size 1073741824 huge
$ rbd info huge
rbd image 'huge':
    size 1024 TB in 268435456 objects
    order 22 (4096 kB objects)
    block_name_prefix: rb.0.8a14.2ae8944a
    format: 1

当你尝试删除镜像时,问题就会出现。最终尝试删除它

1
2
3
4
5
6
$ time rbd rm huge
Removing image: 100% complete...done.

real    1944m40.850s
user    475m37.192s
sys     475m51.184s

保留每个现有对象的记录效率极低,这将导致我们的性能下降。使用此技术的的主要缺点是在缩小或删除镜像时,它必须查找所有大于缩小大小的对象。

在 dumpling 或更高版本的 RBD 中,可以通过 --rbd-concurrent-management-ops(未记录的选项,默认为 10)并行执行此操作。

你仍然有另一种选择,如果你从未向镜像写入过数据,你可以直接删除 rbd_header 文件。你可以通过列出镜像中包含的所有对象来找到它。例如,rados -p <你的池> ls | grep <块名称前缀> 就可以完成此操作。之后,删除 RBD 镜像只需一秒钟。

1
2
3
4
5
6
7
8
9
10
11
12
$rados -p rbd ls
huge.rbd
rbd_directory

$ rados -p rbd rm huge.rbd
$ time rbd rm huge
2013-12-10 09:35:44.168695 7f9c4a87d780 -1 librbd::ImageCtx: error finding header: (2) No such file or directory
Removing image: 100% complete...done.

real    0m0.024s
user    0m0.008s
sys     0m0.008s