【开源存储】OpenZFS文件系统部署实践

一、前言

参考文档:

ZFS源码:Github

ZFS部署文档:ZFS-WiKiZFS-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.rpm

    yum 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解决

相关推荐
真真-真真12 分钟前
WebXR
linux·运维·服务器
轩辰~34 分钟前
网络协议入门
linux·服务器·开发语言·网络·arm开发·c++·网络协议
雨中rain1 小时前
Linux -- 从抢票逻辑理解线程互斥
linux·运维·c++
Bessssss2 小时前
centos日志管理,xiao整理
linux·运维·centos
s_yellowfish2 小时前
Linux服务器pm2 运行chatgpt-on-wechat,搭建微信群ai机器人
linux·服务器·chatgpt
豆是浪个2 小时前
Linux(Centos 7.6)yum源配置
linux·运维·centos
vvw&2 小时前
如何在 Ubuntu 22.04 上安装 Ansible 教程
linux·运维·服务器·ubuntu·开源·ansible·devops
我一定会有钱2 小时前
【linux】NFS实验
linux·服务器
Ven%2 小时前
如何在防火墙上指定ip访问服务器上任何端口呢
linux·服务器·网络·深度学习·tcp/ip
是阿建吖!2 小时前
【Linux】基础IO(磁盘文件)
linux·服务器·数据库