Ceph 的 rbd 容量统计
Ceph 的 rbd 一直有个问题就是无法清楚的知道这个分配的空间里面到底使用了多少,使用 rbd info
命令查询出来的容量是预分配的总容量而非实际使用容量。在 Jewel 版中提供了一个新的接口去查询,对于老版本来说可能同样有这个需求,本篇将详细介绍如何解决这个问题。
目前已知的有三种查询方法:
- 使用
rbd du
查询(Jewel 版才支持) - 使用
rbd diff
- 根据对象统计的方法进行统计
方法一:使用 rbd du 查询
此命令在 Jewel 版中可用。
1 | root@mon:~# rbd du rbd/mysql-img |
不过需要注意,执行此命令要求开启 rbd image 的如下属性:
1 | layering, exclusive-lock, object-map, fast-diff |
具体使用可参考 这篇文章 。
方法二:使用 rbd diff
1 | root@mon:~# rbd diff rbd/mysql-img | awk '{ SUM += $2 } END { print SUM/1024/1024 " MB" }' |
方法三:根据对象统计的方法进行统计
在集群非常大的时候,再按上面的方法一个个查询,需要花很长的时间,并且需要时不时的跟集群进行交互。方法三是把统计数据一次获取下来,然后进行数据的统计分析,从而获取结果,获取的粒度是以存储池为基准的。
拿到所有对象的信息:
1 | for obj in `rados -p rbd ls`;do rados -p rbd stat $obj >> obj.txt;done |
这个获取的时间长短是根据对象的多少来的,如果担心出问题,可以换个终端查看进度:
1 | tail -f obj.txt |
获取 RBD 的镜像列表:
1 | rbd -p rbd ls |
获取 RBD 的镜像的 prefix :
1 | root@mon:~# for a in `rbd -p rbd ls`;do echo $a ;rbd -p rbd info $a|grep prefix |awk '{print $2}' ;done |
获取指定RBD镜像的大小:
1 | root@mon:~# cat obj.txt |grep rb.0.f4652.2ae8944a |awk '{ SUM += $6 } END { print SUM/1024/1024 " MB" }' |
将上面的汇总,使用脚本一次查询出指定存储池中所有镜像的大小:
1 | #!/bin/bash |
执行的效果如下:
1 | root@mon:~# ./get_used.sh rbd |
注意这里只统计了 image 里面的真实容量,如果是用了链接 clone 的,存在容量复用的问题,需要自己看是否需要统计那一部分的对象,方法同上。