
一些关于巨大的过度配置 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
|