先介绍一下实践的背景:
一直以来,个人比较摈弃群晖向NAS系统,并不是类似于群晖这类NAS操作系统不好用,相反正是因为过于方便导致学习不到linux相关的命令操作,所以自打开始玩家庭流媒体以来,一直以pve作为底座,通过虚拟化linux操作系统来手动构建自己的流媒体,以此方式来激励自己学习linux方面的操作。
因此,nas缓存也是构建于pve操作系统中的。
2023年下半年,从玩nas开始,逐渐发现自己的磁盘空间不够,出于对速度的考虑,最早采用RAID10的方案将磁盘附加给虚拟机。由于当时qb和nas管理系统分离,通过nfs挂载的方式使得下载目录被下载器和媒体管理工具共同监控,因此并未实际感受到hdd磁盘写入速度带来的影响。直到2024年开春,因为工作调动,搬家后想着反正也有一个月没做种了,趁此机会重新整理一下我的nas。于是乎,折腾之旅又双叒叕开始了。
保留了pve底座,原先将qb部署于单独的虚拟机中,将nas管理工具、字幕工具、辅种工具统一部署到k8s环境中。现在将所有工具统一部署到了一个虚拟机中,为此,我创建了一个6C64G的rocky linux作为媒体库目录,并且将整合后的30T机械硬盘空间分配给rocky
磁盘空间整合使用lvm逻辑卷的方式。
什么是lvm逻辑卷?
LVM(逻辑卷管理)是一种在Linux环境下用于管理磁盘驱动器和相似存储设备的一种方法。通过使用LVM可以更灵活地管理存储空间。逻辑卷是在LVM管理下创建和使用的存储空间单位。
LVM的组件包括:物理卷(PV)、卷组(VG)、逻辑卷(LV)
LVM允许动态调整磁盘大小、支持快照功能
lvm的方式于raid10相比,不必牺牲一半的磁盘空间做数据冗余,但缺失了raid10的高性能
> 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
在虚拟机的硬件选项中添加新增好的lvgroup逻辑卷,并填写完整的可用空间即可完成对磁盘的添加
实现磁盘挂载并且使用了一段时间后,无缓存层的弊端逐渐显现。例如在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。
我有两块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