banner
Aki

Aki

太阳能维修,月亮可更换,星星不闪包退换。
twitter

[媒體庫]NAS存盤緩存層實踐

先介紹一下實踐的背景:
一直以來,個人比較摒棄群暉向 NAS 系統,並不是類似於群暉這類 NAS 操作系統不好用,相反正是因為過於方便導致學習不到 linux 相關的命令操作,所以自打開始玩家庭流媒體以來,一直以 pve 作為底座,通過虛擬化 linux 操作系統來手動構建自己的流媒體,以此方式來激勵自己學習 linux 方面的操作。

因此,nas 緩存也是構建於 pve 操作系統中的。

2023 年下半年,從玩 nas 開始,逐漸發現自己的磁盤空間不夠,出於對速度的考慮,最早採用 RAID10 的方案將磁盤附加給虛擬機。由於當時 qb 和 nas 管理系統分離,通過 nfs 掛載的方式使得下載目錄被下載器和媒體管理工具共同監控,因此並未實際感受到 hdd 磁盤寫入速度帶來的影響。直到 2024 年開春,因為工作調動,搬家後想著反正也有一個月沒做種了,趁此機會重新整理一下我的 nas。於是折騰之旅又雙叒叕開始了。

1、重構系統底座#

保留了 pve 底座,原先將 qb 部署於單獨的虛擬機中,將 nas 管理工具、字幕工具、輔種工具統一部署到 k8s 環境中。現在將所有工具統一部署到了一個虛擬機中,為此,我創建了一個 6C64G 的 rocky linux 作為媒體庫目錄,並且將整合後的 30T 機械硬盤空間分配給 rocky

磁盤空間整合使用 lvm 邏輯卷的方式。

什麼是 lvm 邏輯卷?

LVM(邏輯卷管理)是一種在 Linux 環境下用於管理磁盤驅動器和相似存儲設備的一種方法。通過使用 LVM 可以更靈活地管理存儲空間。邏輯卷是在 LVM 管理下創建和使用的存儲空間單位。
LVM 的組件包括:物理卷(PV)、卷組(VG)、邏輯卷(LV)
LVM 允許動態調整磁盤大小、支持快照功能
lvm 的方式於 raid10 相比,不必犧牲一半的磁盤空間做數據冗余,但缺失了 raid10 的高性能

1.1 構建 lvm 邏輯卷#

> root@ubuntu:~# lsblk
NAME                                MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sdc                                   8:32   0   3.6T  0 disk 
└─lvgroup-lv29_corig                253:12   0  29.1T  0 lvm  
  └─lvgroup-lv29                    253:4    0  29.1T  0 lvm  /mnt/lv29
sdd                                   8:48   0   3.6T  0 disk 
└─lvgroup-lv29_corig                253:12   0  29.1T  0 lvm  
  └─lvgroup-lv29                    253:4    0  29.1T  0 lvm  /mnt/lv29
sde                                   8:64   0   3.6T  0 disk 
sdf                                   8:80   0   3.6T  0 disk 
└─lvgroup-lv29_corig                253:12   0  29.1T  0 lvm  
  └─lvgroup-lv29                    253:4    0  29.1T  0 lvm  /mnt/lv29
sdh                                   8:112  0  14.6T  0 disk 
└─lvgroup-lv29_corig                253:12   0  29.1T  0 lvm  
  └─lvgroup-lv29                    253:4    0  29.1T  0 lvm  /mnt/lv29
sdi                                   8:128  0   3.6T  0 disk 
└─lvgroup-lv29_corig                253:12   0  29.1T  0 lvm  
  └─lvgroup-lv29                    253:4    0  29.1T  0 lvm  /mnt/lv29
sdj                                   8:144  0   7.3T  0 disk 
└─sdj1                                8:145  0   7.3T  0 part

構建的結果如上所示,sdc、sdd、sdf、sdh、sdi、sdj 共 6 塊磁盤組合成 29.1T 的 lv29 邏輯磁盤

具體操作如下:

## 創建pv物理卷
> pvcreate /dev/sdc /dev/sdd /dev/sdf /dev/sdh /dev/sdi /dev/sdj
## 創建lvgroup的卷組
> vgcreate lvgroup /dev/sdc /dev/sdd /dev/sdf /dev/sdh /dev/sdi /dev/sdj
## 創建lv邏輯卷,並將所有磁盤空間分配給卷組lvgroup
> lvcreate -n lv29 -l 100%VG lvgroup

創建好後邏輯卷就像一般磁盤一樣存在於系統中,接下來需要對其設置文件系統格式,並且設定掛載點,之後就可以正常使用

## 格式化的方式創建ext4文件系統
> mkfs.ext4 /dev/lvgroup/lv29
## 創建掛載點
> mkdir -p /mnt/media
## 掛載邏輯卷
> mount /dev/lvgroup/lv29 /mnt/media
## 開機自動掛載
> echo "/dev/lvgroup/lv29 /mnt/media ext4 defaults 0 0" | tee -a /etc/fstab

1.2 在 pve 中將磁盤掛載到 linux 中#

image

在虛擬機的硬件選項中添加新增好的 lvgroup 邏輯卷,並填寫完整的可用空間即可完成對磁盤的添加

2、lvm 緩存層#

實現磁盤掛載並且使用了一段時間後,無緩存層的弊端逐漸顯現。例如在 nas 管理系統中添加種子文件進行下載,qb 接管多個下載任務時,nas 管理系統在搜索媒體或者進行其他操作時,由於 qb 正在對磁盤進行寫入操作,此時會出現系統卡頓的情況。

下載的文件直接寫入 hdd 的操作會佔用內存作為第一個緩存硬件,這是為了提高文件的寫入效率,減少對磁盤的寫操作。

由於內存大小僅有 GB 量級的大小,在文件塊在寫入磁盤過程中,會經過磁盤的 IO(頁緩衝區)進行緩存,當大量的文件、多個下載的內容同時對 hdd 邏輯卷執行寫操作的時候,磁盤 IO 很容易被占滿。在 nas 管理工具中對下載目錄的監控則是對磁盤的讀操作,在存在大量文件寫入 hdd 的時候使用,此時讀寫同時使用磁盤 IO 就會出現磁盤卡 IO 的情況,嚴重影響了使用體驗,具體表現在當我存在 3 個以上的下載任務時,nas 管理工具就會出現非常大的延遲,頁面刷新都需要 5-30 秒。因為此時的磁盤 IO、內存都出現了非常嚴重的堵塞。

因此引入 lvm 緩存層的機制,借用 sdd 的高 IOPS 的特性可以有效緩解 hdd 容易卡 IO 這一現象,具體來說就是當用戶執行下載任務時,被下載的文件塊,先進入內存 memory,後寫入到 lvm 緩存區(sdd),最後寫入到 hdd。

2.1 為已有的 lvm 邏輯卷增加緩衝層#

我有兩塊 ssd 磁盤,sdb 和 sdg,現在要附加給 lvm 並且用作寫入的緩存,由於邏輯卷緩存層的緩存邏輯在 lvm 中是自管理的,因此,我僅需添加到 lvm 的緩存層即可

## 為ssd創建邏輯磁盤
pvcreate /dev/sdb /dev/sdg
## 擴展到邏輯卷lvgroup
vgextend lvgroup /dev/sdb /deb/sdg
## 將所有空間(當前僅剩ssd為空余空間)加入到緩存池
lvcreate --type cache-pool -l 100%FREE -n lv_cache_pool lvgroup
## 將現有的緩存池附加給邏輯卷lv29
lvconvert --type cache --cachepool lvgroup/lv_cache_pool lvgroup/lv29
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。