Version 0.1 · based on KyteStore dev 995f5093

KyteStore 技术白皮书

KyteStore 是面向湖仓系统和 AI 训推场景的透明加速存储底座。它在统一的 ChunkServer 数据层之上提供 S3 兼容对象协议和 POSIX 文件语义,让用户可以在不重写业务系统的前提下,把热数据留在本地高速介质,把远端 S3/COS/OSS 作为容量层和回源层。

本文档面向 KyteStore 用户、架构师和平台运维人员,重点解释系统架构、读写路径、元数据模型、API 边界和部署运维方式。部分 FSSubsystem 能力仍处于演进阶段,文中会明确区分已落地能力和设计方向。
Overview

1. 概览

解决的问题

湖仓引擎、分析数据库、AI 训练任务和推理服务经常同时访问远端对象存储。直接访问 S3/COS/OSS 的优势是容量弹性和低运维成本,但在高频小对象、热数据反复读取、checkpoint 写入、数据集扫描等场景中,远端访问会带来延迟、带宽成本和吞吐抖动。

KyteStore 在业务系统和远端对象存储之间增加一层本地分布式加速层。用户仍然使用熟悉的 S3 Endpoint 或文件路径,底层由 KyteStore 负责路由、本地缓存、写缓冲、多副本保护、异步回刷和故障恢复。

KyteStore ecosystem
湖仓系统通过 S3 兼容协议接入,AI 系统通过 POSIX 兼容文件语义接入,二者共享统一 ChunkServer 底座。

典型场景

湖仓查询加速

ClickHouse、Doris、DuckDB、StarRocks 等系统可以把 KyteStore 当作 S3 Endpoint,降低热点对象读取延迟,并减少远端对象存储带宽消耗。

AI 数据集访问

训练和推理任务可以通过 POSIX/FUSE 语义读取数据集、模型文件和中间结果,让已有脚本保留路径访问方式。

写入与 checkpoint

高频写入先落到本地 Write Buffer,用户可以写后即读,后台再异步同步到远端对象存储。

能力地图

能力 用户价值 核心机制
S3 兼容对象访问 替换远端对象存储 Endpoint,不改变湖仓和分析系统接入方式。 FE S3GatewayService + KyteS3SDK + DS S3SubSystem。
POSIX 文件语义 让 AI 程序通过路径、目录、文件句柄和 rename 语义访问存储。 PosixGatewayService + DS FSSubsystem 元数据分片。
本地读缓存 把热点对象切片落到本地 SSD,降低重复读取延迟。 Read Cache Namespace、LocalMetaKV、ChunkSubSystem。
写缓冲加速 写入先提交到本地多副本,后台异步刷回 S3,支持写后即读。 Write Buffer Namespace、ObjectMetaIndex、BufferedObjectSyncManager。
多副本和高可用 写入数据不依赖单个节点,异常时可恢复和迁移。 Chunk 多副本、Primary/Secondary 写入复制、Slot Recovery。

部署和使用

KyteStore 可以从单机模拟集群开始验证,也可以按 FE、DataServer、MetaServer、FoundationDB 控制面和本地 SSD 资源拆分为生产集群。用户侧接入时不需要改写业务逻辑:湖仓和分析系统继续使用 S3 Endpoint,AI 训练和推理任务继续使用文件路径,底层由 KyteStore 负责本地 SSD 加速、多副本保护和远端 S3 同步。

单机部署配置建议

单机部署适合 PoC、功能验证、开发测试和小规模低并发使用。此模式通常把 FE、DS、MS 和 FDB 放在同一台服务器上,部署简单,但不建议作为高可用生产架构。

档位 CPU 内存 SSD 网络 适用场景
最低配置 8 vCPU 32 GiB 500 GB SSD 1 Gbps 功能验证、开发测试、低并发 PoC。
推荐配置 16 vCPU 64 GiB 1 TB NVMe 10 Gbps 小规模正式使用、稳定读写加速。
性能配置 32 vCPU 128 GiB 2-4 TB NVMe 25 Gbps 更高并发、较大缓存、持续写入场景。

集群部署配置建议

生产环境建议把数据面和控制面分开规划。FE 负责 S3/文件协议入口和请求路由,DS 负责本地缓存、写缓冲、ChunkServer 多副本和文件元数据热路径,MS/FDB 负责集群控制面和全局元数据。

档位 典型拓扑 FE 节点规格 DS 节点规格 网络
最低配置 1 FE + 2 DS + 1 控制面 4 vCPU / 8 GiB / 100 GB SSD 8 vCPU / 32 GiB / 1 TB SSD 10 Gbps
推荐配置 2 FE + 3 DS + 3 控制面 8 vCPU / 16 GiB / 100 GB SSD 16 vCPU / 64 GiB / 2 TB NVMe 10-25 Gbps
性能配置 2-4 FE + 6+ DS + 3 控制面 16 vCPU / 32 GiB / 200 GB SSD 32 vCPU / 128 GiB / 4+ TB NVMe 25 Gbps+

