PostgreSQL 是适用于各种工作负载的优秀数据库。传统上,Postgres 的唯一问题是它仅限于一台机器。如果您使用的是 Azure Database for PostgreSQL 托管服务,则该限制不再适用于您,因为您可以使用内置的超大规模 (Citus) 选项 — 透明地分片和横向扩展事务和分析工作负载。超大规模(Citus)不断变得越来越好。
Hyperscale (Citus) 的核心是开源 Citus 扩展,它扩展了 Postgres 与分布式数据库的超级能力。每隔几个月,我们就会发布一个新版本的 Citus。我很高兴地告诉您,最新版本 Citus 10 现已在 Hyperscale (Citus) 上提供预览版,并具有令人惊叹的新功能:
- Postgres 的列式存储:压缩 PostgreSQL 和超大规模 (Citus) 表以降低存储成本并加快分析查询!
- 在单个 Citus 节点(基本层)上分片:使用基本层,您可以在单个节点上对 Postgres 进行分片,因此您的应用程序可以“横向扩展”。还可以方便地以更低的价格尝试超大规模 (Citus),起价为 0.27 美元/小时。[1]
- 本地 PostgreSQL 表和 Citus 表之间的连接和外键:混合和匹配 PostgreSQL 和超大规模 (Citus) 表与外键和连接。
- 更改表分布方式的函数:使用新的 alter table 函数在一个步骤中重新分布表。
- 更多:更好的命名、改进的 SQL 和 DDL 支持、简化的操作。
这些新的 Citus 10 功能以一些基本(且有用)的方式改变了 Hyperscale (Citus) 可以为您做的事情。
借助 Citus 10,超大规模 (Citus) 不再只是对 Postgres 进行分片:您可以使用新的 Citus 列式存储功能来压缩大型数据集。而且 Citus 不再只是多节点集群:借助超大规模 (Citus) 中的基本层,您现在可以在单个节点上进行分片以“做好横向扩展”。最后,超大规模(Citus)不再只是将 Postgres 转换为分布式数据库:您现在可以在同一个 Postgres 数据库中混合常规(本地)Postgres 表和分布式表。
简而言之,Azure Database for PostgreSQL 中的超大规模 (Citus) 现在使您能够以任何规模运行 Postgres。
让我们深入了解一下吧!
我们最喜欢的 Postgres 纪念品之一是 PostgreSQL 9.2 赛车海报,上面有 2013 年 PGCon 拍卖的所有提交者的签名。自 Citus 9.2 以来,我们的开源团队一直在为每个新的 Citus 开源版本创建一个新的赛车图像。 Citus 10 为您提供柱状、单节点(基本层)等等,Postgres 大象现在可以扩展到任何规模!
具有超大规模 (Citus) 的 PostgreSQL 列式存储
一些新的超大规模 (Citus) 客户的数据量确实很大,这意味着我们需要一种方法来降低存储成本并充分利用硬件。这就是我们为 Citus 实施列式存储的原因。 Citus Columnar 可以为您提供 3x-10x 或更高的压缩比,甚至更大的 I/O 减少。新的 Citus 柱状功能适用于:
- Citus 10 开源:你可以在这里下载最新的 Citus 包
- Azure Database for PostgreSQL 中的超大规模 (Citus):在撰写本文时,Citus 10 功能在超大规模 (Citus) 中处于预览状态。因此,如果您想试用新的 Citus 柱状功能,则需要在配置新的超大规模 (Citus) 服务器组时在门户中打开预览功能。当然,根据您阅读这篇博文的时间,这些 Citus 10 功能可能已经是超大规模 (Citus) 中的 GA。
最好的部分:无论有没有 Citus 横向扩展功能,您都可以在超大规模 (Citus) 中使用柱状!有关列式表存储的更多详细信息,请参阅我们的超大规模 (Citus) 文档。
我们的 Citus 工程团队在 PostgreSQL 中的列存储方面有着悠久的历史,因为我们最初开发了 cstore_fdw 扩展,它通过外部数据包装 (fdw) API 提供列存储。 PostgreSQL 12 引入了“表访问方法”,它允许扩展以更原生的方式定义自定义存储格式。
Citus 通过表访问方法 API 在 PostgreSQL 中提供列式存储,这意味着您现在可以通过在创建表时简单地添加 USING columnar 来创建 Citus 列式表:
CREATE TABLE order_history (…) USING columnar;
如果您提供了一个基于行(“堆”)的表,您希望稍后将其转换为列式,您也可以使用 alter_table_set_access_method 函数来执行此操作:
-- compress a table using columnar storage
SELECT alter_table_set_access_method('orders_2019', 'columnar');
当您使用 Citus 列式存储时,您通常会看到数据大小减少 60-90%。此外,Citus columnar 只会读取 SQL 查询中使用的列。这可以显着提高 I/O 绑定查询的速度,并大大降低存储成本。
与 cstore_fdw 相比,由于 zstd 压缩,Citus columnar 具有更好的压缩比。 Citus columnar 还支持回滚、流复制、归档和 pg_upgrade。
Citus columnar 仍有一些限制需要注意:尚不支持更新和删除,最好避免单行插入,因为压缩只能在批处理中很好地工作。我们计划在未来的 Citus 版本中解决这些限制,但您也可以使用分区来避免它们。
[更新] 从 Citus 10.2 开始,Citus columnar 现在支持柱状表上的 btree
和 hash
索引。
如果您按时间对时间序列表进行分区,则可以对最近的分区使用基于行的存储来启用单行、更新/删除/upsert 和索引,同时使用列存储来归档不再更改的数据。为了简化这一点,我们还添加了一个功能来一次性压缩所有旧分区:
-- compress all partitions older than 7 days
CALL alter_old_partitions_set_access_method('order_history', now() – interval '7 days', 'columnar');
此过程在每个分区后提交以尽快释放锁。您可以使用 pg_cron 将这个新的 alter 函数作为夜间压缩作业运行。
要了解更多信息,请查看 Jeff Davis 的博客文章:Citus 10 为 Postgres 带来了柱状压缩。 Jeff 还创建了一个视频演示,如果您是一个更直观的人,这个 Citus 柱状演示可能是结识的好方法。
从超大规模 (Citus) 中的基本层开始——“准备好向外扩展”
我们经常将超大规模(Citus)视为“无忧的 Postgres”,因为 Citus 消除了您在选择 Postgres 作为数据库时可能会担心的一个问题:达到单个节点的限制。但是,当您将复杂的应用程序从 Postgres 迁移到 Hyperscale (Citus) 时,您可能需要对应用程序进行一些更改以处理围绕唯一键和外键约束和连接的限制,因为并非每个 PostgreSQL 功能都具有高效的分布式实现.
在 Azure 中,在 Postgres 上扩展您的应用程序而无需承担迁移成本(并且真正无忧)的最简单方法是从您第一次构建应用程序的第一天开始使用 Hyperscale (Citus)。基于 Citus 构建的应用程序始终与常规 PostgreSQL 100% 兼容,因此不存在锁定风险。到目前为止,从超大规模 (Citus) 开始的唯一缺点是运行分布式数据库集群的成本和复杂性,但在 Citus 10 中这发生了变化。借助 Citus 10 和超大规模 (Citus) 中的新基本层,您现在可以对您的单个 Citus 节点上的 Postgres 表,使您的数据库“可横向扩展”。
要在单个节点上开始使用超大规模 (Citus),这篇关于使用基本层分片 Postgres 的文章是一个很好的起点。在预配 Azure Database for PostgreSQL 时,请务必在 Azure 门户中启用预览功能,然后选择在 Hyperscale (Citus) 上预览可用的新“基本层”功能。截至今天,您可以在美国东部 1 以 0.27 美元/小时的价格预置基本层级。这意味着您可以以更低的价格尝试超大规模 (Citus):大约 8 小时的轮胎测试,您只需支付 2-3 美元。
图 1:在 Azure 门户中为 Azure Database for PostgreSQL 预配超大规模 (Citus) 部署选项时,您现在有两个选择:基本层和标准层。
连接后,您可以通过运行以下命令来创建您的第一个分布式表:
CREATE TABLE data (key text primary key, value jsonb not null);
SELECT create_distributed_table('data', 'key');
create_distributed_table 函数会将表划分为 32 个(隐藏的)分片,当单个节点不再足够时,这些分片可以移动到新节点。
您可能会从分布式查询计划中遇到一些开销,但您也会看到跨内核并行化的多分片查询的好处。您还可以制作分布式列式表,以利用 I/O 和存储减少以及并行性。
在超大规模 (Citus) 中使用基本层分布 Postgres 表的最大优势是您的数据库将准备好使用 Citus 分片重新平衡器进行横向扩展。
PostgreSQL 和 Citus 表之间的连接和外键
借助超大规模 (Citus) 中的新基本层功能和分片重新平衡器,您可以通过分布表来进行横向扩展。但是,分发表确实涉及某些权衡,例如在工作节点上查询分片时需要额外的网络往返,以及一些不受支持的 SQL 功能。
如果您有一个非常大的 Postgres 表和数据密集型工作负载(例如,表的频繁查询部分超出内存),那么使用超大规模 (Citus) 将表分布在多个节点上所获得的性能收益将大大超过任何缺点。但是,如果您的大多数其他 Postgres 表都很小,那么您最终可能不得不进行额外的更改而没有太多额外的好处。
一个简单的解决方案是根本不分发较小的表。在大多数超大规模 (Citus) 部署中,您的应用程序连接到单个协调器节点(这通常就足够了),并且协调器是一个功能齐全的 PostgreSQL 节点。这意味着您可以按如下方式组织数据库:
- 将大表转换为 Citus 分布式表,
- 将经常与分布式表连接的较小表转换为引用表,
- 将具有外键的较小表从分布式表转换为引用表,
- 将所有其他表保留为协调器本地的常规 PostgreSQL 表。
图 2:分布非常大的表(点击)的数据模型示例。因为 Clicks 表有一个 Ads 的外键,所以我们把 Ads 变成了一个引用表。 Ads 也有其他表的外键,但我们可以将这些其他表(Campaigns、Publishers、Advertisers)作为本地表保留在协调器上。
这样,您可以在需要的地方横向扩展 CPU、内存和 I/O。并尽量减少您不需要的应用程序更改和其他权衡。为了使该模型无缝运行,Citus 10 添加了对 2 个重要功能的支持:
- 本地表和引用表之间的外键
- 本地表和分布式表之间的直接连接
借助超大规模 (Citus) 中的这些新 Citus 10 功能,您可以混合和匹配 PostgreSQL 表和 Citus 表,以获得两全其美的效果,而无需在数据模型中将它们分开。
改变一切!
当您使用 Hyperscale (Citus) 分发 Postgres 表时,选择您的分布列是重要的一步,因为分布列(有时称为分片键)决定了您可以创建哪些约束、如何(快速)连接表等等.
Citus 10 添加了 alter_distributed_table 函数,因此您可以更改分布式表的分布列、分片计数和协同位置。这篇博文介绍了如何以及为什么将 alter_distributed_table 与 Hyperscale (Citus) 一起使用。
-- change the distribution column to customer_id
SELECT alter_distributed_table('orders',
distribution_column := 'customer_id');
-- change the shard count to 120
SELECT alter_distributed_table('orders',
shard_count := 120);
-- Co-locate with another table
SELECT alter_distributed_table('orders',
distribution_column := 'product_id',
colocate_with := 'products');
在内部,alter_distributed_table 重新排列工作节点之间的数据,这意味着它速度很快并且在非常大的表上运行良好。我们希望这可以让您更轻松地尝试分发您的表,而无需重新加载您的数据。
您也可以在生产环境中使用 alter_distributed_table 函数(它是完全事务性的!),但您确实需要 (1) 确保有足够的磁盘空间来多次存储表,以及 (2) 确保您的应用程序可以容忍暂时阻止所有对表的写入。
Citus 10 中的许多其他功能 - 现在可在 Hyperscale (Citus) 中预览
这儿还有更多!
-
DDL 支持
更多 DDL 命令可在分布式 Citus 表上无缝运行,包括 CREATE STATISTICS、ALTER TABLE … SET LOGGED 和 ALTER SCHEMA … RENAME。 -
SQL 支持
现在可以在查询的 SELECT 部分中使用相关子查询,只要分布式表通过它们的分布列连接即可。 -
用于查看集群状态的新视图:citus_tables 和 citus_shards
citus_tables 视图显示 Citus 表及其分布列、总大小和访问方法。 citus_shards 视图显示各个分片的名称、位置和大小。
开始使用 Citus 10 的两种简单方法
如果您和我们一样兴奋并想使用这些新的 Citus 10 功能,那么现在这样做比以往任何时候都容易。
-
超大规模 (Citus) 中的基本层使得在我们的 Azure Database for PostgreSQL 托管服务中开始使用托管 Citus 节点非常便宜。 (我们的 Azure 文档中也有一个基本层快速入门。)
-
您还可以在笔记本电脑上将 Citus 开源作为单个 Docker 容器运行!单个 docker run 命令不仅是试用 Citus 的一种简单方法,它还为您提供本地开发机器和在云中使用 Citus 之间的功能对等。
# run PostgreSQL with Citus on port 5500
docker run -d --name citus -p 5500:5432 -e POSTGRES_PASSWORD=mypassword citusdata/citus
# connect
psql -U postgres -d postgres -h localhost -p 5500
您还可以查看我们可爱的全新 Citus 入门页面,了解有关如何入门的更多资源 - 我的队友在那里策划了一些很好的学习工具,无论您喜欢的学习模式是阅读、观看还是做事。
更多有关 Citus 10 新功能的深入博客文章
自从 Citus 10 开源版本推出以来,我们还发布了一系列关于 Citus 10 中引人注目的新功能的深入博客文章(以及一个演示!):
- Citus 10 为 Postgres 带来了柱状压缩
- Citus Columnar 的视频演示
- Citus 分片再平衡器的开源
- 在超大规模(Citus)中使用基本层对 Postgres 进行分片
- 用于 Postgres 的 Citus 提示,如何更改分发密钥、分片计数等
最后,非常感谢所有使用 Hyperscale (Citus) 扩展 Postgres 并花时间提供反馈并参与我们旅程的所有人。如果您在 GitHub 上提交了问题、提交了 PR、在 Twitter 上与我们的@citusdata 或@AzureDBPostgres 团队交谈、注册了我们的每月 Citus 技术通讯,或者加入了我们的 Citus Public 社区问答…好吧,谢谢。请保持反馈。您也可以随时通过 Ask Azure DB for PostgreSQL 电子邮件地址联系我们的产品团队。
我们迫不及待地想看看您如何使用超大规模 (Citus) 中的新 Citus 10 功能!
脚注
- 截至发布时,在 Azure 上的美国东部地区,具有 2 个 vCore、8 GiB 总内存和 128 GiB 存储在协调节点上的超大规模 (Citus) 基本层的成本为 0.27 美元/小时或约 200 美元/月 ↩
原文标题:New Postgres superpowers in Hyperscale (Citus) with Citus 10
原文作者:Marco Slot
原文地址:https://techcommunity.microsoft.com/t5/azure-database-for-postgresql/new-postgres-superpowers-in-hyperscale-citus-with-citus-10/ba-p/2335404