Rockset 产品白皮书解读
内容提要
Rockset是2016年成立的云原生实时分析数据库,基于RocksDB-Cloud实现存算分离与算算分离,支持无服务器、全托管。它采用文档模型和融合索引,结合行、列、搜索索引,支持SQL查询、连接及实时写入,可在毫秒级同步数据,高效处理半结构化数据,核心源码已开源。
延伸解读
存算分离与算算分离的工程意义
Rockset 通过 RocksDB-Cloud 将持久化数据存放在云存储的 SST 文件中,并把压缩等计算密集型任务卸载到无状态服务器,实现了存算分离。更进一步,它将写入与查询模块完全分开,使多个计算单元能同时读写共享数据。这种设计让系统能利用廉价对象存储节约成本,并让计算资源根据负载独立扩展,但前提是团队有能力深度定制 RocksDB 源码,这并非普通团队能轻易复制的。
融合索引如何加速不同类型查询
Rockset 为每个文档同时构建行、列和搜索三种索引,形成融合索引。行索引将同一文档的值放在一起,适合低延迟点查;列索引将同一列的值集中,适合无过滤条件的聚合扫描;搜索索引把值放入键中,适合等值过滤。查询时优化器会根据查询特征自动选择最佳索引,例如无过滤的 GROUP BY 走列索引,带等值条件的查询走搜索索引。这种自动选择减少人工调优,但索引维护本身有写入开销。
实时同步与可变索引的取舍
Rockset 通过复制 RocksDB leader 的 memtable 到 follower,让新数据在个位数毫秒内可查,同时只在 leader 执行索引和压缩,避免 follower 重复计算。其索引完全可变,每个键指向文档片段,更新单个字段不会触发整个文档重新索引,避免了传统搜索索引的“重新索引风暴”。不过,这种细粒度索引会生成大量键值对,对存储空间和合并策略提出更高要求,文章也提到使用 delta 编码、zSTD 压缩和 Bloom 过滤器来缓解。
Q&A
Rockset 是什么?它主要解决什么问题?
Rockset 是一个基于云的实时分析数据库,旨在实现对海量半结构化数据的查询,同时消除运维负担。它采用无服务器和完全托管的方式,可卸载管理配置、集群调配、反范式化和分片/索引管理等工作。
Rockset 如何处理半结构化数据?
Rockset 使用文档模型来组织数据,支持 schemaless,对半结构化数据(如 JSON、Avro、Parquet 等)友好。用户的数据即使发生变化,也不需要关心表的元数据。与其他文档数据库不同的是,Rockset 支持用 SQL 作为查询语言,支持 join。
Rockset 的存储引擎 RocksDB-Cloud 有什么特点?
RocksDB-Cloud 是 Rockset 的嵌入式持久化存储引擎,扩展定制了 RocksDB,支持存算分离和算算分离。它采用 zero-copy-clone 技术复制实例,将持久化数据存储在云存储的 SST 文件中,并通过远程压缩将合并任务卸载到无状态服务器,实现自动扩展。
Rockset 如何实现计算与存储、计算与计算的分离?
Rockset 通过 RocksDB-Cloud 将计算和存储分离,持久化数据存储在云存储中,压缩计算可远程执行。计算与计算分离则是将执行流式数据写入任务的模块与执行查询处理的模块完全分开,数据写入、转换和索引代码路径与查询解析、优化和执行完全独立。
Rockset 的融合索引是什么?它如何工作?
融合索引是 Rockset 将所有接收到的数据存储在一起的方式,灵感来自搜索和列式索引。它自动将数据存储在多种类型的索引中,包括行索引、列索引和搜索索引。行索引用于低延迟查找,列索引加快扫描和压缩,搜索索引用于快速查找特定值。查询时,优化器会根据查询类型自动选择最佳索引。
Rockset 的查询流程是怎样的?
当一个查询进入 Rockset API 服务器时,它会被路由到聚合器。聚合器对查询进行规划,并将规划中的各个片段路由到持有数据的适当分区。查询结果返回到聚合器,聚合器再将结果发送回 API 服务器。Rockset 引入了更多层次的聚合器,以便在多个聚合器之间分配处理可能使单个聚合器成为瓶颈的查询。