对象和文件接入方式

接入方式 用户侧改动 推荐模式 关键说明
S3 兼容对象协议 把湖仓、查询引擎或 S3 SDK 的 Endpoint 指向 KyteStore FE。 read_cache 或 read_write / mixed。 适合 ClickHouse、Doris、DuckDB、StarRocks 等系统读取热对象,也适合写入后需要快速读回的 checkpoint 或中间结果。
POSIX 文件语义 通过 POSIX/FUSE 入口挂载到业务机器,应用继续使用路径、目录和文件 API。 local_only 或 mixed。 适合 AI 训练、推理、脚本任务和小文件元数据密集场景;文件数据仍复用底层 ChunkServer 写入和缓存能力。
远端 S3 数据层 配置后端 S3/COS/OSS bucket 和凭证,或通过请求级 Header 传入后端身份。 mixed。 本地 SSD 承担热数据和写缓冲,远端对象存储承担容量层和长期存储,适合成本敏感业务。
  • DS 是资源消耗最大的角色,CPU、内存和本地 NVMe 性能会直接影响缓存命中、写缓冲和文件元数据吞吐。
  • 控制面建议至少准备 3 个 FDB coordinator;MS 可以与其中一台控制面节点同机部署。
  • 写入加速场景优先增加 DS 数量和本地盘容量;接入和转发压力更高时再增加 FE 节点。
Architecture

2. 整体架构

KyteStore architecture
KyteStore 由 FE 接入层、MetaServer 控制面、DataServer 数据面和远端对象存储后端组成。

ChunkServer

在大规模分布式存储系统中,ChunkServer 通常承担统一数据底座的角色:上层系统维护对象、文件、目录或表分片的元数据,底层 ChunkServer 负责把真实数据追加写入较大的连续数据单元,并处理本地磁盘布局、副本复制、seal、repair 和容量回收。这样做的价值是把协议语义和物理数据管理解耦,上层可以快速演进,底层则稳定优化吞吐、延迟和可靠性。

业内很多系统都有类似分层。以 ByteStore、Azure Storage 这类架构为例,上层负责对象索引、分区路由或 namespace 管理,底层存储层把数据聚合为 chunk / extent 一类的复制单元;Azure Storage 公开论文中的 Stream Layer 使用 Stream Manager 与 Extent Node 管理 extent,extent 是复制、seal 与后台修复的重要单位。KyteStore 借鉴的是这种“上层语义轻量化、底层数据单元统一化”的工程思路,而不是为每一种协议重复实现一套存储引擎。

小对象与小文件聚合

KyteStore 不把每个小对象或小文件直接映射成独立磁盘文件,而是把对象 part、文件 extent 或缓存 slice append 到 Chunk 中。上层元数据记录 key / inode 到 chunk_id、offset、length 的映射,本地盘看到的是更大、更顺序的写入单元。

多副本转发

MetaServer 为 Chunk 选择 Primary 和 Secondary 副本。前台写入先进入 Primary,Primary 在本地 append 后按同一 offset 转发给 Secondary;ChunkInfo 记录 server_ids 和目标副本数,repair worker 后续补齐缺失副本。

这也是 KyteStore 支持多协议的关键。S3 Subsystem、FS Subsystem 以及后续 HDFS/NFS/SDK 接入层只需要处理各自的命名空间、权限、元数据和语义差异;真正的数据写入、读缓存、写缓存、多副本、seal、repair、GC 和冷热分离都复用同一套 ChunkServer。新的上层系统接入时,不需要重新设计底层可靠写入和本地盘管理,只需要把自身语义映射到统一的 chunk 数据模型。

核心角色

角色 职责 用户侧影响
FE S3 HTTP 网关、未来 POSIX/FUSE 网关、启动 readiness、请求路由入口。 提供稳定 Endpoint,屏蔽 DS 拓扑变化。
MetaServer 持久化全局元数据,管理 DataServer、ChunkGroup、S3 Namespace、Slot Topology 和 FS owner epoch。 提供一致的控制面,不进入普通对象读写热路径。
DataServer 实际数据读写、对象读缓存、写缓冲、文件元数据服务、本地 Chunk 管理。 承载吞吐和延迟,随着节点数横向扩展。
Remote S3 容量层、回源层和最终对象存储后端。 保留云对象存储的容量弹性和跨系统可访问性。

存储模式

read_cache KyteStore 作为 read-through cache,GET miss 回源 S3 并填充本地缓存;PUT/DELETE 可走远端直写语义。
read_write / mixed 读使用 read-cache,写进入 write-buffer,本地多副本提交后异步刷回 S3。
local_only 不访问远端 S3,读写都在本地 write-buffer 和 ChunkServer 内完成,适合隔离验证或本地优先场景。
Object Acceleration

