天天看點

删除rbd的資料後ceph空間沒有釋放删除ceph挂載卷中的資料後ceph空間沒有釋放

删除ceph挂載卷中的資料後ceph空間沒有釋放

删除rbd的資料後ceph空間沒有釋放删除ceph挂載卷中的資料後ceph空間沒有釋放

​ 有一個叢集的ceph的存儲空間被k8s的pod占滿了,客戶也不願意擴容。現在就隻能看可不可以删除一些不用的檔案來釋放一些存儲空間,發現mysql占用的資料比較大,然後清理快40G的binlog,在容器中通過

df -h

檢視已經是減少的了。但

ceph df

檢視的使用率并沒有變化,就很懵比~。由此引發了一些思考

檔案系統是怎麼删除檔案的呢?

删除檔案的過程:

以/var/log/messages這個檔案為例,删除messages這個檔案的過程大緻如下:

  1. 找到/var/log/messages所在的inode
  2. 删除/var/log目錄上有關messages的條目
  3. 空索引中/var/log/messages對應的inode資料(注意,不是删除inode,而是清空這個inode的資料),将此inode對應的位圖改為空閑(如從1改為0)。事實上可以不清除資料,隻将位圖由1改為0,這樣下次使用時會自動覆寫。
  4. 将/var/log/messages所占用的磁盤塊重新标記為空閑。其實删除檔案并不會對磁盤塊做任何操作(清除資料),隻會将相應的磁盤塊的位圖改為空閑,下次使用時僅僅隻是覆寫現有磁盤塊上的資料。如果沒有在這些磁盤塊上寫入新檔案,其資料仍然可以被找回來;但是一旦寫入了新檔案,就很難再找回原來的資料了。這就是為什麼删除檔案的過程相較其他操作要快得多。
删除rbd的資料後ceph空間沒有釋放删除ceph挂載卷中的資料後ceph空間沒有釋放

​ 由此可知,檔案系統隻是将檔案頭作一個已删除的标記,表明檔案被删除了,即沒有真正删除檔案,隻是辨別删除。雖然檔案系統知道這些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

是否有變化

[[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

繼續閱讀