本篇內容來自 zphj1987 —— 如何統計 Ceph 的 RBD 真實使用容量
Ceph 的 rbd 一直有個問題就是無法清楚的知道這個分配的空間里面到底使用了多少,使用 rbd info
命令查詢出來的容量是預分配的總容量而非實際使用容量。在 Jewel 版中提供了一個新的接口去查詢,對於老版本來說可能同樣有這個需求,本篇將詳細介紹如何解決這個問題。
目前已知的有三種查詢方法:
- 使用
rbd du
查詢(Jewel 版才支持) - 使用
rbd diff
- 根據對象統計的方法進行統計
方法一:使用 rbd du 查詢
此命令在 Jewel 版中可用。
root@mon:~# rbd du rbd/mysql-img NAME PROVISIONED USED test 52.8047M 0
不過需要注意,執行此命令要求開啟 rbd image 的如下屬性:
layering, exclusive-lock, object-map, fast-diff
具體使用可參考 這篇文章 。
方法二:使用 rbd diff
root@mon:~# rbd diff rbd/mysql-img | awk '{ SUM += $2 } END { print SUM/1024/1024 " MB" }' 52.8047 MB
方法三:根據對象統計的方法進行統計
在集群非常大的時候,再按上面的方法一個個查詢,需要花很長的時間,並且需要時不時的跟集群進行交互。方法三是把統計數據一次獲取下來,然后進行數據的統計分析,從而獲取結果,獲取的粒度是以存儲池為基准的。
拿到所有對象的信息:
for obj in `rados -p rbd ls`;do rados -p rbd stat $obj >> obj.txt;done
這個獲取的時間長短是根據對象的多少來的,如果擔心出問題,可以換個終端查看進度:
tail -f obj.txt
獲取 RBD 的鏡像列表:
rbd -p rbd ls img2 mysql-img volume-e5376906-7a95-48bb-a1c6-bb694b4f4813.backup.base
獲取 RBD 的鏡像的 prefix :
root@mon:~# for a in `rbd -p rbd ls`;do echo $a ;rbd -p rbd info $a|grep prefix |awk '{print $2}' ;done img2 rb.0.f4730.2ae8944a mysql-img rb.0.f4652.2ae8944a volume-e5376906-7a95-48bb-a1c6-bb694b4f4813.backup.base rbd_data.23a53c28fb938f
獲取指定RBD鏡像的大小:
root@mon:~# cat obj.txt |grep rb.0.f4652.2ae8944a |awk '{ SUM += $6 } END { print SUM/1024/1024 " MB" }' 52.8047 MB
將上面的匯總,使用腳本一次查詢出指定存儲池中所有鏡像的大小:
#!/bin/bash # USAGE:./get_used.sh <poolname> objfile=obj.txt Poolname=${1} echo "In the pool ${Poolname}": for obj in `rados -p $Poolname ls` do rados -p $Poolname stat $obj >> $objfile done for image in `rbd -p $Poolname ls` do Imagename=$image Prefix=`rbd -p $Poolname info $image|grep prefix |awk '{print $2}'` Used=`cat $objfile |grep $Prefix|awk '{ SUM += $6 } END { print SUM/1024/1024 " MB" }'` echo $Imagename $Prefix echo Used: $Used done
執行的效果如下:
root@mon:~# ./get_used.sh rbd In the pool rbd: img2 rb.0.f4730.2ae8944a Used: 3076 MB mysql-img rb.0.f4652.2ae8944a Used: 158.414 MB volume-e5376906-7a95-48bb-a1c6-bb694b4f4813.backup.base rbd_data.23a53c28fb938f Used: 96 MB
注意這里只統計了 image 里面的真實容量,如果是用了鏈接 clone 的,存在容量復用的問題,需要自己看是否需要統計那一部分的對象,方法同上。