Postgres的Citus9.5扩展有什么新功能

2020-11-15 05:49:04

如果你想了解更多关于Microsoft Azure上的CUTUS,请阅读这篇关于Azure Database for PostgreSQL上的Hyperscale(CATUS)的文章。

跳过导航当我今年在FOSDEM的Postgres研发室做开场演讲时,其中一个问答问题是:“Postgres的Ctes开源扩展进展如何?”答案是,很多。自从FOSDEM以来,Marco Slot和我一直在博客上谈论Citus9.2如何在Postgres上加速大规模HTAP工作负载,Citus9.3发行说明,以及Citus9.4中的新特性。

现在是时候了解一下Citus9.5开放源码版本中的所有新内容了。

附注:如果您刚接触CITUS并想知道它是什么,简短的答案是CUTUS是Postgres的扩展,它将Postgres转换为分布式数据库-跨多个节点分布您的数据和查询。CATUS以开源、内部企业软件的形式提供,在云中以Hyperscale(CATUS)的形式提供,这是Azure上托管Postgres数据库服务的内置部署选项。

如果您喜欢列表,在CitHub开放源码资源库中有一个更长的列表,其中包含47个修复和改进的更改日志,其中包含CTURS v9.5.0。

Citus9.5中新增功能的高级概述包括以下8个方面:

赛图斯9.5是Postgres 13发布后发布的第一个版本的赛图斯。因此,我们在Citus9.5中添加了对PostgreSQL13的支持,这样您就可以利用所有最新的Postgres特性。

Postgres 13中一些值得注意的特性包括许多查询性能改进;索引性能改进(考虑:更快、更小的索引);索引的并行清理;基于磁盘的散列聚合(这意味着内存不足错误更少);以及使用并列获取前10个。Postgres 13中还有一些甜蜜的性能提升,这要归功于Postgres查询规划器和分区的改进。

您可以在我们的CUTUS下载页面上找到更新的安装说明,该页面现在包括Citus9.5和Postgres 13包。

CATUS通过为每个CITUS工作节点打开多个Postgres连接并同时在所有分片上操作来并行化命令。通过使用多个连接,CITUS有效地支持任何类型的Postgres命令的并行性。COPY命令在很大程度上得益于CITUS的并行性:使您能够利用所有CITUS工作节点的计算、内存和网络带宽,从而显著提高复制性能。

这种方法的一个缺点是Postgres中的连接是一种稀缺资源--当您的应用程序向CITUS分布式数据库发送许多命令时,这可能会导致大量连接到CITUS工作节点。

Citus9.3 使用一种称为“自适应连接管理”( )的技术解决了这个问题, 会自动限制分布式Postgres查询的每个工作节点的连接总数。

在CATUS 9.5中,我们扩展了这一逻辑,使其也适用于分布式CITUS表上的复制命令。这意味着您现在可以同时运行数百个复制命令,而不会有出错的风险,也不会有导致重大性能损失的风险。

在未来,更好的消息是,我们团队中的一位Postgres提交者Andres Freund已经在Postgres 14中提供了大量的连接可伸缩性改进 。然而,由于Postgres 14中的这些连接可伸缩性改进要到2021年秋天才能实现,Citus9.5中新的自适应复制连接管理应该会对您非常有用。

你们中的许多人都要求这个特性,我们很高兴能在Citus9.5中推出这个特性。

当使用Ctes分发Postgres数据库时,您需要做出的一个重要早期决定是:“您的分发列是什么?”(有些人还将“分发栏”称为“分发键”或“分片键”。如果您仍在学习分片,并且仍在决定您的分发列应该是什么,那么有关选择分发列的文档是一个很好的资源。)

分发列是您在创建_Distributed_table时需要做出的一个重要选择,但是--当您第一次开始时--最佳分发列并不总是一目了然。

而且,因为您不一定需要分发所有Postgres表(您可能会选择将一些表作为本地Postgres表保留在Citus协调器节点上),所以有时候是否分发一个表并不是一目了然的。

你们中的许多人都要求使用CATUS函数将分布式表转换回本地Postgres表(当然,并保留所有数据)。有点像CREATE_DISPLATED_TABLE的简单ctrl-Z组合键。从Citus9.5开始,我们现在添加了一个名为UNDISTRIBUTE_TABLE的函数,它可以将分布式表转换回本地表。

例如,现在只需两个简单的步骤即可更改CITUS分发列(也称为分发密钥):

--创建按键分区的分布表。

创建表项(user_id bigint,key text,value jsonb not null,main key(user_id,key));

选择CREATE_DISTRIBTED_TABLE(';Items';,';Key';);

--实际上,最好使用用户ID,这样我就可以有效地连接其他按用户ID分配的表。

选择UNDISTRIBUTE_TABLE(';项目';);

选择CREATE_DISTRIBTED_TABLE(';Items';,';user_id';);

存储过程调用委派是在多租户应用程序中加速存储过程的一种强大技术,因为存储过程允许CITUS在单个网络往返过程中将整个过程调用委派给一个工作节点。

