国际新闻|Citus 11 for Postgres 完全开源,可从任何节点查询

Posted PostgreSQLChina

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了国际新闻|Citus 11 for Postgres 完全开源,可从任何节点查询相关的知识,希望对你有一定的参考价值。

01 前言

Citus 11.0 来了!Citus 是一个PostgreSQL 扩展,它为 PostgreSQL 添加了分布式数据库的超能力。使用 Citus,您可以创建跨 PostgreSQL 节点集群透明分布或复制的表。Citus 11.0 是一个新的主要版本,这意味着它带有一些非常令人兴奋的新功能,可以实现更高级别的可扩展性。

Citus 11.0 中最大的改进是:您现在可以始终从集群中的任何节点运行分布式查询,因为模式和元数据是自动同步的。我们已经在Citus 11.0 beta 博客文章中分享了一些细节,但对于那些使用不属于初始 beta 的 Citus 开源的人来说,我们也有很大的惊喜。

当我们发布新的 Citus 版本时,我们通常会发布 2 个版本:开源版本和包含一些额外功能的企业版本。但是,Citus 11.0 将只有一个版本,因为Citus 扩展中的所有内容现在都是完全开源的!

这意味着您现在可以在不阻塞写入的情况下重新平衡分片、跨集群管理角色、将租户隔离到他们自己的分片等等。所有这一切都建立在 Citus 11.0 大幅增强的基础上:您可以从任何节点查询您的 Citus 集群,从而创建真正分布式的 PostgreSQL 体验。

在这篇博文中,我们将重点介绍:
1.Citus 企业级功能正式开源

2.从任何节点查询分布式 Postgres 表

3.隐藏预览功能:触发器!

如果您想了解所有新功能,可以查看Citus 11.0 的更新页面,其中包含所有新功能和其他改进的详细分类。

02 Citus 企业功能正式开源

很久以前,Citus Data 是一家企业软件公司。随着时间的推移,我们团队的重点转向开源,成为云供应商,然后成为Azure 不可或缺的一部分。有了新的关注点,我们的团队开发了所有新功能,作为GitHub 上 Citus 开源项目的一部分。使 Citus 开源使您能够直接与开发人员和社区进行交互,了解您运行的代码,避免锁定问题,并为每个人创造更好的开发体验。

去年作为 Citus 10 版本的一部分,我们已经开源了分片重新平衡器,这是 Citus 的一个重要组件,它允许您通过将数据移动到新节点来轻松扩展集群。出于性能原因,分片重新平衡功能也很有用,可以在集群中的所有节点之间平衡数据。

现在,作为 Citus 11.0 的一部分,其余的企业功能也成为开源的:
1.使用逻辑复制重新平衡分片以避免阻塞写入

2.多用户支持(角色和授权传播、行级安全性)

3.多租户应用的租户隔离

4.对节点间身份验证的细粒度控制

5.通过连接池路由内部连接

6.数据加载的性能优化

我最喜欢的新开源功能是非阻塞分片重新平衡器。也许新开源功能中最令人兴奋的是非阻塞分片移动。虽然我们在 Citus 10 中开源了分片重新平衡器,但在开源版本的分片移动过程中,对正在移动的分片的写入被阻止。现在在 Citus 11 中,Citus 通过使用逻辑复制来移动分片。这样,通过将现有数据移动到新节点来扩展集群时,您的应用程序只会遇到短暂的写入延迟。一个先决条件是所有 Postgres 表都有主键。

现在分片重新平衡器的非阻塞方面已经开源,当您在本地、CI 环境或 Azure 中的托管服务中运行 Citus 时,您可以获得完全相同的分片重新平衡功能。

03 从任何节点查询分布式 Postgres 表

Citus 11 还带有一个重要的新功能:自动模式和元数据同步
在典型的 Citus 部署中,您的应用程序通过协调器执行分布式查询。从您的应用程序的角度来看,通过协调器连接使得 Citus 与单节点 PostgreSQL 几乎没有区别。

图 1:Citus 10.2 或更早版本中的 Citus 集群,其中users和items是分布式表,它们的元数据仅在协调器上。

协调器可以处理高分布式查询吞吐量(100k/秒),但有些应用程序仍然需要更高的吞吐量,或者有查询需要在协调器上进行相对大量的处理(例如,使用大型结果集进行搜索)。幸运的是,Citus 11 中的分布式查询可以由任何节点处理,因为分布式表模式和元数据从协调器同步到所有节点。您仍然可以通过协调器执行 DDL 命令和集群管理,但可以选择跨工作节点负载平衡繁重的分布式查询。

图 2:Citus 11.0 集群,其中users和items是分布式表 - 使用新的自动元数据同步功能,他们的元数据会同步到所有节点。

