[Linux]紅帽高階儲存功能 - Stratis與VDO
Stratis 卷管理檔案系統
介紹
紅帽的 Stratis 是新一代的儲存管理解決方案,稱為卷管理檔案系統。可以通過它建立檔案系統及調整其大小時以動態、透明的方式來管理卷層。
Stratis 以管理物理儲存池的服務形式執行,並透明地為所建立的檔案系統建立和管理卷。由於 Stratis 使用現有的儲存驅動程式和工具,因此 Stratis 也支援當前在 lvm、xfs 和裝置對映器中使用的所有高階儲存功能。Stratis 檔案系統沒有固定大小,也不再預分配未使用的塊空間。
Stratis 使用儲存的元資料來識別所管理的池、卷和檔案系統。因此絕不應該對 Stratis 建立的檔案系統進行手動重新格式化或重新配置;只應使用 Stratis 工具和命令對它們進行管理。手動配置 Stratis 檔案系統可能會導致該元資料丟失,並阻止 Stratis 識別它已建立的檔案系統。您可以使用不同組的塊裝置來建立多個池。在每個池中,您可以建立一個或多個檔案系統。目前每個池最多可以建立 2^24 個檔案系統。
在內部 Stratis 使用 Backstore 子系統來管理塊裝置,並使用 Thinpool 子系統來管理池。Backstore 有一個數據層,負責維護塊裝置磁碟上的元資料,以及檢測和糾正資料損壞。快取層使用高效能塊裝置作為資料層之上的快取。Thinpool 子系統管理與 Stratis 檔案系統關聯的精簡部署卷。該子系統使用 dm-tin裝置對映器驅動程式取代 LVM 進行虛擬卷大小調整和管理。dm-thin 可以建立虛擬大小比較大,但物理大小比較小的卷, 採用 XFS 格式。當物理大小快要滿時,Stratis 會自動將其擴大。
特點
使用Stratis管理分層儲存,有以下的好處:
- 自動精簡配置(超額分配)
- 檔案系統快照
- 基於池的儲存管理
- 儲存監控
Stratis相關概念:
- blockdev:塊裝置
- pool:儲存池
- filesystem:檔案系統
對應關係:
- 1個Pool,最多可以建立2²⁴個檔案系統,自動分配大小,當總資料量接近虛擬分配的大小則自動擴容,只要儲存池物理裝置充足,理論上無限擴充套件。
使用
- 安裝軟體包
[root@localhost /]# yum install -y stratis-cli stratisd
- 啟動服務並設定服務開機自啟
[root@localhost /]# systemctl enable --now stratisd
- 新增一塊SATA硬碟,建立儲存池
[root@localhost ~]# stratis pool create pool1 /dev/sdb
- 檢視可用池列表
[root@localhost ~]# stratis pool list
Name Total Physical Properties UUID
pool1 5 GiB / 37.63 MiB / 4.96 GiB ~Ca,~Cr d45d2be9-e1ca-4700-a03f-365eda2eac34
- 再次新增一塊硬碟,新增這個塊裝置到儲存池
[root@localhost ~]# stratis pool add-data pool1 /dev/sdc
- 檢視池的塊裝置
[root@localhost ~]# stratis blockdev list
Pool Name Device Node Physical Size Tier
pool1 /dev/sdb 5 GiB Data
pool1 /dev/sdc 5 GiB Data
[root@localhost ~]# stratis pool list
Name Total Physical Properties UUID
pool1 10 GiB / 41.63 MiB / 9.96 GiB ~Ca,~Cr d45d2be9-e1ca-4700-a03f-365eda2eac34
- 為池建立動態、靈活的檔案系統
[root@localhost ~]# stratis filesystem create pool1 fs1
- 檢視檔案系統
[root@localhost ~]# stratis filesystem list
Pool Name Name Used Created Device UUID
pool1 fs1 546 MiB Apr 13 2022 15:22 /dev/stratis/pool1/fs1 b28ec1f4-21ed-4d89-84f5-d8ca91ef12ce
[root@localhost ~]# blkid /dev/stratis/pool1/fs1
/dev/stratis/pool1/fs1: UUID="b28ec1f4-21ed-4d89-84f5-d8ca91ef12ce" TYPE="xfs"
- 掛載檔案系統
這裡的 x-systemd.requires=stratisd.service,是通過 systemd 來確保 stratisd.service(Stratis服務的守護程序)啟動,再掛載這個檔案系統,否則電腦將無法開機。
[root@localhost ~]# vim /etc/fstab
...
UUID=b28ec1f4-21ed-4d89-84f5-d8ca91ef12ce /dir1 xfs defaults,x-systemd.requires=stratisd.service 0 0
[root@localhost ~]# mount -a
[root@localhost ~]# df -hT
Filesystem Type Size Used Avail Use% Mounted on
...
/dev/mapper/stratis-1-d45d2be9e1ca4700a03f365eda2eac34-thin-fs-b28ec1f421ed4d8984f5d8ca91ef12ce xfs 1.0T 7.2G 1017G 1% /dir1
- 建立檔案測試
[root@localhost ~]# echo hello world > /dir1/file1
- 建立快照
[root@localhost ~]# stratis filesystem snapshot pool1 fs1 snap1
[root@localhost ~]# stratis filesystem list
Pool Name Name Used Created Device UUID
pool1 fs1 546 MiB Apr 13 2022 15:22 /dev/stratis/pool1/fs1 b28ec1f4-21ed-4d89-84f5-d8ca91ef12ce
pool1 snap1 546 MiB Apr 13 2022 15:31 /dev/stratis/pool1/snap1 6dafb135-a4f8-49a8-a757-0c78cb430fb2
[root@localhost ~]# rm -rf /dir1/file1
[root@localhost ~]# mount /dev/stratis/pool1/snap1 /dir2
[root@localhost ~]# cat /dir2/file1
VDO 虛擬資料優化器
介紹
LVM只能解決容量的問題,但不具備資料壓縮的能力。
VDO(Virtual Data Optimize):虛擬資料優化器,通過壓縮或刪除儲存裝置上的資料來優化空間,VDO層放置在現有塊儲存裝置上層,例如RAID裝置或本地磁碟的頂部。
特點
- kvdo:用於控制資料壓縮
- uds:用於重複資料刪除
vdo不僅能對資料進行壓縮,還能對重複的資料進行優化。
Linux下依賴vdo.service服務,否則是不能使用vdo的
使用
- 安裝軟體包(預設已安裝)
[root@localhost ~]# yum install -y vdo
- 建立VDO卷
[root@localhost ~]# vdo create --name=vdo1 --device=/dev/sdb --vdoLogicalSize=10G
Creating VDO vdo1
The VDO volume can address 6 GB in 3 data slabs, each 2 GB.
It can grow to address at most 16 TB of physical storage in 8192 slabs.
If a larger maximum size might be needed, use bigger slabs.
Starting VDO vdo1
Starting compression on VDO vdo1
VDO instance 0 volume is ready at /dev/mapper/vdo1
- 檢視VDO卷的屬性與狀態
[root@localhost ~]# vdo status --name=vdo1
VDO status:
Date: '2022-04-13 16:34:12+08:00'
Node: localhost.localdomain
Kernel module:
Loaded: true
Name: kvdo
Version information:
kvdo version: 6.2.2.117
Configuration:
File: /etc/vdoconf.yml
Last modified: '2022-04-13 16:33:40'
VDOs:
vdo1:
Acknowledgement threads: 1
Activate: enabled
Bio rotation interval: 64
Bio submission threads: 4
Block map cache size: 128M
Block map period: 16380
Block size: 4096
CPU-work threads: 2
Compression: enabled
Configured write policy: auto
Deduplication: enabled
Device mapper status: 0 20971520 vdo /dev/sdb normal - online online 1049638 2621440
Emulate 512 byte: disabled
Hash zone threads: 1
Index checkpoint frequency: 0
Index memory setting: 0.25
Index parallel factor: 0
Index sparse: disabled
Index status: online
Logical size: 10G
Logical threads: 1
Max discard size: 4K
Physical size: 10G
Physical threads: 1
Slab size: 2G
Storage device: /dev/sdb
UUID: VDO-59a6cb34-0ba6-4e3d-81b8-967710ca668f
VDO statistics: not available
- 顯示VDO卷列表
[root@localhost ~]# vdo list
vdo1
- 停止和啟動VDO卷
[root@localhost ~]# vdo stop -n vdo1
Stopping VDO vdo1
[root@localhost ~]# vdo start -n vdo1
Starting VDO vdo1
Starting compression on VDO vdo1
VDO instance 1 volume is ready at /dev/mapper/vdo1
- 檢視VDO捲上是否啟用了壓縮(Compression)和重複資料(Deduplication)刪除功能
[root@localhost ~]# vdo status --name=vdo1 | grep Dedu
Deduplication: enabled
[root@localhost ~]# vdo status --name=vdo1 | grep Com
Compression: enabled
- 格式化VDO卷
[root@localhost ~]# mkfs.xfs -K /dev/mapper/vdo1
meta-data=/dev/mapper/vdo1 isize=512 agcount=4, agsize=655360 blks
= sectsz=4096 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1
data = bsize=4096 blocks=2621440, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=4096 sunit=1 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
- 檢查裝置事件處理是否完成
[root@localhost ~]# udevadm settle
- 建立掛載點,設定開機自動掛載
[root@localhost ~]# mkdir /mnt/vdo1
[root@localhost ~]# blkid | grep vdo1
/dev/mapper/vdo1: UUID="b4373f24-2c29-4893-bce3-fb608025107d" TYPE="xfs"
[root@localhost ~]# vim /etc/fstab
...
UUID=b4373f24-2c29-4893-bce3-fb608025107d /mnt/vdo1 xfs defaults,x-systemd.requires=vdo.service 0 0
[root@localhost ~]# mount /mnt/vdo1/
- 檢視卷初始資訊
[root@localhost /]# vdostats --human-readable
Device Size Used Available Use% Space saving%
/dev/mapper/vdo1 10.0G 4.0G 6.0G 40% N/A
- 準備一個大檔案用於測試
[root@localhost /]# dd if=/dev/urandom of=/root/testfile1 bs=1M count=300
300+0 records in
300+0 records out
314572800 bytes (315 MB, 300 MiB) copied, 12.8609 s, 24.5 MB/s
[root@localhost /]# ls -lh /root/testfile1
-rw-r--r--. 1 root root 300M Apr 13 17:06 /root/testfile1
- 把檔案複製到VDO卷掛載目錄
[root@localhost /]# cp /root/testfile1 /mnt/vdo1/testfile1.1
[root@localhost /]# vdostats --human-readable
Device Size Used Available Use% Space saving%
/dev/mapper/vdo1 10.0G 4.3G 5.7G 42% 3%
- 重複多次操作觀察Used與Saving%的變化
[root@localhost /]# cp /root/testfile1 /mnt/vdo1/testfile1.2
[root@localhost /]# vdostats --human-readable
Device Size Used Available Use% Space saving%
/dev/mapper/vdo1 10.0G 4.3G 5.7G 43% 48%
[root@localhost /]# cp /root/testfile1 /mnt/vdo1/testfile1.3
[root@localhost /]# vdostats --human-readable
Device Size Used Available Use% Space saving%
/dev/mapper/vdo1 10.0G 4.3G 5.7G 43% 65%