2023年5月,由 Stackoverflow 发起的2023年度开发者调查数据显示,PostgreSQL 已经超越 MySQL 位居第一,成为开发人员首选。PostgreSQL 在国内的热度也越来越高。6月17日,PostgreSQL 数据库技术峰会在成都顺利召开。本次大会以“新机遇、新态势、新发展”为主题,邀请众多行业大咖参与本次活动。PieCloudDB 产品总监陈金豹也受邀在大会中发表演讲《云原生虚拟数仓 PieCloudDB 的架构和关键模块实现》。
随着云计算时代的到来,云平台提供了近似无限丰富的计算资源,同时也使得计算成本极大的降低,释放出数据计算产生智能的更多机会。早在2019年,Gartner 便做出预测:数据库市场的未来在云上。随着云计算技术的发展,企业也都在向这一趋势靠拢,越来越多的将自己的业务数据往云上迁移。我们相信数据库的未来在云上,这也是我们打造 PieCloudDB 这款云原生数据仓库的原因。
PieCloudDB 于2022年10月正式问世。它是一款云原生分布式数据仓库,提供完备的 SQL 语言支持,高效的分布式计算能力和完备的事务支持。同时又实现了单一数据集的多集群,秒级的弹性和只为必要的计算和存储付费的能力。
1. Why We Need PieCloudDB?
1.1 NoSQL 和数据湖已不能满足用户的分析需求
在过去的很长一段时间里,NoSQL + 数据湖解决方案在数据分析领域占据了主流市场,而 Hadoop、HDFS 等 NoSQL 数据库也是主要的数据分析平台。然而,随着 Cloudera 宣布停止对 CDH 技术支持,对 Hadoop 等 NoSQL 平台的质疑声音也越来越大。
这一现象正是因为 NoSQL + 数据湖体系在复杂查询支持、高并发隔离性和一致性等重要数据分析特性方面存在明显不足,现有基于标准 SQL 的 BI 工具难以集成,且 NoSQL 本身对高级分析(如图形分析、地理信息分析等)的支持较弱。因此,NoSQL 开始被人们贴上“过时”的标签,不再占据数据分析领域的主要市场份额。
此外,基于 NoSQL 和数据湖的基础设施所需的分析工具不容易集成和部署。使用数据湖进行数据分析需要整合部署多个组件,而这需要大量的开发工作。由于缺乏对 ANSI SQL 的支持,用户通常需要具备专门的技术技能,并且需要承担较高的技术和成本要求。此外,平台所需的专用引擎/工具(如图形数据库)往往难以与记录系统集成,降低了数据分析的可操纵性和创新性。
这些限制和挑战推动了对更强大、更易于集成、更易于使用的数据分析平台的需求。企业和组织越来越倾向于采用基于标准 SQL 的分析平台,这些平台能够满足用户广泛的分析功能、易于集成和部署等需求,并且与现有的数据存储和处理技术相兼容,对技术和成本的要求更低。
1.2 以关系型数据库为基础的数据仓库很难适应云环境
包括 Teradata、Greenplum 等众多主流传统数据仓库都是以关系模型来组织数据的关系型数据库。这些数据仓库具有许多优点,包括良好的 SQL 兼容性、高效运行复杂查询以及支持事务 ACID 特性。然而,这些传统的 MPP 数据库也存在一些缺陷,例如弹性性能较差、高可用性方面不够满足要求、数据孤岛等问题。
这些问题导致传统的数据仓库在云环境中无法充分利用公有云的优势。公有云相对于私有环境具有许多优势,其中最显著的两个是:
- 近乎无限的弹性计算资源:公有云提供了弹性计算资源,用户可以根据实际需求按需分配资源,并根据需要进行弹性扩缩容。用户可以根据业务需求申请所需的计算资源,而不需要维护和管理自己的硬件基础设施。
- 廉价且无限容量的对象存储:公有云提供廉价且具有几乎无限容量的对象存储。对象存储的价格相对较低,可以为用户提供大规模的存储容量,帮助用户降低成本并提高效率。
为了更好地适应云环境并充分利用公有云的优势,新一代的数据仓库逐渐崛起。新一代云原生数据仓库具有云原生的架构设计,能够更好地利用公有云的弹性计算和对象存储能力。它们可以在公有云中快速部署和扩展,并提供高性能的数据处理和分析能力,以满足现代数据分析的需求。
1.3 一个兼顾关系型数仓和公有云优势的产品
用户需要一个能够兼顾关系型数仓和公有云优势的产品,来适应云时代的到来。计算引擎方面,需要具有关系型数仓的众多优势,能够具备支持完备的 SQL 语言,具有高效的分布式计算能力,且能够具有完备的事务 ACID 特性。公有云特性方面,实现存算分离,提供弹性的计算集群,让用户得以只为必要的计算付费,充分利用公有云带来的优势。这就是 PieCloudDB 的设计目标。
2. PieCloudDB 能给用户带来什么?
作为新一代的云原生数据仓库,PieCloudDB 实现了云上数仓计算与存储的分离,兼顾了传统关系型数仓的众多优势和公有云带来的众多利好。
2.1 对 SQL 的完备支持
PieCloudDB 对 PostgreSQL 进行了重大改进,实现了分布式计算和存算分离的功能。并对锁、事务、日志、系统表和用户表的存储等模块进行了彻底重写,带来了颠覆性的变革。同时,PieCloudDB 也保留了 PostgreSQL 对 SQL 标准的完整支持,包括复杂查询如聚合(Agg)、子计划(Subplan)、子链接(Sublink)、外连接查询(Outer Join)、窗口聚合函数(Window agg)和物化视图(Materialized View)等。这些改进使得 PieCloudDB 能够提供更高效、更强大的查询功能,同时保持与 SQL 标准的兼容性。
2.2 高效的查询优化和与之匹配的执行器
PieCloudDB 实现了专为复杂查询设计的优化器和与之匹配的高效执行器。
- 专为复杂查询设计的优化器
PieCloudDB 的优化器提供了一系列全面的逻辑优化功能,其中包括谓词下推、子查询子连接提升和外连接消除等。此外,优化器基于纯粹的代价模型进行深度优化,在多阶段聚集过程中对每个节点进行代价估算,并利用动态规划等算法生成多条路径,最终选择代价最低的路径来执行查询。这些功能旨在提高查询性能和效率,从而优化 PieCloudDB 的查询执行过程。
作为一款分布式数据库,PieCloudDB 需要实现众多分布式运算,包括多次数据重分布(reshuffle)和分布式聚合运算(agg)。为了能够在跨表查询时进行高效的分布式表连接,PieCloudDB 的优化器需要全面描述数据分布特性,以便进行分布式代价估算。
通过全面的数据分布特性描述,PieCloudDB 的优化器能够考虑到数据在不同节点上的分布情况,从而更准确地估算跨表查询的代价。这使得优化器能够生成高效的查询计划,避免不必要的数据重分布操作,提高查询性能和效率。
- 分布式环境高效执行器
为了配合专为复杂查询设计的优化器,PieCloudDB 实现了高效的执行器,以在分布式环境下执行查询操作。通过采用多组别多阶段执行模型,并进行大量的数据交换,PieCloudDB 的执行器能够在分布式环境下高效地执行查询操作。这种执行模型可以充分利用分布式系统的计算资源,并提高查询的并行性和整体性能。同时,通过与优化器的紧密配合,PieCloudDB 可以根据优化器生成的查询计划特性来优化执行器的执行策略,进一步提高查询性能和效率。
2.3 对事务(ACID)的完备支持
PieCloudDB 提供了对事务的完备支持,包括事务的 ACID 特性:原子性、一致性、隔离性和持久性。
- 原子性(Atomicity):PieCloudDB 确保事务中的操作要么全部成功完成,要么全部失败回滚。如果一个事务中的某个操作失败,那么该事务中的所有操作都将被回滚,数据库状态会回到事务开始之前的状态,保持数据的一致性。
- 一致性(Consistency):PieCloudDB 在事务提交之前,会检查事务的操作是否符合预定义的约束和规则,以确保数据库的一致性。如果事务执行完成后,数据库仍然保持一致性,那么该事务被认为是成功的。
- 隔离性(Isolation):PieCloudDB 支持两个常用的隔离级别:Read Committed(读提交)和 Repeatable Read(可重复读)。在 Read Committed 级别下,事务只能看到其他事务已经提交的修改,而在 Repeatable Read 级别下,事务在整个事务过程中能够看到一个一致的快照,不受其他并发事务的修改影响。
- 持久性(Durability):PieCloudDB 确保一旦事务提交成功,其对数据库的修改将永久保存,即使发生系统故障或崩溃。这是通过将事务日志记录在稳定的存储介质上来实现的,以便在恢复过程中可以重放事务日志。
通过提供对事务 ACID 特性的完备支持,PieCloudDB 提供了可靠和一致的数据管理机制。无论是在并发环境中还是在面临故障的情况下,PieCloudDB 都能确保数据的完整性和可靠性。
2.4 极致的计算集群弹性
PieCloudDB 具备极致的计算集群扩缩容能力,能够实现计算集群快速的扩展和收缩操作。PieCloudDB 的 Executor 节点并不持有持久化的数据,扩展和收缩操作不涉及数据的移动。此外,Executor 节点也不直接访问系统表、事务和锁。在进行计算集群的扩展时,PieCloudDB 只需要在新的虚拟机节点上部署二进制并向元数据服务注册。这样的设计确保了扩缩容操作的高效性。
PieCloudDB 为用户提供了一个独立的计算池,该计算池是为了支持快速的扩缩容而准备的。在这个计算池内,PieCloudDB 可以在一定范围内实现秒级的扩容和收缩操作。这意味着当用户需要增加计算资源时,PieCloudDB 可以迅速添加新的计算节点,使得整个集群能够处理更多的并发请求。反之,当用户需要减少计算资源时,PieCloudDB 也能够快速地收缩计算节点,以节省成本和资源。
2.5 多集群与高可用
PieCloudDB 支持多集群。用户可以在同一个数据集上起多个集群。在生产环境中,常常会遇到不同的部门对集群大小的需求不一样。这种情况下,如果只有单集群,就需要根据最大的集群需求来创建集群,造成资源的浪费。在多集群场景下,不同部门可根据自身需求创建不同大小的集群,任务结束时可以关闭集群,多个集群访问同一个数据集,并共享同一个 ACID 特性。
由于 PieCloudDB Executor 是无状态的,当某个 Executor 出现故障,Coordinator 会执行下个 Query 时,由剩下的 Executor 来执行任务。此过程中,用户无感知,不会对业务产生影响。
通过这些特性,PieCloudDB 在 OLAP 场景下,可以让用户像使用 PostgreSQL 一样使用 PieCloudDB。用户只需为已经发生的计算和存储付费。用户可以按需启动和关闭多个不同大小的集群,以适应不同类型的任务,从而取得性能和开发效率的平衡。
3. PieCloudDB 云原生架构的实现
为了适应云环境,PieCloudDB 实现了弹性伸缩的集群和多集群这两个主要的云原生特性,打造了完全无状态的 Executor 节点、独立的系统表和分布式的锁。
3.1 虚拟数仓
PieCloudDB 为了实现在扩缩容过程中无需移动数据,将用户数据分离到对象存储中。此外,Executor 节点上不存储系统表、事务和锁信息,而是依赖 Coordinator 来解决这些问题,从而使 Executor 节点成为无状态的节点,实现秒级扩缩容。
为了实现 Multi-master 架构,并实现有状态的 Coordinator 节点,PieCloudDB 使用元数据服务来完成这些功能。系统表以 Key-Value 的形式存储在 KV 数据库 FoundationDB 中,并通过 FoundationDB 的短时间、小体量的事务特性,实现了分布式锁和分布式事务。这样,PieCloudDB 能够在Coordinator 节点上处理分布式锁和事务,并保证系统的一致性和可靠性。
通过这一系列的设计和操作,PieCloudDB 实现了完全无状态的虚拟数仓。用户可以根据需要创建和关闭虚拟数仓,而在扩缩容过程中无需移动数据,并且能够快速进行节点的扩展和收缩。这使得 PieCloudDB 能够高效地适应不同规模和负载的需求,并提供灵活的数据存储和计算资源管理。
- 系统表:mStore
PieCloudDB 将元组以 Key-Value 的形式存储到 FoundationDB 中,并利用FoundationDB Key 的自然排序来实现索引。在 PieCloudDB 中,每个元组都被编码为一个 Key-Value 对,其中 Key 表示元组的索引信息,而 Value 则包含了元组的数据内容。通过利用 FoundationDB Key 的自然排序,可以高效地进行范围查询和索引查找,从而实现快速的数据检索和访问。
为了实现多版本并发控制,PieCloudDB 使用了 Xmin、Xmax 和 cid 等机制。Xmin 和 Xmax 记录了事务对元组的可见性信息,其中 Xmin 表示最早可见的事务,而 Xmax 表示最晚可见的事务。cid(Commit ID)则表示事务的提交标识。通过这些机制,PieCloudDB 可以实现并发事务的隔离性和一致性,并支持多版本的查询和回滚操作。
通过将元组存储为 Key-Value 对,利用 FoundationDB 的自然排序和采用 MVCC 机制,PieCloudDB 能够高效地处理数据的存储、索引和并发访问,从而提供高性能和可靠的数据库服务。
- 数据表:oStore
PieCloudDB 通过将数据分离到对象存储(如S3)上,利用 oStore 构建了对象存储上的用户表。由于对象存储本身只支持插入(insert)和删除(delete)操作,而不支持更新(update)和追加(append)操作。PieCloudDB 在 mStore 中创建辅助表来实现 MVCC(多版本并发控制)的特性。
在 mStore 的辅助表中,每 个 tuple 对应 oStore 的一个 block,oStore 的 block 中存储了一部分的用户数据。这样,辅助表的每个 tuple 的可见性就与对应的 block 的可见性相关联,从而实现了 MVCC 的特性。当执行更新(update)或删除(delete)操作时,PieCloudDB 会生成一个新的 block,将未发生变化的 tuple 放入新的 block 中,并将更新后的用户数据放入新的 block 中(例如,在 block 4 上执行更新操作后,生成一个新的block 5,将更新后的用户数据放入新的 block 5 中)。最后,辅助表将完成更新(update)操作。
通过这种设计和操作,PieCloudDB 能够在对象存储上实现 MVCC 特性,并通过辅助表来管理数据的版本和可见性。这使得 PieCloudDB 能够支持更新和删除操作,同时保持数据的一致性和并发控制的正确性。
- 分布式锁和事务
PieCloudDB 利用 FoundationDB 的事务提交冲突(commit conflict)机制来实现锁的共享区的正确访问,从而实现了分布式的锁。
在 PieCloudDB 中,多个事务需要访问共享区时,它们会通过 FoundationDB 的事务机制进行竞争和协调。每个事务尝试获取锁并执行对共享资源的操作。如果多个事务同时请求同一个共享锁,FoundationDB 的事务提交冲突机制会确保只有一个事务能够成功获取锁并进行操作,而其他事务将被阻塞或回滚。
通过利用 FoundationDB 的事务提交冲突机制,PieCloudDB 能够实现分布式的锁管理,确保对共享区的正确访问和资源的互斥操作。这种机制保证了多个事务之间的隔离性和一致性,避免了数据竞争和冲突的发生,并提供了可靠的分布式锁功能。
此外,PieCloudDB 还在 FoundationDB 上实现了分布式的事务,并通过 mStore、oStore、分布式锁和事务的实现,构建了一个云原生的分布式架构。这样的架构能够提供高可靠性、高性能的数据库服务,并支持分布式的数据操作和管理。
优秀的架构设计是一款数据库产品成功的第一步,OpenPie 研发团队将对 PieCloudDB 产品进行不断迭代,针对性能推出了聚集下推、预计算、Block Skipping 等功能,并很快将推出Time Travel、Branch、Data Sharing等系列提高用户的使用体验。PieCloudDB 将继续前进,在 eMPP 分布式专利技术、服务器无感知(Serverless)及 透明数据加密(TDE)等多项核心技术加持下,为企业构建高安全性,高可靠性,高可用性的「坚如磐石」的云原生虚拟数仓,助力企业实现数据价值最大化,欢迎关注!