Perplexity 自研 Rust 键值库 CobbleDB 替换 DynamoDB,查询延迟降低 5 倍
有效阅读仅保存在当前浏览器,用于「为你」推荐;暂停或清除记录。
DataHot 速览
Perplexity 将核心搜索服务层从 Amazon DynamoDB 迁移至自研分布式键值存储 CobbleDB(用 Rust 编写)。该迁移解决了在大查询量下向大语言模型提供多 KB 文档批次所引发的延迟与成本瓶颈。通过将持久化文档存储与热层检索解耦,工程团队实现批量读取延迟降低五倍,整体存储费用至少降低 20%。
为什么值得关注:这是一次典型的自研数据基础设施替换云托管服务的实践,给出了延迟、成本、吞吐等具体数字与架构解耦思路,对评估键值存储选型与 LLM 检索场景的数据从业者有直接参考价值。
译文
AI 逐段翻译Perplexity 已将其核心搜索服务层从 Amazon DynamoDB 迁移至 CobbleDB,这是一个用 Rust 编写的内部开发的分布式键值存储。此次迁移解决了在高查询量下向大型语言模型提供多千字节文档批次时出现的严重延迟和成本瓶颈。通过将持久文档存储与热层检索解耦,工程团队将批量读取延迟降低了五倍,同时将整体存储费用降低了至少百分之二十。
人工智能答案引擎施加的读取模式不同于传统文档搜索。每个发送到 Perplexity 的查询会生成 100 到 120 个目标页面键,检索服务将其拆分为每批 10 到 20 个键的并行批次。与返回简短元数据片段的传统搜索引擎不同,面向语言模型的检索需要提取完整的分块段落和稠密向量嵌入,产生的平均记录负载约为 50 千字节。
在生产流量规模超过每秒 200,000 次请求时,DynamoDB 基于用量的定价在财务上变得不可持续,因为 AWS 对传输的每一个字节都计费。此外,DynamoDB 作为一个黑盒运行,隐藏了内部分区放置、内存缓存策略和副本路由。工程师无法阻止由未缓存读取、跨区域网络跳转或落后副本引起的尾部延迟尖峰。由更新分块算法或更新嵌入模型触发的重新处理作业也会将高容量写入直接推入 DynamoDB,从而对实时用户请求造成吵闹邻居争用。
为了解决这些限制,Perplexity 将其存储架构拆分为三个专用系统:用于持久状态管理的 Pillar、用于批量聚合的 Lorry,以及用于低延迟服务的 CobbleDB。
图片来源:基于文章细节使用 Gemini 生成。
Pillar 运行在 YTsaurus 上,使用高容量机械硬盘,维护网页元数据、段落和向量表示的版本化表族。YTsaurus 原子事务保证爬取更新、状态变更和导出队列一起提交。Lorry 充当无状态队列消费者,将 Pillar 导出内容分组为分区对齐的批次文件,将负载存储在 Amazon S3 中,同时向 CobbleDB 发布元数据通知。CobbleDB 工作节点独立拉取并摄取这些 S3 批次,将热服务节点与写入密集的爬取管道完全隔离。
CobbleDB 作为一个分布式键值存储运行,专门针对批量查找进行了优化。每个分区维护分布在独立计算节点上的三个副本。核心守护进程使用 RocksDB 作为其嵌入式存储引擎,将内存映射缓存与本地 NVMe 固态硬盘配对使用。
一个无状态查询路由器将哈希后的页面标识符映射到分区,并协调读取执行。为了最小化网络开销,路由器将请求路由到位于同一可用区内的节点副本。如果目标副本表现出响应时间升高,路由器通过向不同节点上的备用副本发出并发读取来投机性地对冲请求。在每个节点内,CobbleDB 通过 RocksDB 批量 MultiGet 接口同时检索键,消除了往返开销。
pub struct BatchedPageRequest {
pub keys: Vec<PageKey>,
pub zone_affinity: AvailabilityZone,
}
impl StorageEngine {
pub fn multi_get_pages(&self, keys: &[PageKey]) -> Result<Vec<Option<PageRecord>>, Error> {
let rocksdb_keys: Vec<&[u8]> = keys.iter().map(|k| k.as_bytes()).collect();
self.rocksdb.batched_multi_get(&rocksdb_keys)
}
}该数据库舍弃了标准的分布式事务协议和同步共识算法。由于搜索服务可以容忍轻微的复制延迟,各副本以自己的速率异步应用更新,从而大幅降低了运维开销。
在实际生产测量中,CobbleDB 将中位数批量读取延迟从 31.4 毫秒降低到 5.60 毫秒,p90 延迟从 56.7 毫秒降至 9.77 毫秒,p99 尾部延迟从 123 毫秒降至 24.2 毫秒。处理高达 100 千字节负载的合成基准测试确认,吞吐量可稳定达到每秒 500,000 次请求。
图片来源:Perplexity 博客
该架构带来了不容忽视的权衡。替换完全托管的云数据库将节点生命周期管理、备份验证和分区再平衡完全转移给内部站点可靠性工程师。应用程序还必须承受最终一致性,因为副本以不同的时间间隔摄取批次文件。
Aravind Srinivas,该公司 CEO,指出构成 CobbleDB 的 40,000 行 Rust 代码由两名系统工程师在两个月内构建完成,并与一个自主 AI 编码代理集群配对,该集群处理集成测试、构建监控和运维手册。Perplexity 已表示计划在即将发布的版本中开源 CobbleDB 代码库。
这篇内容对你有用吗?
反馈只用于改善内容筛选,不等同于收藏