虽然元数据同步在 Citus 11 之前已经作为一种特殊模式存在,但有一些限制(我们有时将其称为“Citus MX”),但它现在是通用且自动的。任何 Citus 集群都将始终在所有节点上具有分布式表元数据,以及您的所有视图、函数等,这意味着任何节点都可以执行分布式查询。

Citus 11 beta 博客文章详细介绍了在从任何节点查询时如何操作集群。博客文章描述了如何查看所有节点的活动,以及如何使用全局进程标识符 (GPID) 将内部查询与分布式查询相关联。这篇文章还介绍了如何在 Citus 节点之间对来自应用程序的连接进行负载平衡。

最重要的是,这个新的元数据同步/从任何节点查询功能对您和您的应用意味着什么?
无需更改应用程序:您的应用程序可以像往常一样继续将 Postgres 查询路由到 Citus 协调器,并让 Citus 弄清楚如何分发查询。

现在,最苛刻的数据密集型应用程序可以选择从任何节点进行查询:如果您愿意并且需要,您可以跨 Citus 工作节点对 Postgres 查询进行负载平衡。请务必遵循有关如何根据最大连接数和负载平衡配置集群的说明。

04 升级到 Citus 11

如果您当前正在运行 Citus 集群,升级到 Citus 11 很简单。安装新包并重新启动 PostgreSQL后,第一步是在所有节点上运行以下命令:
ALTER EXTENSION citus UPDATE;

然后当所有节点都升级后,第二步是连接到协调器并运行:
CALL citus_finish_citus_upgrade();

上面的第 2 步是 Citus 11 中的新增功能。该citus_finish_citus_upgrade功能将确保所有节点都有元数据,这样您现有的集群的行为就与全新的 Citus 11 集群相同。我们建议您在以后的任何 Citus 升级后调用执行citus_finish_citus_upgrade,因为我们可能会添加额外的步骤。

切换到 Citus 11 时无需更改应用程序。您可以通过协调器继续运行所有查询,这对于大多数应用程序来说仍然是最简单的方法。升级后,您可以选择通过工作节点运行部分或全部查询,当然也可以使用所有新功能,例如非阻塞重新平衡器。

升级到 Citus 11 时要考虑的一件事是,一些很少使用的功能已被弃用:

1、分片放置失效用于处理使用基于语句的分片复制复制分片的写入失败。当分片放置上的写入失败时,它将失效,以便系统可以继续使用剩余的副本。虽然这种行为有一些可用性优势,但它也有许多缺点。Citus 仍然支持基于语句的分片复制来扩展读取,因此可以升级使用分片复制的现有分布式表,但升级后分片放置将不再因失败而失效。

2、追加分布式表是在加载新数据时需要频繁创建新分片的分布式表。这种方法的缺点是表的分片过多,并且由于没有明确定义的分布列,许多关系特性不可用。从 Citus 11.0 开始,现有的附加分布式表将是只读的。我们建议切换到散列分布表。

3、分布式 cstore_fdw表是分布式表,其中分片是使用cstore_fdw扩展的外部表。由于 Citus 具有内置的列访问方法cstore_fdw,因此现在不推荐使用分布式表的组合。我们建议在升级到 Citus 11.0 之前转换为列访问方法。

05 我的分片在哪里?

如果您以前使用过 Citus,您可能偶尔会连接到您的工作节点以查看将数据存储在分布式表和引用表中的分片。
每个工作节点都会有一组不同的分片,例如:

\\d
            List of relations
┌────────┬──────────────┬───────┬───────┐
│ Schema │     Name     │ Type  │ Owner │
├────────┼──────────────┼───────┼───────┤
│ public │ citus_tables │ view  │ marco │
│ public │ ref_102040   │ table │ marco │
│ public │ test_102105  │ table │ marco │
│ public │ test_102107  │ table │ marco │
└────────┴──────────────┴───────┴───────┘

在 Citus 11 中,当您连接到任何工作节点时,您会看到分布式表和引用表,但看不到分片:

\\d
            List of relations
┌────────┬──────────────┬───────┬───────┐
│ Schema │     Name     │ Type  │ Owner │
├────────┼──────────────┼───────┼───────┤
│ public │ citus_tables │ view  │ marco │
│ public │ ref          │ table │ marco │
│ public │ test         │ table │ marco │
└────────┴──────────────┴───────┴───────┘
(3 rows)

很酷的是集群中的每个节点现在看起来都一样,但是分片在哪里?
我们发现用户和各种工具会因为看到分布式表和分片的混合而感到困惑。例如,pg_dump将尝试转储分片和分布式表。因此,我们从目录查询中隐藏了分片,但它们仍然存在,如果需要,您可以直接查询它们。

对于需要在特定应用程序中查看分片的情况,我们引入了一个新设置:

-- show shards only to pgAdmin and psql (based on their application_name):
set citus.show_shards_for_app_name_prefixes to 'pgAdmin,psql';

