作者: 康凯森
日期: 2022-11-05
分类: OLAP
如上图,DPA 是一个 high-level 的编程模型:对分布式查询的相关功能进行了统一和抽象:数据复制,更新一致性,容错,查询负载均衡,弹性,持久化等。
有了 DPA,开发者只实现单机的数据结构和算子,就可以获得一个可靠的,高性能的分布式分析型数据库。开发者使用 DPA 只需要专注自己的独特和核心的逻辑。
论文中通过 Druid, Solr, and MongoDB 3 个系统论证了 DPA 的普适性和实际效果,利用 DPA 实现前面 3 个系统每个都不超过 1 千行代码。 并且在标准测试集的性能,不比之前的系统差,而且在有数据倾斜的场景,还有 3 倍的性能提升。
开发者需要通过查询优化器将用户的请求转为 DPA 的并行算子。
分布式功能每个系统都大同小异,都需要耗费大量的人力,不应该也不需要重复实现。
当前的分布式系统(Erlang,Ray,Spark 等)不能满足分析型数据库的需求:数据并行的低延迟查询和高频的批量数据更新。
DPA 将一个数据库视为 stateful actors 的集合,每个 Actor 封装了一部分数据,同时负责这部分数据的状态和计算。
DPA 不关心每个系统的 actor 具体如何实现,只需要实现几个核心接口: create, destroy, serialize, and deserialize。DPA 会依靠这些接口实现分布式的相关功能,来管理 Actor 和执行查询。
如上图所示,DPA 提供的接口主要分为 4 类:
如果所示,Uniserve 是 DPA 的一个具体实现。有 3 个 角色:
主要是两点:
默认的策略比较简单:就是将负载最高的 actor 从负载最高的 server 上迁移到 负载最低的 server 上。
优点是调度策略是可扩展的,允许开发者自定义自己的策略
具备弹性伸缩的能力,同时策略也是可扩展的,弹性伸缩的策略我们一方面要参考集群的 CPU,内存,网络,磁盘等资源的使用率,也要参考集群的查询请求负载。
我理解主要也是因为这两点,DPA 可以做到在数据倾斜场景下有 3 倍的性能提升。
1 如何支持多种查询和数据模型:
2 如何对查询调度,副本均衡,弹性伸缩等分布式核心功能进行正确的抽象,允许不同的数据库,不同的业务需求都可以在定义好的接口下实现。
凡是重复的,有价值的功能和模块,在开源界,肯定会有专门的系统来做
开源的数据库模块越来越多:DPA,Apache Calcite,Apache Arrow, Velox, gRPC 等,而且被工业界采纳的也越来越多
因为开源数据会越来越模块化,所以我们从零打造一个高性能的数据库原型就会越来越简单,我在下一篇文档会详细解释这一点
https://cs.stanford.edu/~matei/papers/2022/nsdi_uniserve.pdf