3. 对象加速

S3 网关

FE 的 S3GatewayService 提供 Path-style S3 HTTP 入口,解析 HTTP Method、URI、bucket、object key、Range、分页参数和请求级凭证。FE 不再在对象 API 热路径直连后端 S3,而是统一通过 KyteS3SDK 转发到 DS,由 DS 负责 read-through、write-buffer、LIST merge、delete propagation 和 cache invalidation。

后端凭证可以来自 FE 固定配置,也可以通过 x-kyte-s3-* 请求 Header 传入,便于一个 KyteStore Endpoint 代理不同云厂商或不同 bucket 的后端身份。

读缓存路径

读缓存的核心是切片和去重。SDK 将大对象范围读切成多个 slice,按 slot 路由到对应 DS。DS 先查本地 CacheIndex;缓存未命中时通过 CacheLoadTaskShard 避免同一范围被多个请求重复回源。

写加速 Write Buffer

写路径使用独立的 Write Buffer Namespace。PutObject 和 Multipart Upload 的数据先写入 DS 本地 Chunk,并由 ChunkSubSystem 执行多副本同步;对象被 Seal 后立即对后续 GET/HEAD/LIST 可见,后台 S3 sync 再把数据上传到远端对象存储。

S3 API 覆盖

API 状态 说明
GetObject / Range GET 已实现 支持整对象和 Range 读取,显式 offset-range 不要求先 HEAD。
PutObject 已实现 / 持续增强 read_write 与 local_only 写入 Write Buffer;read_cache 模式可代理远端直写。
HeadObject / ListObjectsV2 已实现 合并本地 write-buffer 和远端对象视图,返回对象元信息和分页列表。
DeleteObject / DeleteObjects 已实现 支持 tombstone、read-cache invalidation 和远端删除传播。
Multipart Upload 已实现 / 持续增强 UploadPart 映射为 AppendObject,CompleteMultipartUpload 映射为 SealObject。
File Acceleration

4. 文件加速

POSIX 语义定位

FSSubsystem 面向 AI / 大模型工作负载,不试图在第一阶段覆盖完整通用文件系统语义。优先级最高的是 dataset 读取、checkpoint 顺序写、临时文件 close 后 rename 发布、目录遍历、小文件 metadata 批处理和 close-to-open 可见性。

kyte-fuse 或 FS SDK 运行在客户端机器上;FE 提供 PosixGatewayService,负责鉴权、mount session、拓扑发现和兼容入口;长期高性能路径可以通过 FS SDK 缓存拓扑后直连 DS。

元数据模型

文件元数据不放在 MetaServer/FDB 的普通热路径里。MS/FDB 负责 FS binding、bucket owner map、epoch、checkpoint pointer 和 inode range allocation;dentry、inode attr、extent map 由 DS FSSubsystem 的 inode bucket owner 负责。

逻辑上,目录本身也是一个 inode。目录的可见命名空间由一组 dentry 组成,每条 dentry 的 key 是 <parent_inode, name>,value 指向 child inode。child inode 再保存文件类型、属性、link count、size,以及指向底层 chunk 的 extent map。目录并不直接绑定到某个 DS,而是维护自己的 DirectoryLayout,用来把文件名 hash range 映射到一个或多个 inode buckets。

访问路径分两步:第一步由 bucket_index = hash(parent_inode, filename, seed) % inode_bucket_size 找到目录内的逻辑 bucket_index;第二步由 DirectoryLayout 把 bucket_index 映射到 inode_bucket_id,再通过全局 owner map 找到 DS。create 在命中的 inode bucket 内写入 dentry,并从该 bucket 的 inode range 中分配 child inode。

因此,目录 split 和 DS owner 迁移是两类不同操作:目录 split 调整 DirectoryLayout 中的 hash range 到 inode_bucket_id 映射;故障切换或 rebalance 调整 inode_bucket_id 到 owner DS 的映射。用户看到的路径语义不变,但系统可以独立扩展大目录和迁移故障节点。

这种设计避免每次 create/open/list 都访问 MS/FDB,让 metadata 热路径可以随 DS inode bucket 横向扩展。MS/FDB 仍然作为控制面存在,保证 owner fencing、checkpoint 定位和迁移恢复。

FS API

接口组 代表 RPC 语义
生命周期与探测 Probe 查询 DS FSSubsystem 是否初始化、启动以及当前 FsStorageBinding。
目录与文件元数据 Mkdir, CreateFile, Lookup, GetAttr, Readdir, Unlink, Rmdir 以 inode 和 parent/name 形式操作目录项和 inode 属性。
路径兼容接口 LookupPath, MkdirPath, CreateFilePath, ReaddirPath, UnlinkPath, RmdirPath 提供面向网关和调试的路径级操作,内部仍会落到 inode/bucket 路由。
布局与恢复 GetDirectoryLayout, MaterializeDentryBucket, RecoverInodeBucket 管理目录 bucket、虚拟到物理 bucket 映射和 inode bucket 恢复。
Consistency and HA

