Ceph 存儲的那點事兒 — Trim/Discard
作者:ProdanLabs
出處:https://www.modb.pro/db/137720
在 Linux 中, Ceph rados 塊設備映像( RBD image ) 通過內核中的 rbd 模塊和 rbd 存儲驅動向 Linux 內核註冊自身並向內核提供文件操作的類,使快設備也像文件一樣使用。
當我們在操作系統中刪除一個文件時,並不會在塊設備上擦除,而是把文件在元數據結構中佔用的 LBA 地址標記爲未使用。
Ceph RBD
Ceph RBD image 是稀疏格式 (sparse file),在 Ceph 存儲的數據都會被切分成 object,使用的 Block 隨着用戶寫入數據的增加而增加。當用戶刪除文件後,這些 obejct 對應的 Block 不再使用,但也沒有被釋放。對於 Ceph 來說它並不知道文件系統做的操作,會認爲 Block 仍在使用。
驗證
// 創建 rbd image
# rbd create volume01 --size 100G -p rbd
// 映射的塊設備
# rbd map --image rbd/volume01
/dev/rbd0
// 格式化
# mkfs.ext4 /dev/rbd0
// 不加參數掛載文件系統
# mount /dev/rbd0 /mnt/data
寫入測試數據之前的 osd 空間(6.3G)
# ceph osd df
ID CLASS WEIGHT REWEIGHT SIZE RAW USE DATA OMAP META AVAIL %USE VAR PGS STATUS
2 hdd 0.04880 1.00000 50 GiB 2.1 GiB 1.1 GiB 1.8 MiB 1022 MiB 48 GiB 4.20 1.00 33 up
1 hdd 0.04880 1.00000 50 GiB 2.1 GiB 1.1 GiB 1.7 MiB 1022 MiB 48 GiB 4.20 1.00 33 up
0 hdd 0.04880 1.00000 50 GiB 2.1 GiB 1.1 GiB 1.8 MiB 1022 MiB 48 GiB 4.20 1.00 33 up
TOTAL 150 GiB 6.3 GiB 3.3 GiB 5.3 MiB 3.0 GiB 144 GiB 4.20
寫入 5G 測試數據
# cd /mnt/data/
# dd if=/dev/zero of=test bs=10M count=512
512+0 records in
512+0 records out
5368709120 bytes (5.4 GB, 5.0 GiB) copied, 120.843 s, 44.4 MB/s
# du -sh /mnt/data/*
16K /mnt/data/lost+found
5.1G /mnt/data/test
寫入測試數據之後的 osd 空間(21G)
REWEIGHT SIZE RAW USE DATA OMAP META AVAIL %USE VAR PGS STATUS
2 hdd 0.04880 1.00000 50 GiB 7.1 GiB 6.1 GiB 1.8 MiB 1022 MiB 43 GiB 14.20 1.00 33 up
1 hdd 0.04880 1.00000 50 GiB 7.1 GiB 6.1 GiB 1.7 MiB 1022 MiB 43 GiB 14.20 1.00 33 up
0 hdd 0.04880 1.00000 50 GiB 7.1 GiB 6.1 GiB 1.8 MiB 1022 MiB 43 GiB 14.20 1.00 33 up
TOTAL 150 GiB 21 GiB 18 GiB 5.3 MiB 3.0 GiB 129 GiB 14.20
MIN/MAX VAR: 1.00/1.00 STDDEV: 0
刪除測試數據後,osd 空間仍然是 21G
# rm -f test
# du -sh /mnt/data/*
16K /mnt/data/lost+found
# ceph osd df
ID CLASS WEIGHT REWEIGHT SIZE RAW USE DATA OMAP META AVAIL %USE VAR PGS STATUS
2 hdd 0.04880 1.00000 50 GiB 7.1 GiB 6.1 GiB 1.8 MiB 1022 MiB 43 GiB 14.20 1.00 33 up
1 hdd 0.04880 1.00000 50 GiB 7.1 GiB 6.1 GiB 1.7 MiB 1022 MiB 43 GiB 14.20 1.00 33 up
0 hdd 0.04880 1.00000 50 GiB 7.1 GiB 6.1 GiB 1.8 MiB 1022 MiB 43 GiB 14.20 1.00 33 up
TOTAL 150 GiB 21 GiB 18 GiB 5.3 MiB 3.0 GiB 129 GiB 14.20
MIN/MAX VAR: 1.00/1.00 STDDEV: 0
Linux 提供了一種 Trim/Discard 回收機制,文件系統可以通知塊設備釋放掉未使用的 Block 。
Trim
fstrim 用於回收(Trim)一個已掛載的文件系統上所有未使用的 Block , 發送此指令給 Block controller , 以告訴它哪些數據對應的 LBA 地址是無效的,然後進行 GC 。
# fstrim -v /mnt/data
/mnt/data: 5.2 GiB (5628641280 bytes) trimmed
osd 空間變成了 6.3G
# ceph osd df
ID CLASS WEIGHT REWEIGHT SIZE RAW USE DATA OMAP META AVAIL %USE VAR PGS STATUS
2 hdd 0.04880 1.00000 50 GiB 2.1 GiB 1.1 GiB 1.8 MiB 1022 MiB 48 GiB 4.20 1.00 33 up
1 hdd 0.04880 1.00000 50 GiB 2.1 GiB 1.1 GiB 1.7 MiB 1022 MiB 48 GiB 4.20 1.00 33 up
0 hdd 0.04880 1.00000 50 GiB 2.1 GiB 1.1 GiB 1.8 MiB 1022 MiB 48 GiB 4.20 1.00 33 up
TOTAL 150 GiB 6.3 GiB 3.3 GiB 5.3 MiB 3.0 GiB 144 GiB 4.20
MIN/MAX VAR: 1.00/1.00 STDDEV: 0
Discard
discard 是 mount 命令的參數,在掛載文件系統時指定 discard 參數後,文件系統中刪除文件後會自動觸發 Trim/Discard 操作,通知塊設備釋放掉未使用的 Block 。
加 discard 參數掛載
# mount -o discard /dev/rbd0 /mnt/data/
測試
// osd 空間 6.3 GiB
# ceph osd df
ID CLASS WEIGHT REWEIGHT SIZE RAW USE DATA OMAP META AVAIL %USE VAR PGS STATUS
2 hdd 0.04880 1.00000 50 GiB 2.1 GiB 1.1 GiB 1.8 MiB 1022 MiB 48 GiB 4.20 1.00 33 up
1 hdd 0.04880 1.00000 50 GiB 2.1 GiB 1.1 GiB 1.7 MiB 1022 MiB 48 GiB 4.20 1.00 33 up
0 hdd 0.04880 1.00000 50 GiB 2.1 GiB 1.1 GiB 1.8 MiB 1022 MiB 48 GiB 4.20 1.00 33 up
TOTAL 150 GiB 6.3 GiB 3.3 GiB 5.3 MiB 3.0 GiB 144 GiB 4.20
MIN/MAX VAR: 1.00/1.00 STDDEV: 0
// 寫入數據
# cd /mnt/data
# dd if=/dev/zero of=test bs=10M count=100
// osd 空間 9.2 GiB
# ceph osd df
ID CLASS WEIGHT REWEIGHT SIZE RAW USE DATA OMAP META AVAIL %USE VAR PGS STATUS
2 hdd 0.04880 1.00000 50 GiB 3.1 GiB 2.1 GiB 1.8 MiB 1022 MiB 47 GiB 6.15 1.00 33 up
1 hdd 0.04880 1.00000 50 GiB 3.1 GiB 2.1 GiB 1.7 MiB 1022 MiB 47 GiB 6.15 1.00 33 up
0 hdd 0.04880 1.00000 50 GiB 3.1 GiB 2.1 GiB 1.8 MiB 1022 MiB 47 GiB 6.15 1.00 33 up
TOTAL 150 GiB 9.2 GiB 6.2 GiB 5.3 MiB 3.0 GiB 141 GiB 6.15
MIN/MAX VAR: 1.00/1.00 STDDEV: 0
// 刪除數據
# rm -f test
// osd 空間 6.3 GiB
# ceph osd df
ID CLASS WEIGHT REWEIGHT SIZE RAW USE DATA OMAP META AVAIL %USE VAR PGS STATUS
2 hdd 0.04880 1.00000 50 GiB 2.1 GiB 1.1 GiB 1.8 MiB 1022 MiB 48 GiB 4.20 1.00 33 up
1 hdd 0.04880 1.00000 50 GiB 2.1 GiB 1.1 GiB 1.7 MiB 1022 MiB 48 GiB 4.20 1.00 33 up
0 hdd 0.04880 1.00000 50 GiB 2.1 GiB 1.1 GiB 1.8 MiB 1022 MiB 48 GiB 4.20 1.00 33 up
TOTAL 150 GiB 6.3 GiB 3.3 GiB 5.3 MiB 3.0 GiB 144 GiB 4.20
MIN/MAX VAR: 1.00/1.00 STDDEV: 0
Kubernetes 支持掛載選項,在 StorageClass 對象聲明即可。
mountOptions:
- discard
PersistentVolume 對象可以通過下面的註解聲明,但是未來會棄用。
metadata:
annotations:
volume.beta.kubernetes.io/mount-options: "discard"
可以使用 findmnt 或 mount 命令查看有沒有 discard 參數。
# findmnt -lo source,target,fstype,label,options,used | grep pvc-5d7888a2-39e4-46a1-a18b-e8244e8f0b3c
/dev/rbd0 /var/lib/kubelet/plugins/kubernetes.io/csi/pv/pvc-5d7888a2-39e4-46a1-a18b-e8244e8f0b3c/globalmount/0001-0024-bd241c5a-d012-11eb-8215-e977530c8b31-0000000000000003-6b238965-d3f9-11eb-9891-56a6d268783b rw,relatime,discard,stripe=16 2.5M
/dev/rbd0 /var/lib/kubelet/pods/88020e6c-5e4c-4a70-a7bc-23f507706947/volumes/kubernetes.io~csi/pvc-5d7888a2-39e4-46a1-a18b-e8244e8f0b3c/mount rw,relatime,discard,stripe=16 2.5M
# mount -l | grep "/dev/rbd0"
/dev/rbd0 on /mnt/data type ext4 (rw,relatime,discard,stripe=16)
總結
實際上做不做 Trim/Discard 操作對於 HDD 類型的文件系統來說沒什麼影響, HDD 可以覆蓋使用,但是 SSD 不允許覆蓋,只能在系統要求在相同的地方寫入數據時先擦除再寫入,這會影響 SSD 的性能,因此建議 SSD 做 Trim/Discard 操作。
對於 Ceph 來說,不做 Trim/Discard 操作在 OSD 看到的使用空間跟實際使用的空間會不一樣。這就有點像 Oracle 的高水位線了,delete 表數據,表空間的高水位線不會下降,但是可以覆蓋。
如果沒有做 Trim/Discard 操作後再刪掉 RBD image ,Ceph OSD 會以異步方式刪除數據,因此不能立即釋放磁盤空間,可以通過查看 pg 的狀態查看進度。
# ceph pg stat
33 pgs: 10 active+clean, 19 active+clean+snaptrim_wait, 4 active+clean+snaptrim; 1.5 GiB data, 4.8 GiB used, 142 GiB / 150 GiB avail
# ceph pg stat
33 pgs: 10 active+clean, 19 active+clean+snaptrim_wait, 4 active+clean+snaptrim; 1.2 GiB data, 3.8 GiB used, 143 GiB / 150 GiB avail
# ceph pg stat
33 pgs: 10 active+clean, 19 active+clean+snaptrim_wait, 4 active+clean+snaptrim; 1.1 GiB data, 3.5 GiB used, 144 GiB / 150 GiB avail
# ceph pg stat
33 pgs: 10 active+clean, 19 active+clean+snaptrim_wait, 4 active+clean+snaptrim; 1.1 GiB data, 3.5 GiB used, 144 GiB / 150 GiB avail
# ceph pg stat
33 pgs: 10 active+clean, 19 active+clean+snaptrim_wait, 4 active+clean+snaptrim; 1.1 GiB data, 3.5 GiB used, 144 GiB / 150 GiB avail
# ceph pg stat
33 pgs: 19 active+clean, 10 active+clean+snaptrim_wait, 4 active+clean+snaptrim; 812 MiB data, 2.6 GiB used, 144 GiB / 150 GiB avail
# ceph pg stat
33 pgs: 33 active+clean; 9.7 MiB data, 229 MiB used, 147 GiB / 150 GiB avail
snaptrim_Wait:Trim 操作等待被調度執行
snaptrim:正在做 Trim 操作
本文由mdnice多平臺發佈