Zoned Storage-应用

ZenFS是RocksDB的文件系统插件,支持Zoned块设备,减少了写入放大并提高了性能。通过将文件分进zones并利用“write lifetime hints”,ZenFS避免了后台垃圾收集,提升了系统吞吐量、尾部延迟和耐用性。ZenFS的内部结构使用libzbd库管理zone,文件分配策略基于extent。文章还介绍了ZenFS的构建、安装、命令行工具及其在基准测试中的表现。

RocksDB with ZenFS

ZenFS介绍

RocksDB 是用于快速存储设备的持久KV存储。 它是使用 Log-Structured Merge-Tree (LSM-tree) 数据结构实现的。 它类似于基于 LSM-tree 的键值引擎实现:值存储在按键递增顺序排序的表中。 表是按顺序写入的,从不修改。 LSM-tree 数据结构的这一基本原理使得支持zoned块设备成为可能。

RocksDB 的存储插件架构使得适应不同的存储后端成为可能。 更重要的是,ZenFS 实现了对 zoned 块设备的支持并集成到 RocksDB 中。

ZenFSRocksDB 的文件系统插件,它使用 RocksDB FileSystem [sic] 接口将文件放置到原始zoned块设备上的zones中。 通过将 files 分进 zones 并利用 **“write lifetime hints”(WLTH)**来共同定位相似生命周期的数据,与传统块设备上的常规文件系统相比,ZenFS 可以减少系统写入放大ZenFS 确保文件系统或设备上没有后台垃圾收集,从而提高了吞吐量、尾部延迟和耐用性方面的性能

ZenFS 可以使用 extent 分配策略 将多个文件存储在单个zone中。 一个文件可以由一个或多个 extents 组成,所有extents 构成的文件可以存储在设备的同一zone(或不同zones)中。 一个extent从不跨越多个zones。 当区域中的所有file extents都无效时,可以重置该zone,然后重新使用以存储新的file extents。(一个文件由于1个或多个extents组成,该文件可以存储在1个和多个zones中,1个extent不可以出现在多个zones中)

ZenFS 根据 RocksDB 库提供的**“write lifetime hints”(WLTH)** 将file extents 放置到zones中。 当 WLTH 相似时,ZenFS 总是尝试将file extents 放在相同的 zone 中。

在 ZenFS 中,数据垃圾收集仅由 RocksDB 在启动 LSM-tree 表压缩过程时执行。 ZenFS 不执行垃圾回收,ZNS 设备控制器也不执行垃圾回收。(ZenFS和ZNS SSD 控制器 本身都不提供GC机制。垃圾回收是由于KV Compaction执行的)

注意 ZNS: Avoiding the Block Interface Tax for Flash-based SSDs USENIX ATC 2021 文章中提供了更多信息。

ZenFS 内部结构

  • 架构概述
    在这里插入图片描述
    ZenFS 实现了 FileSystem的 API,并将所有数据文件存储到原始分区块设备上。 LOG和LOCK文件存储在可配置目录下的默认文件系统中。 区域管理通过 libzbd 完成,ZenFS io 通过正常的 pread/pwrite 调用完成。

  • 文件系统实现
    文件被映射到一组extents中:

    • Extents是块设备上的块对齐的连续区域
    • Extents不跨越zones
    • 一个zone可能包含多个extents
    • 来自不同文件的extent可能共享zones
  • 数据回收
    ZenFS 在当前的实现状态下异常懒惰,并且不进行任何垃圾收集。 随着文件被删除,已用容量zone计数器会下降,当它达到零时,可以重置和重复使用zone。

  • 元数据
    元数据存储在块设备的第一个zone的rolling log中。

    每个有效的元数据区包含:

    • 具有当前序列号和全局文件系统元数据的超级块
    • 文件系统中所有文件的至少一个快照
    • 增量文件系统更新(新文件、新扩展区、删除、重命名等)

Getting Started

Prerequisites

ZenFS 需要 Linux 内核版本 5.9 或更高版本。 使用的内核必须配置为zoned block device support enabled.

ZenFS 使用 libzbd 库。 在构建和安装 ZenFS 之前,必须编译和安装此库的最新版本。

构建和安装 ZenFS

ZenFS 嵌入到 RocksDB 中。 它可以作为 RocksDB 中的子模块使用,并且必须在编译 RocksDB 时显式启用。

ZenFS 项目 README 文件中维护了解释如何使用 ZenFS 编译和安装 RocksDB 的说明。

注意 请记住将块设备 IO 调度程序设置为“deadline”,以防止写入操作被重新排序。 这可以在系统引导时自动完成。

ZenFS 命令

ZenFS 提供了一个名为 zenfs 的命令行实用程序。 此实用程序用于格式化zoned设备以创建新文件系统、列出文件以及备份和恢复文件系统。

  • 创建 ZenFS 文件系统
    要创建或格式化分区块设备(例如,NVMe ZNS 设备 /dev/nvme0n1),请使用以下命令:

    zenfs mkfs --zbd=nvme0n1 --aux_path=/tmp/zone-aux --force
    
    # Output example
    ZenFS file system creat
### F2FS 文件系统适用场景分析 F2FS(Flash-Friendly File System)是一种专为闪存存储介质优化的文件系统,尤其适用于固态硬盘(SSD)和其他基于 NAND 的存储设备。以下是关于 F2FS 文件系统适合的应用场景及其使用案例的具体说明: #### 1. **移动设备** F2FS 是 Android 系统默认支持的一种文件系统,特别针对智能手机和平板电脑等移动设备进行了优化。这些设备通常依赖于 eMMC 或 UFS 存储技术,而 F2FS 可以有效降低写入放大效应并提高随机 I/O 性能[^2]。 #### 2. **嵌入式系统** 对于资源受限的嵌入式系统,F2FS 提供了一种轻量级解决方案。由于其高效的垃圾回收机制和对小文件的支持能力,它可以很好地满足物联网设备或其他小型计算平台的需求[^4]。 #### 3. **数据库应用** 许多现代数据库工作负载涉及大量的随机读/写操作,而这正是 F2FS 所擅长之处。通过减少延迟以及改善 SSD 寿命管理,F2FS 成为了某些关系型或 NoSQL 数据库的理想选择之一[^2]。 #### 4. **多媒体处理环境** 尽管在连续大文件读取方面可能不如 EXT4 表现突出,但在需要频繁创建、删除临时媒体片段或者执行剪辑任务时,F2FS 展现出的优势使其成为视频编辑软件等领域内的潜在选项[^1]。 #### 5. **Zone Namespace (ZNS) SSDs 支持** 随着 Zoned Storage 技术的发展,特别是 Zone Namespaces (ZNS),F2FS 已经调整了自己的逻辑框架来更好地适配这类新型硬件架构下的约束条件——即强制顺序写入规则[LFS模式][^3]。因此,在未来可能会看到更多采用 ZNS SSD 的服务器集群选用 F2FS 来作为它们的主要文件系统方案。 ```python # 示例代码展示如何查看当前Linux系统所支持的所有文件系统类型 with open('/proc/filesystems', 'r') as f: filesystems = f.readlines() print([fs.strip().split('\t')[1] for fs in filesystems]) ``` 以上 Python 脚本可以帮助开发者快速确认目标机器是否启用了对 F2FS 的原生支持功能。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值