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

一、前言

参考文档:
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.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解决

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/186034.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue2学习笔记(事件处理)

事件的基本使用&#xff1a; 1.使用v-on:xxx 或 xxx 绑定事件&#xff0c;其中xxx是事件名&#xff1b;2.事件的回调需要配置在methods对象中&#xff0c;最终会在vm上&#xff1b;3.methods中配置的函数&#xff0c;不要用箭头函数&#xff01;否则this就不是vm了&#xff1b…

修复电脑中缺失的VCRUNTIME140.dll文件的5个有效方法

vcruntime140.dll丢失5个修复方法与vcruntime140.dll是什么以及丢失对电脑的影响 引言&#xff1a; 在日常使用电脑的过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是“vcruntime140.dll丢失”。那么&#xff0c;什么是vcruntime140.dll&#xff1f;它…

如何搭建外网可访问的Serv-U FTP服务器,轻松远程共享文件!

目录 1. 前言 2. 本地FTP搭建 2.1 Serv-U下载和安装 2.2 Serv-U共享网页测试 2.3 Cpolar下载和安装 3. 本地FTP发布 3.1 Cpolar云端设置 3.2 Cpolar本地设置 4. 公网访问测试 5. 总结 1. 前言 科技日益发展的今天&#xff0c;移动电子设备似乎成了我们生活的主角&am…

hutool的bug之 DateUtil.endOfDay(DateUtil.date())

hutool 工具类DateUtil 使用时谨慎 DateUtil.endOfDay 得到的时间保存到数据时会增加一秒 首先比较下时间的long值&#xff1a; 这样就很明显的看出来&#xff0c;hutool工具类的date是毫秒位多了.999,保存到mysql 的时候&#xff0c;MySQL数据库对于毫秒大于500的数据进行…

力扣 --- 删除有序数组中的重复项 II

题目描述&#xff1a; 给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的…

甘草书店记:2023年10月24日 星期二 「在完美和高效之间寻求平衡」

书店装修设计图出了第一版&#xff0c;不能够完全满意也在不在预料之外。 中国人的哲学是中庸的哲学。在高效中去追逐完美&#xff0c;在追逐完美中提升效率。 分享余华先生在节目中的一段话&#xff1a; 一种阅读和一本书的相遇有时候也是一种缘分。但也可能就是所有人都说…

2023-11-30 通过中缀表达式转换后缀表达式, 用C语言完成一个简单的计算器

点击 <C 语言编程核心突破> 快速C语言入门 通过中缀表达式转换后缀表达式, 用C语言完成一个简单的计算器 前言一、中缀表达式和后缀表达式 (AI辅助)二、中缀转后缀规则及后缀运算规则 (AI辅助)总结 前言 要解决问题: 在练习用Qt完成一个简单的计算器时, 需要将一个文本…

指数退避和抖动

目录 引入 OCC 添加退避机制 添加抖动机制 小结 引入 OCC 乐观并发控制&#xff08;Optimistic Concurrency Control&#xff0c;OCC&#xff09;是一种既能保证多个写入者安全地修改单个对象又能避免丢失写入的古老方法OCC具有三个优点&#xff1a;只要底层存储可用&#…

指针、数组与函数例题

1、简单数字显示 题目描述 本例要求实现对变量的直接访问和间接访问。输入任意两个整数&#xff0c;先用直接访问的方式输出这两个变量的值&#xff0c;再通过指针变量用间接访问的方式输出这两个变量的值。 输入要求 输入两个整数 输出要求 先用直接访问方式使出这两个整…

leetCode 131.分割回文串 + 回溯算法 + 图解 + 笔记

131. 分割回文串 - 力扣&#xff08;LeetCode&#xff09; 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。回文串 是正着读和反着读都一样的字符串 示例 1&#xff1a; 输入&#xff1a;s "aa…

从原理和公式出发:python实现One_Way_ANOVA

文章目录 目的&#xff1a;python实现one way ANOVA 单因素方差分析1. 代码流程2. python代码实现0 主要的函数1 加载数据2 查看数据统计结果3 数据处理及可视化4 方差分析4.1 模型拟合4.2 单因素方差分析 5 Post Hoc t-test组间比较分析6 根据定义自行分解计算对比调用函数的结…

pandas-profiling / ydata-profiling介绍与使用教程

文章目录 pandas-profilingydata-profilingydata-profiling实际应用iris鸢尾花数据集分析 pandas-profiling pandas_profiling 官网&#xff08;https://pypi.org/project/pandas-profiling/&#xff09;大概在23年4月前发出如下公告&#xff1a; Deprecated pandas-profilin…

积分表二(高等数学同济版中所有的积分公式)

文章目录 含有 x − a x a \sqrt{\pm \frac{x-a}{xa}} xax−a​ ​ 或者 ( x − a ) ( b − x ) \sqrt{(x-a)(b-x)} (x−a)(b−x) ​ 的积分含有三角函数函数的积分含有反三角函数的积分 (其中 a > 0 a>0 a>0)含有指数函数的积分含有对数函数的积分含有双曲函数的…

Object常用方法

toString()&#xff1a;返回对象的字符串表示形式。hasOwnProperty(propertyName)&#xff1a;检查对象是否有指定的属性。isPrototypeOf(object)&#xff1a;检查一个对象是否是另一个对象的原型。propertyIsEnumerable(propertyName)&#xff1a;检查对象的指定属性是否可以枚…

LeetCode 4 寻找两个正序数组的中位数

题目描述 给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,3], nums2 [2] 输出&#xff1a;2.0…

MediaPipe - 小记

文章目录 关于 MediaPipe 关于 MediaPipe Cross-platform, customizable ML solutions for live and streaming media. MediaPipe &#xff1a; 设备端机器学习框架 MediaPipe Studio : 提供标准化 task&#xff0c;你可以下载预训练模型来使用 MediaPipe Model Maker : 定制…

python中的字符串

字符串 字符串是编程语言中的一种基本数据类型&#xff0c;用于表示一串字符序列。在Python中&#xff0c;字符串是不可变的&#xff0c;也就是说一旦字符串被创建&#xff0c;就无法修改其中的字符。 Python中的字符串可以用单引号或双引号括起来&#xff0c;例如&#xff1…

构建SQL Server链接服务器:实现跨服务器数据访问及整合

点击上方蓝字关注我 在SQL Server数据库管理中&#xff0c;链接服务器是一项强大的功能&#xff0c;允许在一个SQL Server实例中访问另一个SQL Server实例的数据。这种功能为数据库管理员提供了灵活性&#xff0c;使其能够跨不同服务器进行数据交互&#xff0c;开辟了更多的应用…

RLHF:强化学习结合大预言模型的训练方式

RLHF (Reinforcement Learning from Human Feedback) 以强化学习方式依据人类反馈优化语言模型。 文章目录 一、简介二、一般的流程三、微调gpt介绍示例 参考文章 一、简介 强化学习从人类反馈中学习&#xff08;RLHF&#xff0c;Reinforcement Learning from Human Feedback&a…

【代码随想录】算法训练计划37

贪心 1、738. 单调递增的数字 题目&#xff1a; 输入: n 10 输出: 9 思路&#xff1a; func monotoneIncreasingDigits(n int) int {// 贪心&#xff0c;利用字符数组s : strconv.Itoa(n)ss : []byte(s)leng : len(ss)if leng < 1 {return n}for i:leng-1; i>0; i-- …