Ceph 存儲的那點事兒 — Trim/Discard

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多平臺發佈

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章