为了提高项目的整体性,需要一个整体的架构。
[toc]
┌─────────┐ ┌───────┐
│ RocksDB │ │ App │
└────────┬┘ └┬──────┘
FS/POSIX│ │VFS/FUSE
┌─AquaFS────┼───┼──────────┬──────┐
│ │ │ │Turner│
│ ┌─────┴───┴────────┐ ├──────┴─────┐
│ │ Data Router │ │Configurator│
│ └──┬──────────────┬┘ └──────┬─────┘
│ SST │ │ Data │
│ ┌──────┴───┐ inode ┌──┴───────┐ │
│ │ AquaZFS │◄──────┤ ExtFS │ │
│ └──┬───────┘ └───┬──────┘ │
│ │RAID Extent│ │
│ │ ┌───────────────┤Data │
│ ┌──┼───┼───────────────┼──────┐ │
│ │ │ │Zones Allocator│ │ │
│ ├──▼───▼───────────────▼──────┤ │
│ │ io_uring/xNVME │ │
│ ├──────────────┬──────────────┤ │
│ │ Seq Zones │ Conv Zones │ │
└─┴──────────────┴──────────────┴─┘
- App:文件系统请求负载
- RocksDB:数据库请求
- Data Router:
FileSystem
请求路由器,需要判断当前请求是否适合 WAL 优化 - Turner:动态调整运行过程中的参数
- Configurator:静态调整文件系统参数,建立文件系统时给出建议参数
- AquaZFS:经过修改和优化的 ZenFS,支持 RAID 等功能
- ExtFS:有 inode 系统的运行于 Seq/Conv Zones 上的通用文件系统
- 对普通请求,直接使用 Conv Zones
- 对 AquaZFS 的新文件,提供 inode 索引等读写优化
- 对较大的冷数据文件,分配到 Seq Zones
- 将一些可以异地更新的数据以
AquaFS::Extent
形式写入 AquaZFS
- Zones Allocator:为 AquaZFS、ExtFS 提供 Zone 分配服务
- Zones:
- Seq Zones:只能顺序写的 Zones
- Conv Zones:可以随机写的 Zones
- AquaFS:整体文件系统
RocksDB 使用 AquaFS,可以走两种数据通路:FileSystem
和 POSIX
接口。
RocksDB 使用 FileSystem
接口使用 AquaFS
将 AquaFS 编译为 RocksDB 插件,Data Router 使用 FileSystem
接口。
Data Router 主要转发 SST 请求到 AquaZFS,其他请求转发到 ExtFS,并对特殊情况做二者的负载均衡。
RocksDB 使用 POSIX
接口使用 AquaFS
AquaFS 的 Data Router 通过 Kernel Module 或 FUSE 提供 POSIX
访问接口,并智能判断数据负载位置。
由于假定 App 并未实现 FileSystem
接口,所以 App 数据可以通过 Kernel Module / FUSE 方式经过 Data Router 到下层。
AquaFS 中调参模块主要有两个部分:Configurator、Turner。
Configurator 在文件系统创建前评估当前系统更适合的固定参数,并结合需求给出合适的参数选择和预估的性能区间。
Turner 在文件系统使用过程中保持运行,根据系统当前状态动态调整可改变的参数,以获得更加灵活良好的整体表现。
可调参数
- 固定参数
- 块大小
- 固定 RAID 参数
- 数据后端类型
- GC
- GC 容量阈值
- GC 间隔时间
- 动态 RAID
- 分配时间(GC)
- 分配参数(0/1/5...)
- 文件请求分类
- 分类为 SST、普通数据
- 分类冷热文件/数据
- IO 加速方式:io_uring/xNVME
ExtFS 是主要运行于 Conv Zones 上的针对 ZNS 优化的文件系统。主要特性:
- 必须原地更新的数据放在 Conv Zones 内,如 Superblock 等(?
- 适合异地更新的数据通过 AquaZFS 保存在 Seq Zones 内,如 MetaData(?
- 如果智能检测到 AuqaZFS 内部分数据不适合 Seq Zones 存储,则转发到 ExtFS 内处理
- 用冗余的 inode 等为 AquaZFS 提供索引,可以动态降低其内存消耗
AquaZFS 是基于 ZenFS 的优化修改,支持以上特性,在保存高性能的同时提升文件系统的灵活性。
在 AquaZFS 从写盘前到实际写盘之间,存在一层 RAID 逻辑。
- 可灵活配置为:静态固定参数 RAID、动态分区 RAID
- 可以在用户态驱动 NVME,或者内核态使用 liburing 进行 IO 加速,充分利用多盘优势提升性能
- 利用 Turner 提供的建议,在 AquaZFS 垃圾回收时或合并 Extent 时调整 RAID 逻辑,使文件系统在安全性、性能上有更好的权衡点
为 AquaZFS 和 ExtFS 提供统一的 Zones 分配服务。
- 让整盘空间得到更加充分的利用,减少由于分开两种子系统造成的空间碎片
- 根据历史数据,测算不同 Zones 的寿命和速度,来控制 Zones 的分配逻辑,延长磁盘寿命,提高磁盘吞吐
在 AquaFS 向上提供 FileSystem
接口时,由于负载程序对 FileSystem
接口做了适配,所以可以让负载程序和整个 AquaFS 都跑在用户态。
当 AquaFS 整个运行在用户态,可以使用 xNVME 用户态 NVME 协议驱动,降低内核态用户态切换的性能损失,同时也可用 io_uring 加速。
若 AquaFS 使用 POSIX 接口,可以使用 VFS 或者 FUSE 接口,此时也可以用 xNVME 或者 io_uring 进行 IO 加速。
这个架构的「智能」体现在哪?
- 相比与 ZenFS,灵活性更强
- 适配没有针对优化的工作负载,智能识别适合 WAL 的数据,用更合适的方式处理
- 可调整的静态、动态参数更多
- 提供 RAID 功能,并可以动态分配
- 数据安全性更强:RAID 功能
- 智能分配请求
- 在 Data Router 层合理分配 SST、普通数据请求
- 在当前请求不适合 AquaZFS 的时候将 ExtFS 作为后备
- 进行读写请求分离
RocksDB + FileSystem
+ Turner + AquaZFS + RAID