5. 一致性与高可用

Slot 映射与拓扑 Fence

S3 Namespace 被划分为固定数量的 slot。SDK 按 object key 计算 slot,并根据 MetaServer 提供的 namespace topology 找到 owner DS。请求携带 slot_id 和 topo_version,DS 用本地缓存的 topology 校验请求是否路由到了正确 owner。

恢复与维护

KyteStore 的恢复机制围绕 owner、manifest、sealed object metadata 和本地 MetaKV 状态构建。DS 可上报 LocalMetaKV 状态,MetaServer 提供 sealed manifest 和 candidate chunk 查询,维护接口支持进入用户 IO 维护模式、查看 slot recovery 状态、诊断对象范围和必要时 force reset failed slot。

可见性语义

场景 语义 实现要点
对象写后即读 PutObject 或 SealObject 成功后,GET/HEAD/LIST 优先读取 write-buffer 当前版本。 ObjectMetaIndex、generation、read-cache invalidation。
对象缓存失效 写入、删除、完成 MPU 改变可见版本后,失效 read-cache 旧切片。 DS 内部 ReadCacheInvalidator,必要时跨 DS 调用 InvalidateObjectCache。
文件 close-to-open 写入对其他客户端的可见点优先定义在 Flush/Fsync/Release 或同目录 Rename 后。 FS metadata WAL、extent commit、rename 原子语义。
API and Operations

6. API 与运维

管理与诊断接口

控制面通过 MetaServer 管理 namespace、slot migration、capacity、usage、manifest recovery 和 route resolve;数据面通过 DS admin service、S3SubSystem admin service 和 FSSubsystem service 暴露健康、使用量、维护、诊断和文件元数据接口。

接口族 代表能力 使用场景
MetaServer S3 Admin Create/List/Delete Namespace、SlotMigrate、ResolveObjectRoute、ListS3NamespaceSpaceUsage 创建加速空间、查看容量、迁移 slot、排查对象路由。
S3SubSystem Admin GetNamespaceUsage、Enter/Leave Maintenance、ListSlotRecoveryStatus、DiagnoseObjectRange 节点级维护、恢复状态检查、对象范围诊断。
ChunkSubSystem Client AllocateChunk、AppendChunk、ReadChunk、SealChunk、RepairChunkReplica 内部数据路径和副本修复,不直接暴露给普通用户。
FSSubsystem Service Lookup、CreateFile、Readdir、GetDirectoryLayout、RecoverInodeBucket 文件语义、目录布局、inode bucket 恢复。

监控指标

KyteStore 使用 brpc metrics 暴露 MS/DS 指标,并提供 Prometheus + Grafana 方案。MetaServer 还提供 namespace 级空间用量查询,用于控制台和运维脚本展示用户视角容量、逻辑占用、副本因子、chunk 摘要和估算边界。

部署形态

KyteStore 单个二进制可以通过 --start_mode=metaserver--start_mode=dataserver 启动不同角色。最小单机模拟集群适合 PoC、功能验证和 benchmark;生产部署建议拆分 MetaServer、DataServer、本地 SSD、FoundationDB 和监控栈。

Performance

7. 性能与调优

对象性能

当前官网首页已经展示对象加速的基础吞吐、基础延迟和 TPCDS 数据。代码侧性能分析进一步显示,64KB GET 的 FE HTTP E2E 延迟可以拆为 FE、SDK、DS local MetaKV、read_chunk 和 response path 等阶段;高并发 PUT 的瓶颈更多受本地盘 64KB direct append 能力影响。

文件性能

文件加速性能将按 metadata 与 data read/write 分开度量。metadata 侧重点包括 Lookup、CreateFile、Readdir、Rename/Unlink 和 inode bucket recovery;data 侧重点包括 dataset 顺序读取、checkpoint 顺序写、close-to-open 可见点和 extent commit。

调优方向

  • 对象读路径关注 slice_length、cache hit ratio、LocalMetaKV 延迟、本地 SSD 读延迟和远端 S3 回源耗时。
  • 对象写路径关注 write-buffer 副本数、本地盘 O_DIRECT append 能力、chunk soft limit、异步 S3 sync backlog。
  • 文件路径关注目录 bucket 数、inode bucket owner 分布、metadata WAL group commit、checkpoint 周期和 list fanout。
  • 集群维度关注 slot owner 均衡、topo_version 收敛、DS 维护窗口、missing replica count 和 namespace capacity 水位线。