我们的解决方案架构师发现,存储过程只对CUTUS引用表进行操作是很常见的。他们告诉我们,能够在CITUS数据库集群中所有工作节点上的引用表的所有副本之间实现这些过程调用的负载平衡将是非常有用的-这有效地代表了扩展CITUS数据库的一种新方式。

将来,我们希望能够自动委派和负载平衡过程调用,但目前我们启用了负载平衡,允许您将分布式函数与引用表放在同一位置,并将TASK_ASSIGNMENT_POLICY设置为循环。

使用这种技术,只要存储过程只从引用表中读取数据,您就可以水平地扩展存储过程中的计算工作。这种技术的可伸缩性特征类似于Postgres中的读副本,但没有所有缺点(例如,您仍然可以写入,并且仍然可以获得读写一致性)。

我们希望大多数使用CITUTS的用户都会对这一新功能感到满意。

当您为分布式查询运行EXPLAIN ANALYE时,CITUS会显示它在查询工作节点上的一个碎片时获得的EXPLAIN ANALYE输出。其中一个分片上的查询可能比其他分片上的查询慢得多,在这种情况下,EXPLAIN ANALYSE输出在过去根本解释不了太多。

从Citus9.5开始,我们总是显示最慢的任务。当您将CITUS.EXPLAIN_ALL_TASKS设置为ON时,我们还会按执行时间对任务进行排序。

在过去的6个月里,我们的CUTUS开源团队显著改进了早期捕获错误的程序。(1)根据我们的观察,在合并新功能后的几周内发现了许多错误,因此我们将发布流程正式化。(2)我们开始更好地利用 SQLancer等自动化工具。以及(3)我们重新调整了现有自动化测试的用途,以应用于新的场景。作为这些努力的结果--结合使用Hyperscale(Ctes)的Postgres新客户的经验,他们正在以新的方式锻炼CITUS-我们发现了一些新的微妙的错误。所以我们暂停了通常的发布周期,专注于修复尽可能多的错误。 最终,我们修复了超过25个问题。

在Citus9.5中,我们决定处理一个重构项目--我们从CitusS中删除了一个称为任务跟踪器的组件,从而减少了代码库的大小。任务跟踪器基于 中的HadoopTaskTracker,是在每个工作节点上运行的任务调度器。任务跟踪器执行器通过这些任务调度器调度复杂的重新分区联接。

任务跟踪器方法在处理间歇性故障和避免某些网络往返方面有一些理论上的好处。然而,实施并没有得到很好的优化。而Hadoop Marco(他有这方面的历史)告诉我,我们没有改进它是因为架构上的缺陷:像 一样,任务跟踪器不适合分布式事务。

在2020年初的PostgresCitus9.2版本中,我们更改了重新分区联接逻辑,开始使用新的PostgresCitus自适应执行器,它封装了我们多年来在 服务器上运行并行、分布式事务的许多知识。因此,受Hadoop启发的任务跟踪器已经过时,是时候说再见了!

删除任务跟踪器代码意味着我们能够从组成CUTUS开源引擎的大约140k行C代码中删除大约7k行代码。因此,我们需要维护的代码更少,错误更少,测试执行速度更快,新开发人员可以了解的简化代码库,以及更快的调试周期。

在Citus9.3的博客文章中,我们提到了另一个特性的副作用,CATUS分布式表现在可以完全位于CATUS协调器节点上。这意味着所有的分片都可以位于CATUS协调器节点上,并且Postgres查询将会正常工作。

Citus9.5修复了一些错误,并为该功能添加了更多自动化测试。我们认为这种在单个节点上运行分布式CATUS集群的能力对测试非常有用,我们希望您能就我们将来是否应该将其作为一个完全受支持的特性提供反馈。

如果您想要获得预览,可以运行以下SQL命令。运行这些命令后,可以在单个服务器上创建分布式表。

--将协调员添加到组为0的元数据。

选择MASTER_ADD_NODE(';协调员.hostname';,5432,GroupID:=0);

--将协调员添加到组为0的元数据。

SELECT MASTER_SET_NODE_PROPERTY(';LOCALHOST';,5432,';HALD HARDS';,TRUE);

许多小的改进加起来就是很大的进步(或者,解决问题,行动更快)

我们的CITUS开源团队(也就是内部的“CUTUS引擎团队”)继续为不断改进CITUS的用户体验、性能和可靠性所做的工作而惊叹不已。在下一版的西图斯中,还有更令人兴奋的事情要做。

如果您有数据密集型应用程序(或快速增长的多租户SaaS应用程序),并希望横向扩展Postgres,CUTUS开源文档确实是一个很好的入门位置,其中包括实时分析应用程序、多租户应用程序和时序工作负载的教程。而且因为CATUS是开放源码的,所以下载CITUS包来试用也很容易。现在有了Postgres 13支持!

一定要加入我们的西图斯·斯拉克,参加关于西图斯的社区讨论。

如果你有兴趣阅读更多来自我们团队的帖子,请注册我们的每月时事通讯,并将最新内容直接发送到你的收件箱。