ZFS on Centos7
Posted EDACAD
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ZFS on Centos7相关的知识,希望对你有一定的参考价值。
编者:
本文是在上周跟比特大陆的IT/CAD相关人员的交流中得知,他们使用zfs有很长一段时间了,并且也踩过一些坑,希望他们能分享一些经验。使用zfs对初创企业还有可借鉴的意义。 如有疑问,可以在edacad群跟赵文硕直接交流。
对稳定性要求高的企业,不建议考虑,避免出现自己无法把控的局面。
现状:
基于IC行业特点,当前绝大多数的IC用户都会选用经过大量验证的更加可靠的统一存储作为核心数据的舞台。最为被广泛认可的是NetApp。但是考虑到成本时,又不得不看看其他选择是否可以满足日常需求,哪怕作为二线存储或者作为备份使用,仰或是利旧目的,ZFS无疑是其中的首选,类似的还有前段时间整合的truneNAS。
ZFS虽然是单机系统,依然可以在各种云平台上畅游,这也是基于当前各云供应商的基础设施完善,冗余,高可用,所以磁盘故障几率不高,即使是核心应用也可以部署到ZFS上,当然,除了快照防护外,第三方的备份系统有足够资源的前提下最好能一起保驾护航,必定数据是无价的。
ZFS特点:
1,ZFS具备独一无二的可伸缩性
ZFS 文件系统的一个关键设计要素就是可伸缩性。ZFS文件系统是 128 位的,允许的存储空间:256 quadrillion zettabyte (256x1015 ZB)。元数据动态分配,因此在首次创建时无需预先分配 inode,不像传统存储总会遇到inode耗光的情况,还要添加inode数量,否则就会限制文件系统的可伸缩性。所有算法在编写时都考虑到了可伸缩性。目录最多可以包含 248(256 万亿)项,并且对于文件系统数或文件系统中可以包含的文件数无限制。
1Byte = 8 Bit 1 KB = 1,024 Bytes 1 MB = 1,024 KB = 1,048,576 Bytes |
2,ZFS 快照
快照是文件系统或卷的只读副本。可以快速轻松地创建快照。最初,快照不会占用池中的任何附加磁盘空间。
活动数据集中的数据更改时,快照通过继续引用旧数据来占用磁盘空间。因此,快照可防止将数据释放回池中。
3,简化的管理
在ZFS中我们只需要两个命令就可以轻松管理128位的文件系统:
- zpool(针对ZFS Pool管理)
- zfs(针对ZFS文件系统的管理)
最重要的是,ZFS 提供了一种极度简化的管理模型。通过使用分层次的文件系统布局、属性继承以及自动管理挂载点和 NFS 共享语义,ZFS 可轻松创建和管理文件系统,而无需使用多个命令或编辑配置文件。可以轻松设置配额或预留空间,启用或禁用压缩,或者通过单个命令管理许多文件系统的挂载点。您就可以检查或替换设备,而无需学习另外的一套卷管理命令。您可以发送和接收文件系统快照流 .
ZFS 通过分层结构管理文件系统,该分层结构允许对属性(如配额、预留空间、压缩和挂载点)进行这一简化管理。在此模型中,文件系统是中央控制点。文件系统本身的开销非常小(相当于创建一个新目录),因此鼓励您为每个用户、项目、工作区等创建一个文件系统。通过此设计,可定义细分的管理点。
ZFS安装
§ VM机型选择: 以微软云上的资源为例-Azure标准 D64ds_v4 (64vcpu,256 GiB 内存)
§ OS: Centos7.8
§ JoinDomain
§ Attach SSD disks (Based on the requirement) 可以混合使用
注释:安装zfs时vm需要能链接到internet。
1, Install yum package.
yum -y install http://download.zfsonlinux.org/epel/zfs-release.el7_9.noarch.rpm
2, 更新zfs的 zfs.repo. (/etc/yum.repo.d/zfs.repo)
我们安装zfs时不建议选用dkms模式,因为此种模式对kernal依赖,意味着kernel变更需要对zfs进行再次编译安装,不是很方便的方式。我们选用kmod模式安装。
所以要对zfs.repo 做如下修改,设置zfs-kmod 为enable。
zfs]
name=ZFS on Linux for EL7 - dkms
baseurl=http://download.zfsonlinux.org/epel/7.9/$basearch/
enabled=0
metadata_expire=7d
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-zfsonlinux
[zfs-kmod]
name=ZFS on Linux for EL7 - kmod
baseurl=http://download.zfsonlinux.org/epel/7.9/kmod/$basearch/
enabled=1
metadata_expire=7d
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-zfsonlinux
3, 安装ZFS
yum -y install zfs
4, 安装完成后可确认是否安装成功.
lsmod|grep zfs
[root@zfstest]# lsmod|grep zfs zfs 3986850 8 zunicode 331170 1 zfs zlua 151525 1 zfs zcommon 89551 1 zfs znvpair 94388 2 zfs,zcommon zavl 15167 1 zfs icp 301854 1 zfs spl 104299 5 icp,zfs,zavl,zcommon,znvpair |
如果没有,可以#modprobe zfs
版本查看:
[root@zfstest]# zfs --version zfs-0.8.6-1 zfs-kmod-0.8.6-1 |
5, 继续安装其他所需组件Install nfs (yum install -y nfs-utils) ; systemctl nfs on
6, 安装 firewalld (yum install firewalld); setfirewalld on
7, 修改 'SElinux' 默认配置,设置为disabled
8. 设置'firewall-cmd' 限制允许的客户端IP,或IP段, 并重启服务
firewall-cmd --zone=trusted --add-source=x.x.x.0/24;firewall-cmd --permanent --zone=trusted --add-source=x.x.x.0/24 |
创建存储池:
创建存储池zpool create –o [options] <name of pool> <raid type><disks>
zpool create -o ashift=12 zfspool01 raidz sdc sdd sde sdf sdg sdh #ashift=12 是4k对齐,raidz是ZFS的磁盘raid且允许坏一块盘。 |
#ashift参数在‘man zpool’中有详细描述:
#zfs raid描述:
如果创建具有许多磁盘的 RAID-Z 配置,请考虑将这些磁盘分为多个组。例如,具有 14 个磁盘的 RAID-Z 配置最好分割为两个 7 磁盘组。若 RAID-Z 配置包含的分组中的磁盘数目为一位数 (1-9),则该配置的性能应该更好。
注释:创建存储池有多种磁盘RAID选择,基于需求设置(空间/性能需求)
ZFS中有七种类型RAID:
Disks - 可理解为RAID0 (性能优,安全级别低)
mirror - 标准软件RAID-1镜像。
raidz1/2/3 - 非标准分布式基于奇偶校验的软件RAID级别。
spare - 用于故障盘的自动替换,可在线移除
cache - 用于2级自适应读缓存(L2ARC)的设备。读缓存
log - 一个单独的日志(SLOG),称为“ZFS Intent Log”或ZIL。写缓存
ZFS可随时在线操作存储池的磁盘(添加硬盘,替换硬盘,移除硬盘)
添加磁盘操作:zpool add <poolname> <disk0…diskn>
但并不是所有的磁盘都可以移除的,仅可移除以spare方式添加的磁盘或者以cache方式添加的磁盘。
查看创建后的存储池状态:zpool status
[root@zfstest]# zpool status pool: zfspool01 state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM Zfspool01 ONLINE 0 0 0 sdc ONLINE 0 0 0 sdd ONLINE 0 0 0 sde ONLINE 0 0 0 errors: No known data errors |
创建zfs文件系统:zfs create
[root@zfstest]# zfs create zfspool01/projects |
1,开启压缩功能,ACL允许,配额设置:
[root@zfs]# zfs set compression=on zfspool01/projects [root@zfs]# zfs set acltype=posixacl xattr=sa zfspool01/projects [root@zfs]# zfs set quota=2T zfspool01/projects |
亦可以对zfs文件系统属性做其他调整,如果创建存储池时未设置。
比如修改属性 - 关闭文件系统的访问时间修改
# zfs set atime=off zfspool01/projects
# zfs get atime zfspool01/projects
NAME PROPERTY VALUE SOURCE
Zfspool01/projects atime off local
如果对空间使用要求很细化,可以定义单独用户的空间配额加以控制,如果系统已加域或者NIS,可以直接针对用户名操作,如果未加域可以对用户ID操作。相关的属性都可以在监控系统中监控起来,查看用户配额使用情况直接调用zfs get userused zpoolname/zfsfilesystem。
[root@zfs]# zfs set userquota@username=200G zfspool01/projects [root@zfs]# zfs set userquota@userID=200G zfspool01/projects |
2,快照工具及设置https://github.com/virtualguy/zfs-auto-snapshot
我更习惯使用这个自动快照工具,下载后解压make install即可。
如果要修改快照频率可以针对特定文件进行设置:
文件名称zfs-auto-snapshot,
位置在/etc/cron.hourly/;/etc/cron.daily/;/etc/cron.weekly/;/etc/cron.monthly
以hourly为例:设置保留最近6小时的快照,即6份快照,如果不是所有的卷做快照,可以针对目标卷单独设置。
#!/bin/sh # Only call zfs-auto-snapshot if it's available which zfs-auto-snapshot > /dev/null || exit 0 exec zfs-auto-snapshot --quiet --syslog --label=hourly --keep=6 // |
单独某个卷设置快照:
#!/bin/sh # Only call zfs-auto-snapshot if it's available which zfs-auto-snapshot > /dev/null || exit 0 exec zfs-auto-snapshot --quiet --syslog --label=hourly --keep=6 zfspool01/projects |
查看快照文件:zfs list –t snap
手动删除快照: zfs destroy <name of snapshot>
快照文件位置:/< pool>/<zfs>/.zfs
客户端挂载及使用:本篇仅涉及linux的nfs挂载,不包含cifs服务及挂载
1, ZFS文件系统以sharenfs设置分享(不提及sharecifs),仅被允许的客户端才可以挂载
Sharenfs属性设置可参考:
[root@zfstest]#zfs setsharenfs=crossmnt,no_root_squash,rw=$allowed_subnet,rw=$allowedhost,ro=$ReadOnlyClients_subnet_or_individial_host $zfspool/$zfssystem |
2, 客户端挂载,以root或者用有sudo权限的账号操作,如果对性能要求高,对安全要求低,可以使用nfsv3方式挂载,如果对安全控制有更严格要求,就以nfsv4挂载。亦可对读写块的大小进行定义,比如设置参数rsize=65536,wsize=65536。
mount命令
mount $zfs_host_or_IP:/$PoolName/$zfsname/$mountpoind –o rw,vers=4,rsize=65536,wsize=65536
3, 客户端进行nfsv4 ACL设置达到安全需求:
使用命令nfs4_setfacl或者nfs4_editfacl 设置及修改配置,操作对象可以是组,单独用户。
如果zfs系统没有加域或者NIS,acl设置时只能使用UID或者GID完成操作。
另外,如果某用户所在组数量超16组时(上限),会出现permission deny的情况,这种情况下用户不得不用newgrp $primary-working-group来切换主工作组。为了减少用户的操作,管理员可以为超16属组的用户单独在目标目录添加acl记录。
再有,对于又要性能又要安全性。客户端可以用nfsv3方式挂载,仅一台用nfsv4挂载且维护nfsv4的ACL,这样在v3挂载的客户端依然生效。
相关操作命令参考:
命令说明
nfs4_getfacl <filename>查看文件当前的ACL权限。
nfs4_setfacl -a A::GROUP@:W <filename>给GROUP设置写权限。
nfs4_setfacl -a A::1000:W <filename>给用户1000设置写权限。
nfs4_setfacl -a A:g:10001:W <filename>给用户组10001设置写权限。
nfs4_setfacl -e <filename>交互式编辑设置ACL权限。
nfs4_getfacl <filename> > saved_acl.txt
将文件当前的ACL权限保存为一个文本文件。
nfs4_setfacl -S saved_acl.txt <filename>
恢复保存到文本文件里的ACL权限。
nfs4_setfacl -m A::1001:rwaxTNcCy A::1001:rxtcy file1
修改文件file1上的其中一条ACE的权限。
nfs4_getfacl file1 | nfs4_setfacl -S - file2
将文件file1的ACL权限复制到文件file2上。
nfs4_getfacl file1 | grep @ | nfs4_setfacl -S - file1
删除文件file1上所有非保留的ACE。
nfs4_setfacl -R -a A:g:10001:rW dir
对目录树dir下所有文件和目录,增加用户组10001可以读写访问的权限。
find dir -type f -exec sh -c 'for ace in $(nfs4_getfacl \{} | grep "^A.*\:1005\:"); do nfs4_setfacl -x $ace \{}; done' \;
删除目录树dir下所有文件中包含1005的ACE。
nfs4_setfacl -a A:fdg:10001:rW dir1
让用户组10001对目录dir1下新创建的文件和目录有读写权限。
nfs4_setfacl -a A:fg:10001:rx dir1
让用户组10001对目录dir1下新创建的文件有读和执行权限。
附录:维护中出现过的问题
1, 快照无法删除导致空间释放失败
确认目标快照已经不是保持状态:执行过zfs release –rkeep pool/snapshot且使用zfs destroy –r pool/snapshot 无法删除放快照。
临时方案:服务器重启;取消快照计划;数据迁移
NOTE: 重启前再确认一次用‘zfs umount /the_target_volume。如果能成功,重新尝试删除快照。
2, 快照工具未生效,这里指的zfs-auto-snapshot
解决方法:把zfs-auto-snapshot做文件链接到/usr/bin;/usr/sbin
3, 创建存储池时,RAID组磁盘数量的影响
同一个存储池扩展硬盘时,最初的RAID选择及磁盘数量会继承,即新增磁盘要遵行初始时的RAID组磁盘数量。
参考文献
https://docs.oracle.com/cd/E26926_01/html/E25826/zfsover-1.html#scrolltoc
以上是关于ZFS on Centos7的主要内容,如果未能解决你的问题,请参考以下文章