一、前言
参考文档:
ZFS源码:Github
ZFS部署文档:ZFS-WiKi、ZFS-freebsd
OpenZFS 是一个高级文件系统和卷管理器,最初是为 Solaris 开发的,现在由 OpenZFS 社区维护。
1、简介
ZFS是一种先进的现代文件系统,是一个革命性的文件系统,它专门设计用于提供传统UNIX文件系统中不具备的功能,从根本上改变了文件系统的管理方式,具有目前市面上的其他任何文件系统所没有的功能和优点。ZFS最初是由Sun公司为Solaris 10操作系统开发的文件系统,被Sun称为是终极文件系统。为了便于将其移植到其他操作系统,ZFS作为OpenSolaris开源计划的一部分,于2005年11月发布,经历了10年的活跃开发。Oracle收购Sun之后,为了能够继续提供开源版本,原来负责开发ZFS文件系统的几个工程师建立了OpenZFS开源项目以提供开源版本的持续协作开发。
2、常用术语
- Pool:存储驱动器的逻辑分组,它是ZFS的基本构建块,从这里将存储空间分配给数据集。
- Datasets:ZFS文件系统的组件即文件系统、克隆、快照和卷被称为数据集。
- Mirror:一个虚拟设备存储相同的两个或两个以上的磁盘上的数据副本,在一个磁盘失败的情况下,相同的数据是可以用其他磁盘上的镜子。
- Resilvering:在恢复设备时将数据从一个磁盘复制到另一个磁盘的过程。
- Scrub:擦除用于一致性检验在ZFS像在其他文件系统如何使用fsck。
二、安装说明
安装部署说明:# Getting Started
源码编译说明:# Building ZFS
1、源码编译
由于在线安装相关版本过于陈旧,示例使用最新的zfs-2.1.4源码进行手动编译安装
1.1、CentOS
-
安装依赖
yum install epel-release gcc make autoconf automake libtool rpm-build libtirpc-devel libblkid-devel libuuid-devel libudev-devel openssl-devel zlib-devel libaio-devel libattr-devel elfutils-libelf-devel kernel-devel-$(uname -r) python python2-devel python-setuptools python-cffi libffi-devel git ncompress libcurl-devel
yum install --enablerepo=epel python-packaging dkms -
编译rpm包
下载zfs-2.1.4.tar.gz源码包,执行rpm编译操作cd /opt/
wget https://github.com/openzfs/zfs/releases/download/zfs-2.1.4/zfs-2.1.4.tar.gz
tar -zxvf zfs-2.1.4.tar.gz
cd zfs-2.1.4
./autogen.sh
./configure
make rpm -
安装rpm包
安装编译好的rpm包,手动加载zfs内核模块yum install *.rpm -y
modprobe zfs -
查看当前版本信息
[root@node129 ~]# zfs version
zfs-2.1.4-1
zfs-kmod-2.1.4-1
1.2、Ubuntu
-
安装依赖
sudo apt install build-essential autoconf automake libtool gawk alien fakeroot dkms libblkid-dev uuid-dev libudev-dev libssl-dev zlib1g-dev libaio-dev libattr1-dev libelf-dev linux-headers-$(uname -r) python3 python3-dev python3-setuptools python3-cffi libffi-dev python3-packaging git libcurl4-openssl-dev
-
编译deb包
下载zfs-2.1.4.tar.gz源码包,执行deb编译操作cd /opt/
wget https://github.com/openzfs/zfs/releases/download/zfs-2.1.4/zfs-2.1.4.tar.gz
tar -zxvf zfs-2.1.4.tar.gz
cd zfs-2.1.4
./autogen.sh
./configure
make deb -
安装deb包
安装编译好的deb包,手动加载zfs内核模块dpkg -i *.deb
modprobe zfs
2、在线安装
2.1、CentOS
示例使用CentOS7.6系统
-
安装zfs-release包
为简化安装步骤,官方提供了一个zfs-release
包,安装完成之后,会生成yum源配置(/etc/yum.repos.d/zfs.repo
)和公共签名密钥(/etc/pki/rpm-gpg/RPM-GPG-KEY-zfsonlinux
)
注:zfs-rekease
包与系统版本相关,如示例为CentOS7.6系统,则对应包名为zfs-release.el7_6.noarch.rpmyum install https://zfsonlinux.org/epel/zfs-release.el7_6.noarch.rpm
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-zfsonlinux -
安装ZFS相关软件包
yum install -y epel-release
yum install -y kernel-devel
yum install -y zfs
2.2、Ubuntu
示例使用Ubuntu16.04系统,基于Ubuntu系统下,ZFS默认集成在Linux内核包中,只需要安装ZFS应用程序即可
-
更新在线源
echo "deb http://archive.ubuntu.com/ubuntu xenial main universe" >> /etc/apt/sources.list
apt update -
安装ZFS应用程序
apt install zfsutils-linux
三、部署说明
参考文档:
oracle-zfs
oracle-zpool
1、存储池管理
1.1、创建存储池
通用格式如下:
zpool create -f -m <mount-path> <pool-name> [pool-type] <disk> [pool-type] <disk> [spare <disk> log <disk> cache <disk>]
- -f :可选参数,表示强制创建,可避免EFI label error错误
- -m :可选参数,后接存储池挂载路径(mount-path),默认不指定时,挂载路径为
/pool-name
- pool-name :表示为存储池名称
- pool-type :表示为存储池类型,默认不指定时为raidz,可选参数raidz、raidz1、raidz2、raidz3、mirror
- raidz : 类似raid0,无冗余
- raidz1 :类似raid5,可容忍一块磁盘损坏,至少需要三个磁盘,其中一个磁盘用于奇偶校验
- raidz2 :类似raid6,可容忍两块磁盘损坏,至少需要四个磁盘,其中两个磁盘用于奇偶校验
- raidz3 :类似raid7,可容忍三块硬盘损坏,至少需要五个磁盘,其中三个磁盘用于奇偶校验
- mirror :类似raid1或raid10,同一个镜像组可以容忍一半的磁盘损坏
- disk :表示组成存储池的磁盘列表,可以为磁盘名称(如sdb)、磁盘完整路径(如/dev/sdb)、磁盘id(可通过/dev/disk/by-id/查询,如ata-ST6000NM0115-1YZ110_ZAD1DR7M),为避免因磁盘盘符漂移导致zpool无法恢复,此处建议使用磁盘id方式指定
- spare : 可选参数,后接磁盘列表,表示热备盘,当raid组出现磁盘故障,则会启用热备盘进行数据恢复
- log :可选参数,后接磁盘列表,表示日志盘,日志盘可以做成镜像用于数据冗余,可以使用独立的SSD作为日志盘(使用多块SSD时,日志信息会平均分散到所有SSD内),可以提升同步写入性能(如资料库)
- cache :可选参数,后接磁盘列表,表示缓存盘,缓存盘不可以做成镜像,但缓存盘只会存储额外的现有数据副本,并不会导致数据丢失,可以加速数据读取性能
注:一个raidzx存储池包括n个数据盘+m个校验盘(n+m太大会导致文件拆的很碎,官方建议n+m小于16),n通常建议是2的次方(如2/4/8),raidx存储池利用率=n/(n+m)
示例如下,使用10块磁盘创建raidz2存储池(8 + 2),配备一块热备盘
zpool create -f zfspool raidz2 /dev/mapper/mpathcu1 /dev/mapper/mpathbp1 /dev/mapper/mpathak1 /dev/mapper/mpathch1 /dev/mapper/mpathbc1 /dev/mapper/mpathaw1 /dev/mapper/mpathct1 /dev/mapper/mpathbo1 spare /dev/mapper/mpathcj1
zfs支持文件、块接口,默认为文件接口,如需创建块设备,可执行命令zfs create -V <volume-size> <pool-name>/<volume-name>
1.2、扩展存储池
通用格式如下:
zpool add -f <pool-name> [pool-type] <disk> [pool-type] <disk> [spare <disk> log <disk> cache <disk>]
1.3、删除存储池
通用格式如下:
zpool destroy <pool-name>
注:如只需删除一个子空间,则执行zfs destroy <pool-name>/<dataset-name>
1.4、存储池故障处理
- 替换存储池故障盘:
zpool replace <pool-bane> <disk-old> <disk-new>
- 移除存储池磁盘:
zpool remove <pool-name> <disk-name>
注:此处只能移除未被使用的热备盘、日志盘及缓存盘
1.5、存储池状态查询
- 查看当前存储池列表信息:
zpool list
- 查看当前存储池状态信息:
zpool status
- 查看具体存储池参数配置:
zfs get all <pool-name>
- 查看具体存储池挂载路径:
zfs get mountpoint <pool-name>
- 校验具体存储池写入数据:
zpool scrub <pool-name>
- 动态监控存储池读写性能:
zpool iostat <pool-name> [monitor-second]
注:monitor-second
为读写性能打印间隔,单位为秒
四、Q&A
1、内核模块加载
-
问题说明
默认情况下,开启启动时,只有当检测到存在ZFS池的时候,才会加载zfs内核模块
-
解决措施
如需设置每次开机自动加载zfs模块,则添加配置如下即可
echo zfs >/etc/modules-load.d/zfs.conf
2、内核版本选择
-
问题说明
实际使用过程中,4.14高内核版本与ZFS存在兼容性问题,通过FTP服务、HTTP服务读取ZFS存储大文件失败
-
解决措施
更新内核版本为3.10.0-1160.66.1.el7.x86_64解决