删除ceph挂載卷中的資料後ceph空間沒有釋放
有一個叢集的ceph的存儲空間被k8s的pod占滿了,客戶也不願意擴容。現在就隻能看可不可以删除一些不用的檔案來釋放一些存儲空間,發現mysql占用的資料比較大,然後清理快40G的binlog,在容器中通過
df -h
檢視已經是減少的了。但
ceph df
檢視的使用率并沒有變化,就很懵比~。由此引發了一些思考
檔案系統是怎麼删除檔案的呢?
删除檔案的過程:
以/var/log/messages這個檔案為例,删除messages這個檔案的過程大緻如下:
- 找到/var/log/messages所在的inode
- 删除/var/log目錄上有關messages的條目
- 空索引中/var/log/messages對應的inode資料(注意,不是删除inode,而是清空這個inode的資料),将此inode對應的位圖改為空閑(如從1改為0)。事實上可以不清除資料,隻将位圖由1改為0,這樣下次使用時會自動覆寫。
- 将/var/log/messages所占用的磁盤塊重新标記為空閑。其實删除檔案并不會對磁盤塊做任何操作(清除資料),隻會将相應的磁盤塊的位圖改為空閑,下次使用時僅僅隻是覆寫現有磁盤塊上的資料。如果沒有在這些磁盤塊上寫入新檔案,其資料仍然可以被找回來;但是一旦寫入了新檔案,就很難再找回原來的資料了。這就是為什麼删除檔案的過程相較其他操作要快得多。
由此可知,檔案系統隻是将檔案頭作一個已删除的标記,表明檔案被删除了,即沒有真正删除檔案,隻是辨別删除。雖然檔案系統知道這些block是未使用或者說可用的,但是底層的存儲系統并不知道檔案系統做的操作,會認為這些block仍在使用。
以這裡mysql pod挂在的卷為例,它本身是稀疏格式的,也就是說它所占用objects會随着使用者寫入資料的增加而增加(Thin provision)。當使用者删除資料以後,這些obejct不再使用,但并沒有被釋放。因為從Ceph的角度講,它并不知道檔案系統中發生的事情。
解決方法
SSD 具有一種稱為 TRIM 的功能。從本質上講,這是一種用于回收裝置上未使用的塊的方法,該塊可能先前已被寫入,但不再包含有效資料,是以可以傳回到通用存儲池以供重用。
Linux系統中都有一個指令
fstrim
,就是作TRIM操作,可以用于普通SSD與NVMe
有兩種方式可以觸發Trim/Discard請求,一種是由檔案系統自動完成,一種是使用者通過執行指令來完成。
一、檔案系統自動完成
隻要在挂載檔案系統時指定discard參數即可,比如 mount -t ext4 -o discard device mountpoint,這樣在檔案系統中删除檔案後會自動觸發Trim/Discard操作,在塊裝置上釋放占用的空間。需要注意的是,mount的discard參數會導緻檔案系統性能下降,在并發删除大量小檔案時變得很慢,是以需要根據具體場景選擇合适的長發方式。
二、使用者執行指令
使用者可以執行指令fstrim來觸發Trim/Discard操作,采用這種方式mount檔案系統時不需要discard參數。比如,fstrim -v mountpoint,就會釋放對應塊裝置上不用的空間。
測試:
檢視存儲池
[[email protected] ~]# rados lspools
.rgw.root
images
volumestest
vms
k8s
建立一個卷并挂載到機器上
[[email protected] ~]# rbd create k8s/test --size 30G #建立塊裝置
[[email protected] ~]# rbd info k8s/test
rbd image 'test':
size 30GiB in 7680 objects
order 22 (4MiB objects)
block_name_prefix: rbd_data.6cc18c6b8b4567
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
flags:
create_timestamp: Fri May 14 10:49:55 2021
[[email protected] ~]# rbd feature disable k8s/test exclusive-lock object-map fast-diff deep-flatten
[[email protected] ~]# rbd map k8s/test # 映射塊裝置
/dev/rbd13
[[email protected] ~]# mkdir /root/zjjshen # 建立挂載目錄
[[email protected] ~]# mkfs.ext4 /dev/rbd13 # 格式化塊裝置
mke2fs 1.42.9 (28-Dec-2013)
Discarding device blocks: done
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=1024 blocks, Stripe width=1024 blocks
1966080 inodes, 7864320 blocks
393216 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2155872256
240 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information:
[[email protected] ~]# mount /dev/rbd13 /root/zjjshen/ # 挂載
[[email protected] ~]# df -h | grep zjjshen
/dev/rbd13 30G 45M 28G 1% /root/zjjshen
[[email protected] ~]# rbd du tstack_k8s/test
NAME PROVISIONED USED
test 30GiB 240MiB
快速生成大檔案
# 生成10G的file檔案
[[email protected] ~]# cd /root/zjjshen
[[email protected] zjjshen]# dd if=/dev/zero of=file bs=1M count=10000
10000+0 records in
10000+0 records out
10485760000 bytes (10 GB) copied, 3.39941 s, 3.1 GB/s
[[email protected] zjjshen]# du -sh file
9.8G file
[[email protected] zjjshen]# df -h | grep zjjshen
/dev/rbd13 30G 9.9G 19G 36% /root/zjjshen
[[email protected] zjjshen]# rbd du k8s/test
warning: fast-diff map is not enabled for test. operation may be slow.
NAME PROVISIONED USED
test 30GiB 10GiB
删除生成的檔案,看 rbd du
是否有變化
rbd du
[[email protected] zjjshen]# rm -rf file
[[email protected] zjjshen]# df -h | grep zjjshen
/dev/rbd13 30G 45M 28G 1% /root/zjjshen
[[email protected] zjjshen]# rbd du k8s/test
warning: fast-diff map is not enabled for test. operation may be slow.
NAME PROVISIONED USED
test 30GiB 10GiB
可以看出,删除後ceph這邊存儲使用量是沒有變化的
執行fstrim
[[email protected] zjjshen]# fstrim -v /root/zjjshen
/root/zjjshen: 10 GiB (10716344320 bytes) trimmed
[[email protected] zjjshen]# rbd du k8s/test
warning: fast-diff map is not enabled for test. operation may be slow.
NAME PROVISIONED USED
test 30GiB 240MiB
可以看出ceph檢視的使用量已經減少了
相關參考:
https://cloud.tencent.com/developer/article/1644774
https://bbs.huaweicloud.com/blogs/188604