拆解小红书存储底座 03|从存得下到读得快:小红书自研对象存储实践
小红书的存储与数据库体系覆盖 MySQL、RedKV、Redis、ROS 等产品,DMS、RedDTS 等公共能力分别提供统一管控和数据传输支持。小红书自研对象存储 ROS(Red Object Storage)服务于多媒体、大数据、索引构建和 AI 训练等多个业务,多媒体在线访问关注可靠性与低时延,大数据与索引构建需要持续高吞吐,AI 训练则要求高并发读取与 Checkpoint 集中写入。
本文介绍 ROS 的整体架构,包括多云统一网关、元数据管理和存储引擎的核心设计,重点说明如何通过 HDD 的内外圈放置、亲和预分配与预读,以及 SSD 的 RDMA 网络、SPDK 用户态 I/O 与 NUMA 亲和,满足不同业务的存储需求。
小红书的多媒体、大数据、索引构建和 AI 训练等业务使用多个云厂商的对象存储服务。随着业务规模增长,不同场景对可靠性、时延和读写带宽提出了更高要求,统一接入、鉴权、流控与监控,以及跨引擎的数据管理需求也日益突出。为此,小红书建设自研对象存储 ROS,在自建与公有云共同承载数据的混合云架构下,统一业务接入与数据管理,并通过自研存储引擎提升单位存储容量的读写带宽,满足不同业务的性能与稳定性需求。
01
整体架构
ROS 采用自建与公有云共同承载数据的混合云架构,业务通过 S3 SDK 接入,各模块分工如下:
多云统一网关:提供统一接入,负责协议适配、鉴权、流控和路由,屏蔽不同存储后端的接口差异。
RedDB:提供对象存储元数据服务,可随 Bucket 对象数量增长自动分裂,线上已经支持单 Bucket 千亿对象规模。
RedStore:自研池化存储引擎,提供 HDD 和 SSD 两类引擎,与公有云对象存储共同承载数据,满足不同业务的容量、性能和成本需求。
离线系统:负责跨区域、跨集群数据调度、生命周期沉降与引擎置换,支持数据跨区域、跨引擎流转。
全 Kubernetes 部署:ROS 的全部服务都通过 Kubernetes 统一编排,支撑部署、扩缩容与运维管理。
02
多云统一网关
多云统一网关面向自建与公有云共同承载数据的混合云场景,提供兼容 S3 的统一入口。业务通过同一套 S3 SDK 接入,网关负责协议适配、鉴权、分布式流控和路由,并汇集多云访问日志与监控数据,减少业务对不同后端的重复适配。
Bucket 可按需选择存储引擎:高性能、大带宽场景选择 SSD,成本敏感场景选择 HDD。多云统一网关还支持引擎置换。例如,RedStore 空间不足时,可将 Bucket 的数据迁移到 云上对象存储。迁移期间,未迁移的对象仍读 RedStore,已迁移的对象读 云上对象存储;业务保持原有接口、桶名和对象名称,无需适配后端变化。
通过多云统一网关与离线系统协作,ROS 可利用引擎置换缓解容量运营压力,支持将存储利用率提升到 90%。离线系统还负责跨区域、跨集群数据调度与跨云生命周期沉降,使数据随资源和访问需求流转。
03
存储引擎
3.1 HDD 存储引擎
大数据扫描和批量读取需要持续、稳定的高带宽,而 HDD 上分散的小块访问容易受到寻道开销限制。ROS 通过多节点、多磁盘并行,结合内外圈放置、亲和预分配与预读,减少随机寻道、提升连续访问效率。在读写比为 2∶5、平均对象大小为 64 MiB 的线上真实负载下,每 PiB 可提供 20 Gbps 读带宽和 10 Gbps 写带宽。其中,热存副本放置在外圈,冷存副本放置在内圈,利用外圈较高的顺序读写带宽优先服务热数据访问。
预分配解决“写得近”:写端传递相关 Blob(对象逻辑分块)的亲和信息,转换为分片提示,DataNode 提前预留连续空间,减少后续分散写入。预读解决“读得顺”:读取时按需预读相邻分片,供后续请求复用,把相关小块访问转化为更连续的磁盘 I/O。
预读的目标是提高业务有效吞吐,而不是扩大磁盘读取量。因此,需要结合命中率、空间压力和带宽消耗控制预读范围,避免无效读取挤占正常请求。
3.2 SSD 存储引擎
AI 训练与索引加载需要持续的大带宽,仅更换 SSD 还不够,网络处理、数据拷贝和软件 I/O 路径都可能成为瓶颈。ROS-Express 将优化延伸到网络与本地存储,每 PiB 提供 1Tbps 读带宽和 250Gbps 写带宽。
业务通过 S3 SDK 经多云统一网关进入 Access 数据访问层,再通过 RDMA 网络访问 DataNode 数据节点。RDMA 减少网络处理的 CPU 开销与数据拷贝;网络 Poller 与各盘 SPDK Poller 异步协作,减少中断与调度开销,并通过用户态异步 I/O 发挥 NVMe 的并发能力。结合节点横向扩展,将多节点、多磁盘的带宽汇聚为服务能力。
高性能 SSD 引擎以全内存索引减少寻址所需的磁盘访问,并通过 NUMA 亲和,让 CPU、内存、网卡与磁盘就近协作。面向 QLC,在设备支持时利用 FDP(Flexible Data Placement) 按数据生命周期优化放置,降低垃圾回收带来的写放大,具体设计将在后续专篇展开。
04
数据组织
RedStore 按对象大小选择保存方式,并通过分层寻址定位数据。以下先介绍写入时的对象分块与数据保护,再说明读取时如何找到对应的节点和磁盘数据。
4.1 对象分块与数据保护
按对象大小分级。小于 1KiB 的对象支持将数据内联保存在 RedDB;大于等于 1KiB 且小于 512KiB 的对象采用 4 副本;512KiB 及以上的对象按 Blob 组织并采用纠删码(EC)保护。单次 PUT 上限为 5GiB,更大对象使用分段上传。
分块与尾块合并。Blob 是对象的逻辑分块,默认按 5MiB 划分。存在前块且非零尾块不超过 1MiB 时,写入前将尾块并入前块,末块最大为 6MiB。例如,16MiB 对象拆成 5、5、6MiB 三个 Blob,避免单独保存一个 1MiB 小尾块。
EC 编码保护。以 8+3 编码为例,每个 Blob 生成 8 份数据分片和 3 份校验分片,跨 DataNode 放置。部分分片不可用时,只要有效分片满足恢复条件,即可通过解码恢复数据,并由后台重建补齐冗余。
4.2 分层组织与寻址
读取时,RedDB 提供对象的 Blob(逻辑分块)布局与标识。系统根据 Cluster ID 选择集群,再通过 Space 和 Volume 查找分片位置:同一 Space 使用相同编码策略,Volume 管理一组分片的放置关系,Vlet 是节点内的分片管理单元。请求到达 DataNode 后,按 VBID(卷内 Blob 标识)查询本地索引,定位磁盘数据。
分层管理将对象布局与物理位置解耦,支持按集群扩展存储资源。数据容错依靠副本、EC 与故障域放置。
05
未来展望
小红书自研存储仍在持续迭代。未来将打通对象与文件访问,让同一份数据既可通过 S3 访问,也可通过 RedFuse 提供的 POSIX 接口访问,覆盖 AI 数据采集、清洗、训练与部署流程,减少不同访问方式之间的数据复制。
面向索引构建等场景,计划为 Bucket 引入层级命名空间:HNS(层级命名空间)管理目录层级、父子关系与路径查找,FNS(扁平命名空间)管理对象元数据与位置索引,共同支撑目录管理与大规模目录重命名需求。同时,将现有的跨引擎数据流转能力扩展到这些场景,通过 SSD、HDD 与云上引擎之间的沉降和置换,兼顾时延、带宽与成本。
作者:
德古|中台技术部。主要负责对象存储与多云统一网关建设。
部门介绍:
存储&数据库部,为小红书全业务场景打造行业领先的高可用、高可靠、高性能、低成本的存储和数据库类产品技术服务。团队致力于用精英化的组织和行业领先的技术理念,先于业务布局和行动,为公司业务的快速发展提供充足“弹药”,同时也让小红书存储和数据库成为行业该领域的标杆。
06
招聘
分布式存储研发工程师小红书招聘
块/文件/对象/存储底座等方向