调试系统环境:
Ubuntu22.04
此处使用img文件加载为loop的方式添加至存储池,存在不稳定性,img加载到loop后本质上是一个块设备文件,建议使用单独的SSD或M.2或加速盘作为缓存设备。这里提供一个思路和选择,供学习参考。
数据安全提醒
其实这是一个性价比很高的方案,近百TB的大容量+最热文件内存机读取速度+较热文件nvme的读取速度+nvme的写入速度。
但是作为写入缓存的ZIL(log)坏了比较麻烦,不过也只影响坏之前没有来得及写回ZFS阵列的内容(在非连续高负载下问题不大),根据数据的重要程度选择要不要做成raid1的缓存:
而cache和内存的效果一样,只是作为L2ARC加速读取,内存还是一级ARC,作为最热的文件缓存,L2作为沉淀层。
开机自动挂载SSD
查看硬盘设备
fdisk -l
删除硬盘分区,格式化硬盘
fdisk /dev/sdf
d
w
fsck /dev/sdf
查看硬盘设备UUID
blkid /dev/sdf
编辑/etc/fstab文件,开机自动挂载
vim /etc/fstab
重启测试挂载情况,重启之前先使用mount测试能否正常挂载
reboot
新建loop虚拟盘
使用dd命令创建img文件,大小根据实际情况设置
zfs-log-cache.img 用于log(根据实际情况创建)
zfs-read-cache.img 用于读写缓存
/dev/sdf 为SSD硬盘设备
/swap 为挂载目录,如上图
dd if=/dev/sdf of=/swap/zfs-log-cache.img bs=20G count=1
dd if=/dev/sdf of=/swap/zfs-read-cache.img bs=200G count=1
挂载img为loop
使用losetup指令
losetup -fP zfs-log-cache.img
losetup -fP zfs-read-cache.img
或
losetup /dev/loop* zfs-log-cache.img # *号代表loop编号,如loop1,使用losetup -a可查看以挂载的回环设备
losetup /dev/loop* zfs-read-cache.img
losetup -a
使用ls -l 查看loop设备,loop实际为块设备文件
添加loop设备到zpool
首先检查zpool的情况:
zpool status
我已经添加了读写缓存,忽略!没添加的情况下没有logs和cache
添加loop到zpool缓存
zpool add pool1 log /dev/loop6
zpool add pool1 cache /dev/loop7
再次查看会显示如上图的logs 和 cache。
查看缓存效果
zpool iostat -v
可以看到读缓存已经工作了。
开机自动挂载loop
此处使用的是systemctl配合脚本的形式实现开机自动挂载loop
注意:zpool池添加缓存设备以后重启系统如果loop设备未挂载,则储存池导入失败,需先挂载loop再导入zpool池。
1、创建一个脚本用于挂载loop设备
vim loop.sh
脚本内容如下,执行 losetup 挂载指令
2、创建一个loop.service文件,用于systemctl开机自启服务,执行loop.sh脚本
[Unit]
# 服务名称,可自定义
Description = loop mount
After = systemd-udev-settle.service
Wants = network.target
[Service]
Type = simple
ExecStart = /swap/loop.sh
[Install]
WantedBy = multi-user.target
注意:After = systemd-udev-settle.service ,loop在此服务后面挂载
3、将loop.service文件拷贝到 /etc/systemd/system/ 目录下
4、设置开机自启loop.serviece服务
systemctl enabled loop.service
5、修改zfs启动服务文件,我的文件路径:
/usr/lib/systemd/system/zfs-import-scan.service
可使用find指令查询文件所在路径
修改After字段,在loop.service服务之后启动,因为要先挂载loop设备才能启动zpool,如下图。
vim /usr/lib/systemd/system/zfs-import-scan.service
修改完以后查看一下 zfs-import-scan.service 服务是否开机自启
6、重启服务器,重启以后查看zpool及服务是否运行正常
reboot