ZFS文件系统搭建手册

我喜欢使用zfs作为所有底层系统的文件系统,而且由于zfs支持的文件系统特性是最多的,而且都可以同时开启,比如加密+压缩+去重+快照+自定义记录大小+虚拟磁盘+内存作为缓存+完整的权限管理+任何raid++++,非常符合我的任何想法。当然了,这么多功能的代价是很大的,不用说更高的硬件成本,学习成本、调试难度、操作非常不傻瓜等等

本文会以一个ZFS文件系统管理员与使用者的视角,从设计vdev开始、创建zpool、调整参数、调试性能、dataset、zvol等等,一步步深度剖析一个zfs文件系统的设计、迁移、维护、清洗、重建、摧毁的全过程。

写在前面:一个完整、安全、高速的ZFS文件系统的搭建需要相当的耐心和细心,请仔细理解,多做测试。

一些使用建议:1、关键池,-f或-F参数强制执行,避免使用。2、dedup去重不要开,尽管听着特别诱人,但性能自行测试。使用操作系统级别的软件去重即可。3、池级别的任何操作先做测试再下手,比如先拿一堆文件建立zpool,然后观察命令结果。4、ashift参数所有vdev设备都要保持一致。5、zvol功能谨慎使用,快2025了还有一些bug,会导致整个文件系统无响应。

Vdev篇

    一个zpool由各种vdev组成,vdev则可由几乎任何介质组成,硬盘、固态、内存甚至文件都是可以的。特别的,vdev也可以由阵列组成,如raid0 1,raidz1 2 3,draid1 2 3。硬阵列当然也可以,只是没有zfs基于文件的自愈功能。如果池只有一个设备,其实相当于这一个设备承担所有功能,如日志、元数据(索引)、备份、去重表、读写缓存。而ZFS将这些特别的功能拆分得很清楚,分成不同种类vdev提供服务,让文件系统管理员可以自由设计每个功能所需要的硬件资源。

        data vdev 存储数据。有两功能:存所有池数据;在其他vdev使用满或出故障时顶替上去。如果没有其他vdev,那所有活都给它干。同时只有这种基础数据的vdev支持raid1以上的软raid级别,其他vdev只能raid0或者raid1。硬raid没限制,因为硬raid在操作系统看起来就是一个block设备而已。这种vdev通常就是最主要的存储设备,所有主要的用户数据都存在其中。

                例子:zpool create mypool -o ashift=12 draid:3d:5c:1s sda sdb sdc sdd sde

                                #使用sda b c d e设备创建基于draid1阵列的zpool,有五个设备,三个逻辑数据件,一个逻辑热备件,并指定ashift为4096字节。

                        zpool create mypool -o ashift=12 raidz /1 /2 /3 spare /4

                                #使用根目录下1 2 3 4这几个文件,指定块大小为4k,创建带一个热备件的raidz(类raid5)

                data vdev的具体raid种类和分别会在后文提及或单独开一篇文章。

        cache vdev 读缓存 内部还可以分为两部分:metadata元数据读缓存;userdata用户数据读缓存。其写带宽有限制,而读带宽不限,根据官方说法是限制在8MB/s,非常适合消费级的高速nvme固态使用。因为这类固态短时间写入多了会大幅降速,且写入寿命不高/。metadata缓存则可以加快索引速度。另外cache vdev的别名是L2ARC,即二级访问读缓存,而一级缓存由内存充当,只有在内存的额度满后才会喂给L2ARC。ZFS对于内存的占用主要就是ARC缓存,也是其最大的特点,缓存需要在8G以上,至少2G给它,不然干嘛用ZFS。上不封顶。设置方法如下:

                The maximum size of the ARC can be adjusted either by passing a zfs_arc_max=N parameter to the zfs module (through modprobe), where N is the maximum ARC size in bytes, or on the fly by writing the new maximum size in bytes to /sys/module/zfs/parameters/zfs_arc_max.

                cache vdev国外论坛有很多人不建议使用,理由是内存就是读缓存了。但如果你有一块或者多块nvme固态,那么分一点空间出来组raid0其加速效果也是非常可观的,cache vdev可以随时从池内移除而不损失任何数据。

                        譬如我使用两ZHITAI Tiplus3000 1t作为系统盘,大部分是组raid1做系统盘,两块nvme各分出128G组成256G raid0 给cache,那么理论顺序读取可以达到6GB/s!我使用的内存带宽也就100GB/s,虽说不够快,但一定是接近五十步笑百步的水平了。

        log vdev 同步写缓存 就是一个加速写入里带“direct”标识的请求。一般如zfs日志、写入数据库、虚拟机磁盘写入等重要数据写入默认不使用内存为写缓存,而是直接写入数据vdev,防止意外关机缓存的内容没法从内存立刻写入持久存储。而log则确保如果出现意外关机,同步写的数据不会丢失。使用固态设备还可以有效增加随机写的速度。

                例子:zpool create mypool -o ashift=12 raidz /1 /2 /3 log mirror -o ashift=12 /4 /5

                                #创建池的同时添加4k扇区大小的镜像4 5设备作为log同步写缓存

                           zpool add my pool log mirror -o ashift=12 sda sdb

                                #向现有池mypool添加镜像log vdev,并设置好ashift与其他vdev一致。

                log vdev在较新的zfs中可以丢失而不损坏池本身(会丢失还没写入的数据),可以随时使用zpool remove安全移除。

        special vdev 特殊存储 内部包含几个部分:元数据存储;小文件存储;draid类型阵列的同步记录存储;其他新特性。据说可以充当dedup去重表的功能,还未测试过。至少对于文件表、数据库访问的加速是大大的好

                分配大小应该提前计划好,大约为总容量的0.3%,根据实际生产环境小文件的密集预期上下浮动。我个人服务器56T容量,所以使用128G镜像企业级ssd带一个热备份的special组合。容量不慎满了的话,zfs就不会再写入这个vdev,相当于加速消失。

                因为功能非常多且关键,所以这种vdev一定存在冗余,冗余量一定大于等于数据vdev或其他vdev。

                因为读写非常密集,所以应该使用企业级及以上固态,尤其是写入寿命长的,访问延迟低的。

                例子:zpool add mypool special mirror -o ashift=12 /dev/disk/by-id/xxxx /dev/disk/by-id/xxxx spare /pool2/spare/special

                                #向现有池添加镜像special vdev,并添加一个同样大小的zvol分区作为热备份。

        dedup vdev 去重表 因为已经不推荐使用去重功能,所以不会过分深入介绍。在实际使用中,开启去重功能后,dedup的读写带宽和读写量甚至要大于special vdev 加上log vdev的几倍。需要持久内存级别的设备才能够提供良好的性能和寿命。也就是说,想要舒服顺畅的去重体验,内存需要容量加倍、cpu需要很多负载和电费、需要大量超高速超高寿命持久缓存、总成本需要翻倍。

                不过你也可以试试在机械硬盘上开启dedup的体验,你会发现你的机械盘发出近乎疯狂的读写炒豆子声,然而操作系统却是一点进度都没有……等待读写的体验真是酸爽又刺激

好了,ZFS的四大天王vdev基本介绍完了,后面我再继续剖析zfs的其他方面,如参数调优、加密、快照等等功能吧(如果有人看的话)

洋洋洒洒几千字,ZFS不愧是特别特别复杂的文件系统,我们目前也只说完了很小的部分

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值