Each language version is independently generated for its own context, not a direct translation.
这篇论文介绍了一个名为 O3-LSM 的新系统,它的目标是让云数据库在“计算”和“存储”分离(Disaggregated)的架构下,写得更快、更稳。
为了让你轻松理解,我们可以把数据库想象成一个超级繁忙的快递分拣中心。
1. 背景:现在的快递中心遇到了什么麻烦?
想象一下,传统的快递中心(单体架构)里,包裹(数据)先放在手边的传送带上(内存/Memtable),满了就打包发往仓库(硬盘/DS)。
但在现在的云数据中心里,为了省钱和灵活,大家把“分拣员”(计算节点)和“大仓库”(存储节点)分开了,中间隔着一条高速公路(网络)。
- 问题一(内存不够): 分拣员手边的传送带(内存)很小。一旦包裹太多,传送带满了,新来的包裹就得排队等待,甚至被拒收(写入变慢或停止)。
- 问题二(打包太慢): 以前大家只把“打包整理”(Compaction/合并)的工作外包给了仓库。但现在的瓶颈在于“把包裹从传送带搬到卡车”(Flush/刷新)这一步。因为要经过网络,速度很慢,导致传送带经常堵死。
- 问题三(找东西难): 如果包裹还在传送带上没发走,客户要查包裹,分拣员得一个个翻找,效率很低。
现有的方案虽然把“整理”外包了,但没解决“传送带堵死”和“搬运太慢”的问题。
2. O3-LSM 的解决方案:三层外包(Three-Layer Offloading)
O3-LSM 就像是一个超级聪明的物流调度系统,它引入了一个共享的“临时中转站”(Disaggregated Memory, DM),并实施了三个创新策略:
第一层:智能传送带(DM-Optimized Memtable)
- 以前的做法: 把传送带上的包裹搬到“临时中转站”时,因为包裹上贴的标签(指针)是写给本地传送带看的,到了中转站就失效了。分拣员必须把每个包裹拆下来,重新贴标签、重新整理,这太慢了。
- O3-LSM 的做法: 它重新设计了包裹的包装方式。它把“包裹本身”(数据)和“标签索引”(指针)分开。
- 比喻: 就像把一箱苹果(数据)直接装箱运走,箱子上的标签(索引)只写“第几个苹果”。到了中转站,不需要重新贴标签,只需要在标签上改个“箱子位置”就行。
- 效果: 搬运速度极快,几乎不需要重新整理,直接就能在中转站被找到。
第二层:协作式打包(Collaborative Flush Offloading)
- 以前的做法: 只有负责这个传送带的分拣员(原计算节点)能打包发货。如果这个分拣员忙不过来,或者网络堵了,包裹就发不出去。
- O3-LSM 的做法: 它建立了一个**“万能打包队”**。
- 比喻: 当传送带满了,系统会问:“谁现在有空?”不管是谁(另一个分拣员,或者中转站的工作人员),只要有空闲的 CPU 和网络,都可以帮忙把中转站里的包裹打包发往大仓库。
- 效果: 不再依赖单一节点,谁有空谁干,大大加快了发货速度,避免了拥堵。
第三层:分块并行处理(Shard-Level Optimization)
- 以前的做法: 每次打包都是把整个传送带(64MB 的大箱子)一次性搬走。如果网络带宽有限,这个大箱子会堵住整条路,而且一旦卡住,整个传送带都得停。
- O3-LSM 的做法: 把大箱子拆成很多小包裹(Shards),按地址(Key 范围)分类。
- 比喻: 不再等一整车苹果,而是把苹果分成“红苹果区”、“青苹果区”、“黄苹果区”。不同的卡车可以同时运送不同颜色的苹果。而且,系统会把所有“红苹果区”的包裹合并成一个大包裹直接发走,省去了后续在仓库里重新分拣的麻烦。
- 效果: 并行处理,互不干扰,彻底解决了“大箱子堵车”和“仓库整理慢”的问题。
3. 读数据也变快了:智能导航(Cache-Enhanced Read Delegation)
当客户要查包裹时:
- 以前的做法: 要么在本地找(快但内存小),要么去中转站一个个翻(慢,因为要跑很多趟网络)。
- O3-LSM 的做法:
- 热点缓存: 对于经常查的包裹,系统记下了“它在哪个箱子的第几层”(Key-Offset Cache)。下次直接去拿,不用翻箱倒柜。
- 远程代查: 如果没记住,系统会派一个“远程侦探”(利用中转站的 CPU)直接去翻,翻到了直接告诉你结果,而不是把整个箱子搬回来。
- 比喻: 就像你问路,如果记得路,直接指给你;如果不记得,直接派个出租车司机(远程 CPU)去把你接回来,而不是让你自己跑过去再跑回来。
4. 成果如何?
经过测试,O3-LSM 的表现非常惊人:
- 写入速度: 比现有的最佳方案快了 4.5 倍。
- 查询速度: 范围查询快了 5.2 倍。
- 延迟: 最慢的情况(P99 延迟)减少了 76%。
- 稳定性: 就像一条平稳的高速公路,再也没有了那种“走走停停”的卡顿现象。
总结
O3-LSM 就像给云数据库装上了智能物流系统:
- 改包装(优化内存结构),让搬运不费事;
- 叫外援(协作打包),谁有空谁干活;
- 拆小单(分块并行),避免大堵车;
- 记路标(智能缓存),让查找更精准。
它成功解决了在“计算”和“存储”分离的架构下,数据库写得慢、容易卡死的痛点,让云上的数据服务变得既快又稳。
Each language version is independently generated for its own context, not a direct translation.
O3-LSM 技术总结
1. 研究背景与问题定义
背景:
随着云计算和高速网络的发展,解耦数据中心(Disaggregated Data Centers, DDCs)已成为主流架构,将计算(Compute)、内存(Memory)和存储(Storage)分离为独立的资源池。基于日志结构合并树(LSM-Tree)的键值存储(LSM-KVS)正在被重新设计以适应这种架构,通常通过将**压缩(Compaction)**任务卸载到存储节点来减少计算节点(CN)与存储节点(DS)之间的网络 I/O。
核心问题:
尽管现有的解耦 LSM-KVS(如 Disaggregated-RocksDB, CaaS-LSM 等)通过卸载压缩缓解了部分压力,但在写入性能上仍面临严重瓶颈,主要源于计算节点(CN)的内存受限和刷新(Flush)操作缓慢:
- 写入缓冲区受限: 当写入缓冲区(Memtable)填满时,新写入会被阻塞或节流,直到内存空间通过刷新释放。在 DDC 中,CN 通常需托管多个实例,内存资源极其有限。
- 刷新延迟高: Memtable 刷新到持久化存储(DS)涉及大量的网络 I/O、排序、压缩和 SST 文件构建。这不仅消耗 CN 的带宽,还容易因 Level 0 (L0) 层的 SST 文件积累导致 L0 压缩阻塞,进而引发写入停滞(Write Stalls)。
- 现有方案的不足: 简单的将 Memtable 卸载到解耦内存(DM)作为二级存储的方案存在三大挑战:
- 传输与重建成本高: 远程内存访问延迟高于本地 DRAM,且 Memtable 通常基于跳表(Skiplist),包含大量指针。直接传输会导致指针失效,需要在 DM 端进行昂贵的重建和指针更新。
- 刷新效率低: DM 缺乏完整的刷新逻辑(如排序、压缩、Manifest 更新)。若将 Memtable 从 DM 读回 CN 再刷新,会引入额外的网络往返和序列化开销。
- 读取性能下降: 在 DM 中搜索 Memtable 需要多次远程内存访问(RDMA),导致读取延迟显著增加。
2. 方法论:O3-LSM 架构
O3-LSM 提出了一种全新的 LSM-KVS 架构,利用共享的解耦内存(DM)实现三层卸载(Three-Layer Offloading):Memtable 卸载、刷新卸载和现有的压缩卸载。其核心创新包括:
2.1 面向 DM 优化的 Memtable (DM-Optimized Memtable)
为了解决远程传输和重建指针的开销,O3-LSM 重新设计了 Memtable 的数据结构:
- 索引与数据分离: 将 Memtable 拆分为索引块(Index Block)和KV 数据块(KV Block)。
- 索引块: 包含跳表的指针结构,但指针不再指向具体的 KV 对象,而是指向 KV 数据块中的偏移量(Offset)。
- KV 数据块: 以连续内存块的形式顺序存储 KV 对(Key-Value-Offset 元组),不包含指针。
- 优势: 传输时,KV 数据块可以直接以字节流形式通过 RDMA 写入 DM,无需重建指针。DM 端仅需根据新的基地址修正索引块中的偏移量即可恢复可搜索性,极大降低了传输和重建开销。
2.2 协同刷新卸载 (Collaborative Flush Offloading)
为了解决刷新过程中的资源争用和 DM 无法直接刷新的问题,O3-LSM 设计了解耦的控制平面:
- 多阶段协议: 引入一个轻量级的刷新协议,将刷新任务从 LSM 实例中解耦。任务可以在任何拥有 DM 访问权限的节点(CN 或 DM 节点)上执行。
- 协同调度器: 一个全局调度器监控各节点的 CPU、I/O 带宽和队列负载。它动态选择最空闲的节点来执行刷新任务。
- 执行模式: 支持三种模式:
- Local: 原 CN 执行。
- In-DM: 直接在 DM 节点上执行(利用 DM 的计算资源)。
- Remote-CN: 由其他空闲的 CN 执行。
- 优势: 避免了将数据从 DM 读回原 CN 的额外开销,利用集群空闲资源并行处理刷新,显著提升了刷新吞吐量。
2.3 分片级优化 (Shard-Level Optimization)
为了进一步提升并行度并解决 L0 压缩瓶颈:
- Memtable 分片: 将每个 Memtable 按预定义的关键字范围(Key Range)划分为多个非重叠的分片(Shards)。每个分片包含独立的 KV 块。
- 异步传输: 分片可以独立、异步地传输到 DM,无需等待整个 Memtable 填满。
- 分片级刷新与 L0 合并: 刷新时,系统不再按 Memtable 为单位,而是按**分片(Shard)**为单位。它将不同 Memtable 中相同 Key Range 的分片块聚合在一起,一次性生成 L0 SST 文件。
- 优势: 将粗粒度的 Memtable 刷新转化为细粒度的分片操作,实现了刷新的并行化。同时,这种聚合方式生成的 L0 文件 Key Range 重叠更少,显著减少了后续 L0 到 L1 的压缩压力。
2.4 缓存增强的读取委托 (Cache-Enhanced Read Delegation)
为了缓解 DM 中读取延迟高的问题:
- 本地 Key-Offset 缓存: 在 CN 端维护一个小容量的缓存,记录热点 Key 在 DM 中的偏移量。
- 自适应读取策略:
- 缓存命中: 直接使用 One-sided RDMA_READ 从 DM 获取数据,无需搜索索引。
- 缓存未命中: 触发读取委托。CN 发送 Two-sided RDMA_SEND 请求给 DM,由 DM 端的 CPU 线程在本地执行搜索(利用 Bloom Filter 过滤),找到数据后返回。
- 优势: 结合了 One-sided 的低 CPU 开销和 Two-sided 的低往返次数(RTT)优势,大幅降低了读取延迟。
3. 主要贡献
- 架构创新: 提出了 O3-LSM,首个利用解耦内存(DM)作为写入缓冲区扩展的 LSM-KVS,实现了 Memtable、Flush 和 Compaction 的三层卸载。
- 数据结构优化: 设计了 DM-Optimized Memtable,通过索引与数据分离,实现了 Memtable 在 DM 上的零指针重建传输。
- 协同机制: 提出了 Collaborative Flush Offloading 协议和调度器,解耦了刷新控制与执行,实现了跨节点的动态资源利用。
- 并行化策略: 引入 Shard-Level Optimization,将刷新和 L0 压缩细粒度化,解决了 L0 压缩瓶颈并提升了并行度。
- 读取优化: 设计了 Cache-Enhanced Read Delegation,有效平衡了远程内存访问的延迟与开销。
4. 实验结果
作者在 CloudLab 上基于 RocksDB v8.2.0 实现了 O3-LSM,并与 Disaggregated-RocksDB、CaaS-LSM 和 Nova-LSM 进行了对比:
- 写入性能: 在随机写入负载下,O3-LSM 的吞吐量比现有方案提升 3.4x - 4.5x,P99 延迟降低高达 60%。
- 读取性能: 在随机读取负载下,吞吐量提升 0.3x - 1.8x,P99 延迟降低高达 69%。
- 范围查询: 范围查询吞吐量提升高达 5.2x,P99 延迟降低 22%。
- 混合负载: 在 50% 读/50% 写的混合负载下,吞吐量提升 1.9x - 3.0x,P99 延迟降低高达 76%。
- 真实应用: 在 Kvrocks(Redis 兼容存储)上的测试显示,O3-LSM 吞吐量提升最高达 3.4x,延迟降低 54%。
- 可扩展性: 随着计算节点和 DM 节点数量的增加,O3-LSM 展现出良好的线性扩展能力,且能有效缓解写入停滞(Write Stalls)。
5. 意义与价值
- 突破内存瓶颈: O3-LSM 证明了利用解耦内存(DM)作为 LSM 写入缓冲区的可行性,解决了传统解耦架构中 CN 内存受限导致的写入性能瓶颈。
- 解决远程访问延迟: 通过数据结构重构和协同调度,成功克服了远程内存访问的高延迟和指针重建开销,使得 DM 不仅仅是存储,更是高性能的计算资源池。
- 提升资源利用率: 通过协同刷新和分片并行,充分利用了集群中闲置的计算和 I/O 资源,实现了负载均衡。
- 通用性潜力: 其核心设计(如分片刷新、读取委托)具有通用性,可应用于其他解耦存储系统,为下一代云原生数据库提供了重要的设计范式。
综上所述,O3-LSM 通过创新的三层卸载架构,显著提升了解耦环境下 LSM-KVS 的写入吞吐量和读取延迟,为大规模云存储系统提供了高效的解决方案。