主要观点:最近在 Feldera 中添加了自定义存储引擎,起初考虑使用现有解决方案 RocksDB,但遇到问题后决定自行开发。RocksDB 虽有优势但存在缺乏扩展性、无法利用零拷贝反序列化、配置复杂度过高以及因列族导致测试缓慢等问题,最终导致性能不佳,促使开发自定义存储引擎,新引擎具有无共享架构、零拷贝反序列化和类型安全优化等特点。
关键信息:
- Feldera 初始将数据存于内存,后因数据结构增长需使用存储,用于溢出内存中大型数据结构及容错或状态迁移的检查点。
- 用于索引数据的结构是 Z-set,主要操作有遍历集合、合并集合、按键查找值等。
- RocksDB 与 Feldera 内存管理架构相似,提供所需 API,且使用 Log-structured merge-tree 作为底层数据结构。
- 将 RocksDB 集成到 Feldera 较简单,但遇到多线程扩展不佳、零拷贝反序列化开销大、配置复杂、因列族导致测试缓慢等问题。
重要细节:
- 图显示 RocksDB 在单线程处理小数据集性能较好,但扩展到 8 线程时性能大幅下降,远超硬件限制,推测是软件锁争用。
- 运行 nexmark 查询时,因反序列化导致大量时间花费在键比较和内存分配释放上,零拷贝反序列化虽好但易因切片未对齐导致 panic。
- RocksDB 配置选项众多,非专家难以确保最佳设置,调整 BlobDB 使端到端吞吐量提高约 20%。
- 测试中因 RocksDB 创建大量列族导致测试套件运行时间从 2 分钟延长至 30 分钟,此问题自 2019 年起未解决。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。