-- show shards to all applications:
set citus.show_shards_for_app_name_prefixes to '*';

\\d
            List of relations
┌────────┬──────────────┬───────┬───────┐
│ Schema │     Name     │ Type  │ Owner │
├────────┼──────────────┼───────┼───────┤
│ public │ citus_tables │ view  │ marco ││ public │ ref          │ table │ marco │
│ public │ ref_102040   │ table │ marco ││ public │ test         │ table │ marco │
│ public │ test_102105  │ table │ marco ││ public │ test_102107  │ table │ marco │
└────────┴──────────────┴───────┴───────┘
(6 rows)

06 Citus 11 中的隐藏预览功能:

分布式表上的触发器

触发器是一个重要的 Postgres 特性,用于维护复杂的数据模型——以及更广泛的关系数据库。当插入、更新或删除行时,触发器函数可以对数据库执行其他操作。由于所有 Citus 节点现在都有元数据,分布式表的分片上的触发器现在可以从存储分片的工作节点对其他分布式表执行操作。

Citus 的触发器方法可以很好地扩展,因为 Postgres 触发器调用被下推到每个分片。然而,Citus 目前无法知道触发器函数会做什么,这意味着它可以做一些导致事务问题的事情。例如,如果触发器函数尝试访问其他分片,它可能看不到一些未提交的写入。避免这种情况的方法是仅从触发函数访问位于同一位置的分片键。

目前,我们要求用户使用以下citus.enable_unsafe_triggers设置显式启用触发器:

CREATE TABLE data (key text primary key, value jsonb);
SELECT create_distributed_table('data','key');
CREATE TABLE data_audit (operation text, key text, new_value jsonb, change_time timestamptz default now());
SELECT create_distributed_table('data_audit','key', colocate_with := 'data');

-- we know this function only writes to a co-located table using the same key
CREATE OR REPLACE FUNCTION audit_trigger()RETURNS triggerAS $$DECLAREBEGIN
    INSERT INTO data_audit VALUES (TG_OP, Coalesce(OLD.key, NEW.key), NEW.value);
RETURN NULL;END;$$ LANGUAGE plpgsql;

-- so, it is safe to enable triggers on distributed tables
SET citus.enable_unsafe_triggers TO on;
CREATE TRIGGER data_audit_trigger
AFTER INSERT OR UPDATE OR DELETE ON data
FOR EACH ROW EXECUTE FUNCTION audit_trigger();

只要您小心只访问位于同一位置的键,使用 Citus 的触发器为您提供了一种利用自动模式和元数据同步的好方法,而不必在节点之间进行负载平衡查询。通过将更多工作推入触发函数,需要更少的分布式查询和网络往返,从而提高整体可伸缩性。

07 分布式 PostgreSQL 的新领域

随着新版 Citus 11 的发布,我们正在进入新的领域。想象一下,如果有一个 FOSS 工具可以将最新版本的 PostgreSQL 变成一个分布式数据库,该数据库可以从单个节点向外扩展,在集群中路由或并行化查询以实现任何规模的高性能,允许您将应用程序连接到任何节点,无中断地横向扩展,在 Azure 上单击几下即可获得集群或在任何环境中自行运行。此外,它可以满足数据密集型工作负载的需求。这就是 Citus 11 提供的功能。

如果您想了解有关 Citus 11 新功能的更多信息,包括如何监控集群和负载平衡流量,请查看我在 Citus 会议上关于 Citus 11 的演讲,其中涵盖了许多细节并包含一个演示。

如果您使用并依赖 Citus,您可能需要查看我们的 Citus 11.0 更新页面,了解有关所有新功能的详细信息。如果您是 Citus 的新手,我建议您访问入门页面。

对于在云中使用 Citus 的用户,我们将很快在 Azure 上更新 Citus。这样,您只需单击几下即可将现在完全开源的 Citus 扩展作为托管服务获得所有最新功能,包括高可用性、备份、主要版本升级、只读副本等。

邀请参加 6 月 28 日星期二的 Citus 11 发布派对
最后,诚邀您参加首届Citus 11 发布派对,该派对将于6月28日星期二上午 9:00 开始, 下午 6 点在 YouTube 上直播。这将是一次非正式地了解 Citus 11 中的新功能。我们希望你可以加入我们,欢迎提出您的问题。(请告诉你的队友,因为这是第一个 Citus 发布派对,还没有人知道这件事。)

图 4:YouTube 直播的缩略图
 

以上是关于国际新闻|Citus 11 for Postgres 完全开源,可从任何节点查询的主要内容,如果未能解决你的问题,请参考以下文章

国际新闻|PostgreSQL 14.313.712.1111.16 和 10.21 发布

postgresql分布式集群之citus

将数据从 Citus 迁移到 RDS

citus安装部署文档

Citus集群拓扑架构介绍

centos7下pgsql9.6之citus集群搭建