×

ZFS

hqy hqy 发表于2024-12-02 15:13:23 浏览13 评论0

抢沙发发表评论

挖坑zfs。。

mpty-paragraph" style="margin-top: -0.8em; margin-bottom: -0.8em; color: rgb(25, 27, 31); font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif; font-size: medium; text-wrap: wrap; background-color: rgb(255, 255, 255);">

ZFS是一个高度集成的文件系统,它结合了文件系统和卷管理的功能。ZFS采用了分层的架构设计,每层都负责不同的功能。下面是ZFS层级架构中各个模块的功能和实现机制:

  1. Interface Layer

    1. ZPL

      1. ZPL是ZFS对POSIX文件系统接口的实现,它提供了标准的文件系统操作接口,如打开、读取、写入和关闭文件。ZPL处理文件和目录的创建、权限检查、属性管理等。

    2. ZVOL

      1. ZVOL是ZFS的块设备接口,允许ZFS存储池提供类似于传统卷的设备。这些虚拟卷可以被用作原始块存储,例如用于创建虚拟机磁盘或其他数据库文件。

    3. /dev/zfs

      1. 这是ZFS的设备接口,用于管理和配置ZFS的各种功能,包括创建和销毁池、文件系统、设置属性等。这通常通过ZFS的命令行工具来访问和操作。

  2. Transactional Object Layer

    1. ZIL

      1. ZIL是ZFS的WAL日志,用于快速恢复同步写入操作。在发生系统崩溃时,ZIL确保可以恢复或重放那些在崩溃时未完成的事务。

    2. ZAP

      1. ZAP是ZFS中用于管理目录和文件属性(如名称和权限)的模块。它支持小型和大型目录结构,优化了查找和存储效率。

    3. DMU

      1. DMU是ZFS的核心,负责所有的数据组织、事务处理和读写操作。它管理数据块、快照、克隆和其他高级数据结构。

    4. DSL

      1. DSL管理文件系统、快照和卷的层级和关系。它负责处理数据集的创建、删除和管理。

  3. Pooled Storage Layer

    1. ARC

      1. ARC是ZFS的主内存缓存,用于存储最频繁访问的数据和元数据。它使用一种自适应的替换算法来优化缓存的命中率。

    2. ZIO

      1. ZIO是ZFS的I/O管道,负责数据的读取和写入。它支持I/O调度、优先级和错误处理等功能。

    3. VDEV

      1. VDEV是ZFS存储池中的基本存储单元,可以是单个硬盘、镜像组、RAIDZ组或其他复杂结构。VDEV处理物理存储设备的管理和数据的实际存储。

数据路径

在ZFS中,数据的写入和管理涉及几个不同的层次,这些层次组织起来形成了不同的数据路径。

  1. ZPL->DMU->ARC->ZIO->VDEV主要对应的是文件系统的正常读写操作,对于写来说,这条路径主要是异步写

    1. 虽然异步写操作本身不直接记录到ZIL,但与这些异步操作相关的文件系统结构变更(如创建新文件时的元数据更新)需要同步保证,因此会被写入ZIL。

  2. ZPL->ZIL->ZIO->VDEV 同步写路径

  3. ZPL->ZAP->DMU->ARC->ZIO->VDEV 主要用于处理文件系统元数据操作

关于异步写和同步写,跟Ext4的journal策略是类似的,就是区分是只保证元数据一致性,还是保证元数据+数据的一致性。具体来说,当系统崩溃时,通过ZIL重放确实可以确保元数据的一致性,因为所有影响文件系统结构的操作(如创建、删除文件或目录)都会同步记录到ZIL中。这意味着在系统恢复后,文件系统的结构(比如文件的存在、大小、权限等)将与崩溃前保持一致。然而,对于异步写的用户数据而言,情况就有所不同。由于这些数据可能没有即时写入磁盘(而是被缓存在如ARC之类的缓存中),并且由于这些写入操作不直接记录到ZIL中,所以如果在数据实际落盘前系统发生崩溃,这些数据可能会丢失。

这是异步写和同步写在数据安全性方面的一个主要差异:

  • 同步写:确保数据和元数据的即时写入,提供更高级别的数据一致性和安全性,适用于数据库和其他要求高数据一致性的应用。

  • 异步写:提高了写操作的性能,但牺牲了一定的数据即时性。适用于对性能要求较高且可以容忍短时间内数据不一致的场景。

为了缓解这个问题,ZFS提供了几种机制:

  1. 快照和复制:定期创建文件系统的快照和副本可以帮助保护数据,即使发生了数据丢失。

  2. 调整同步策略:对于需要较高数据安全性的文件系统或数据集,可以通过更改其属性来要求更多的操作使用同步写入,从而减少数据丢失的风险。

  3. 使用日志设备:向ZFS池添加专用的日志设备(比如SSD作为ZIL设备)可以加快同步写的处理速度,这可以在一定程度上缩小性能和数据安全性之间的差距。


ZAP

【todo】


DMU

【todo】

基本概念:

  1. object

  2. objectset

  3. dataset


DMU实现 object级别的cow语义


ZPL

【todo】ZPL 中 znode (ZPL 扩展的 dnode) 保存文件属性的机制成为了一个小的子系统ZFSSystemAttributes,支持灵活的属性布局。

实现这一点的一种方法是某种标记存储,其中dnode中的每个属性实际上都是一个键/值对。然而,这将需要所有这些密钥的空间,所以ZFS更聪明。ZFS观察到,在实践中,只有相对少量的不同属性集一起存储在dnode中,因此它只对数据集中使用的每个不同属性布局进行编号,然后dnode只存储布局编号和属性值(按其定义的顺序)。据我从代码中所知,您不必预先注册所有这些属性布局。相反,代码只是在内存中的dnode上设置属性,然后当需要以磁盘格式写出dnode时,ZFS会检查属性集是否与已知布局匹配,或者是否需要设置和注册新的属性布局。


事务

[todo]

log怎么写?


资料

  1. OpenZFS

    1. openzfs.org/wiki/Develo

  2. 书籍

    1. FreeBSD Mastery Advanced ZFS (IT Mastery Book 9) (Lucas Michael W., Jude Allan.) (Z-Library)

    2. pages.cs.wisc.edu/~remz

    3. zfs internals yupu zhang ppt slideplayer.com/slide/1

    4. github.com/httaotao/fil 文中有ZFS的解读

  3. 论文

    1. The Zettabyte File System

    2. ZFS On-Disk Specification

    3. Unioning of the Buffer Cache and Journaling Layers with Non-volatile Memory

    4. Low-Latency Synchronous IO For OpenZFS Using Persistent Memory

    5. Defragmentation Mechanisms for Copy-on-Write File-systems

  4. ZFS 分层架构设计

  5. Btrfs vs ZFS 实现 snapshot 的差异

  6. LFS Log-structured File System

LFS的log布局是数据块先于元数据块,为什么呢?

一个完整的写操作可能包括多个数据块和相应的元数据更新。通过先写入所有数据块,然后写入描述这些数据的元数据块,可以在某种程度上保证操作的原子性:要么全部写入成功,要么在失败时通过日志恢复到一致状态。这个log主要是写单机,如果是写基于raft的存储,我理解就直接元数据块先于数据库就ok了,还更方便。


打赏

本文链接:https://www.kinber.cn/post/3985.html 转载需授权!

分享到:


推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

 您阅读本篇文章共花了: 

群贤毕至

访客