整体架构

为了提高项目的整体性,需要一个整体的架构。

[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   │ │
└─┴──────────────┴──────────────┴─┘
  1. App:文件系统请求负载
  2. RocksDB:数据库请求
  3. Data Router: FileSystem 请求路由器,需要判断当前请求是否适合 WAL 优化
  4. Turner:动态调整运行过程中的参数
  5. Configurator:静态调整文件系统参数,建立文件系统时给出建议参数
  6. AquaZFS:经过修改和优化的 ZenFS,支持 RAID 等功能
  7. ExtFS:有 inode 系统的运行于 Seq/Conv Zones 上的通用文件系统
    1. 对普通请求,直接使用 Conv Zones
    2. 对 AquaZFS 的新文件,提供 inode 索引等读写优化
    3. 对较大的冷数据文件,分配到 Seq Zones
    4. 将一些可以异地更新的数据以 AquaFS::Extent 形式写入 AquaZFS
  8. Zones Allocator:为 AquaZFS、ExtFS 提供 Zone 分配服务
  9. Zones:
    1. Seq Zones:只能顺序写的 Zones
    2. Conv Zones:可以随机写的 Zones
  10. AquaFS:整体文件系统

细节

RocksDB 使用 AquaFS

RocksDB 使用 AquaFS,可以走两种数据通路:FileSystemPOSIX 接口。

RocksDB 使用 FileSystem 接口使用 AquaFS

将 AquaFS 编译为 RocksDB 插件,Data Router 使用 FileSystem 接口。

Data Router 主要转发 SST 请求到 AquaZFS,其他请求转发到 ExtFS,并对特殊情况做二者的负载均衡。

RocksDB 使用 POSIX 接口使用 AquaFS

AquaFS 的 Data Router 通过 Kernel Module 或 FUSE 提供 POSIX 访问接口,并智能判断数据负载位置。

App 使用 AquaFS

由于假定 App 并未实现 FileSystem 接口,所以 App 数据可以通过 Kernel Module / FUSE 方式经过 Data Router 到下层。

调参模块

AquaFS 中调参模块主要有两个部分:Configurator、Turner。

Configurator 在文件系统创建前评估当前系统更适合的固定参数,并结合需求给出合适的参数选择和预估的性能区间。

Turner 在文件系统使用过程中保持运行,根据系统当前状态动态调整可改变的参数,以获得更加灵活良好的整体表现。

可调参数

  1. 固定参数
    1. 块大小
    2. 固定 RAID 参数
    3. 数据后端类型
  2. GC
    1. GC 容量阈值
    2. GC 间隔时间
  3. 动态 RAID
    1. 分配时间(GC)
    2. 分配参数(0/1/5...)
  4. 文件请求分类
    1. 分类为 SST、普通数据
    2. 分类冷热文件/数据
  5. IO 加速方式:io_uring/xNVME

AquaZFS 和 ExtFS

ExtFS 是主要运行于 Conv Zones 上的针对 ZNS 优化的文件系统。主要特性:

  1. 必须原地更新的数据放在 Conv Zones 内,如 Superblock 等(?
  2. 适合异地更新的数据通过 AquaZFS 保存在 Seq Zones 内,如 MetaData(?
  3. 如果智能检测到 AuqaZFS 内部分数据不适合 Seq Zones 存储,则转发到 ExtFS 内处理
  4. 用冗余的 inode 等为 AquaZFS 提供索引,可以动态降低其内存消耗

AquaZFS 是基于 ZenFS 的优化修改,支持以上特性,在保存高性能的同时提升文件系统的灵活性。

RAID

在 AquaZFS 从写盘前到实际写盘之间,存在一层 RAID 逻辑。

  1. 可灵活配置为:静态固定参数 RAID、动态分区 RAID
  2. 可以在用户态驱动 NVME,或者内核态使用 liburing 进行 IO 加速,充分利用多盘优势提升性能
  3. 利用 Turner 提供的建议,在 AquaZFS 垃圾回收时或合并 Extent 时调整 RAID 逻辑,使文件系统在安全性、性能上有更好的权衡点

Zones Allocator

为 AquaZFS 和 ExtFS 提供统一的 Zones 分配服务。

  1. 让整盘空间得到更加充分的利用,减少由于分开两种子系统造成的空间碎片
  2. 根据历史数据,测算不同 Zones 的寿命和速度,来控制 Zones 的分配逻辑,延长磁盘寿命,提高磁盘吞吐

IO 加速

在 AquaFS 向上提供 FileSystem 接口时,由于负载程序对 FileSystem 接口做了适配,所以可以让负载程序和整个 AquaFS 都跑在用户态。

当 AquaFS 整个运行在用户态,可以使用 xNVME 用户态 NVME 协议驱动,降低内核态用户态切换的性能损失,同时也可用 io_uring 加速。

若 AquaFS 使用 POSIX 接口,可以使用 VFS 或者 FUSE 接口,此时也可以用 xNVME 或者 io_uring 进行 IO 加速。

智能化

这个架构的「智能」体现在哪?

  1. 相比与 ZenFS,灵活性更强
    1. 适配没有针对优化的工作负载,智能识别适合 WAL 的数据,用更合适的方式处理
    2. 可调整的静态、动态参数更多
    3. 提供 RAID 功能,并可以动态分配
  2. 数据安全性更强:RAID 功能
  3. 智能分配请求
    1. 在 Data Router 层合理分配 SST、普通数据请求
    2. 在当前请求不适合 AquaZFS 的时候将 ExtFS 作为后备
    3. 进行读写请求分离

初赛目标

RocksDB + FileSystem + Turner + AquaZFS + RAID