使用Citus开源碎片重对者扩展Postgres

2021-03-14 04:19:26

人们使用PICTUS扩展的主要原因之一是在多个节点上分发Postgres表中的数据。 Citus通过将原始Postgres表拆分为多个较小的表,并将这些较小的表放在不同的节点上。将更大表分成更小的表的过程称为分片 - 这些较小的Postgres表称为“分片”。然后,CITUS允许您查询碎片,就像他们仍然是单个Postgres表一样。

Citus 10的大型变化之一 - 除了添加柱状存储,以及在单个Citus节点上的碎片Postgres的新能力 - 是我们开辟了Shard Rebalancer。

是的,这是对的,我们已经开放了碎片重创者! Citus 10碎片Rebalancer为您提供了一种简单的方法,可以在群集中重新平衡碎片,并帮助您随时间避免数据热点。让我们挖掘什么和如何。

当Citus最初将Postgres表分成多个碎片时,Citus在群集中的节点上分发碎片(除非您在单个节点上运行Citus。)完成以划分不同节点的工作负载。随着时间的推移,群集的流量和数据库中存储的数据量通常会增加。在某些时候,您可能希望将一些节点添加到群集中,以在每个单个节点上延长工作负载。这被称为“扩展出来”。

虽然有一个问题:当您第一次将节点添加到现有的Citus集群时,还没有数据。这是因为所有碎片仍然在旧节点上。所以,所有这些新节点都不会做任何事情。

这是碎片重新平衡进入的地方。碎片重新平衡确保碎片在所有节点上都会分发。 Citus Shard Rebalancer通过将碎片从一个服务器移动到另一台服务器来实现这一点。

默认情况下,Citus以每个节点具有相同数量的碎片划分节点跨节点的分片。这种方法适用于大量工作负载。但是,当碎片具有显着不同的尺寸时,这可能导致一个节点比另一个节点更多。

一个常见的场景,您最终以不同尺寸的碎片结束的是具有多租户SaaS应用程序。大多数SaaS应用程序使用Customer_ID作为分片键(在我们的文档中,我们调用它的分发列。)如果您在SaaS应用程序上工作,有时您的客户有更多的活动并存储比其他数据更多的数据。因此,包含这些大客户的数据的碎片可能比Citus集群中的其他碎片大得多。

幸运的是,Citus可以在重新平衡碎片时使用不同的策略。默认情况下,Citus使用简单的by_shard_count策略,但在类似的多租户SaaS场景中,您可能希望使用by_disk_size策略。

要重新平衡碎片,使得碎片的大小被考虑,您可以使用以下SQL查询:

默认情况下,Citus附带了我们所涵盖的两个重新平衡策略(by_disk_size和by_shard_count)。您还可以添加自己的重新平衡策略,以防这两个两个不匹配您的工作量所需的内容。我们的CITUS DOCS有各种不同重新平衡策略的例子。借助这些示例的帮助,您可以创建自己的重新平衡策略:

将分片隔离到特定节点。例如,一个包含您获得专用硬件的重要客户的碎片。

根据前往碎片的查询数分碎片。如果您在CPU上瓶颈,这可能很有用,并且您希望在服务器上更均匀地分发查询。经常通过查询数量进行平衡会导致与BY_DISK_SIZE类似的余额,因为更多查询通常意味着更多数据。所有工作负载都不是这种情况,因此在这些情况下,可以更好地创建自己的策略,根据查询的数量创建自己的策略。

让重平架意识到节点之间的容量差异。如果您的一半节点有1 TB磁盘,则这可能是有用的,并且另一半有2个TB磁盘。在这种情况下,您可能希望使用2 TB磁盘的节点上的碎片量的两倍。

默认情况下,Citus 10支持的重新平衡碎片有一个更多用例:您实现了使用更少的节点处理工作负载,并且您希望在服务器成本上保存一些钱。当然,您不会丢失对任何数据的访问权限。因此,在物理地关闭任何节点之前,您将想要将这些碎片移到您计划保留的服务器。

Citrus碎片重新平衡的方式包括两个阶段。在第一阶段Citus生成计划。该计划包含将碎片分开在节点上的碎片所需的动作。

就像你可以使用解释要了解PostgreSQL查询的情况而不执行查询,这可以使用get_rebalance_table_shards_plan来完成Citus Shard Rebalancer,此查询:

或者如果您想看到会发生什么,如果您使用不同的重新平衡策略,您也可以看到备用重新平衡策略的计划:

然后,在重新平衡的第二阶段,CITUS逐一将碎片移为一逐个。您仍然可以从碎片移动时读出来,但写入它被阻止(同时,写入其他碎片可以正常地继续)。如果您使用的是超奇(Citus),您也可以继续写入正在移动的碎片,这是因为我们能够在Azure数据库中使用Azure数据库的一些额外技巧。

如果您想自己向特定节点移动分片,而不是根据重新平衡计划,可以使用citus_move_shard_placement函数来执行此操作。手动移动碎片有一个缺点:运行重新平衡_Table_SCARDS可以撤消此手动更改,无需实现它。为避免这种情况,建议创建自己的重新平衡策略。这样,您可以让碎片repAlancer意识到您希望在特定节点上有一个碎片。

当您入门时,您不需要在开始时使用碎片重磅管理员划分Postgres。但很高兴知道Citus Shard Rebalancer在你身边。因为在您的申请生长时,您可能会想要重新平衡。

有时人们会谈论数据库卫生或postgres工具箱等事情。 嗯,Citus Shard Rebalancer应该是你工具箱的一部分,因为它确保您的Citus集群继续延续时间。 而现在是那大新闻! - 我们开放的碎片重磅师,Citus 10为您提供了一种简单的方式,可以扩展和发展Citus集群。 如果您有兴趣阅读我们团队中的更多帖子,请注册我们的月度通讯,并将最新内容直接提供给您的收件箱。