Azure Cosmos DB for PostgreSQL 中缩放的基本概念

适用对象:PostgreSQL 的 Azure Cosmos DB (由 PostgreSQL 的 Citus 数据库扩展提供支持)

在调查生成新应用的步骤之前,查看相关术语和概念的简要概述会很有帮助。

体系结构概述

Azure Cosmos DB for PostgreSQL 让你能够在服务器组中的多台计算机上分布表和/或架构,并像查询纯 PostgreSQL 一样对这些表进行透明地查询:

Diagram of the coordinator node sharding a table onto worker nodes.

在 Azure Cosmos DB for PostgreSQL 体系结构中,有多种节点:

  • 协调器节点存储分布式表元数据,负责分布式规划。
  • 相比之下,工作器节点存储实际数据、元数据并执行计算。
  • 协调器和辅助角色都是纯 PostgreSQL 数据库,其中加载了 citus 扩展。

若要分发普通 PostgreSQL 表(如上图所示的 campaigns),请运行名为 create_distributed_table() 的命令。 运行此命令后,Azure Cosmos DB for PostgreSQL 透明地跨工作器节点为表创建分片。 在关系图中,分片表示为蓝色框。

若要分布正常的 PostgreSQL 架构,请运行 citus_schema_distribute() 命令。 运行此命令后,Azure Cosmos DB for PostgreSQL 会以透明方式将此类架构中的表转换为单个分片共置表,该表可以作为一个单元在群集节点之间移动。

注意

在没有工作器节点的群集上,分布式表的分片位于协调器节点上。

分片是纯(但专门命名) PostgreSQL 表,用于保存数据的切片。 在示例中,由于我们按 company_id 分发了 campaigns,分片保留市场活动,其中不同公司的市场活动分配给不同的分片。

分布列(也称为分片键)

create_distributed_table() 是 Azure Cosmos DB for PostgreSQL 提供的 magic 函数,用于跨多台计算机分发表和使用资源。

SELECT create_distributed_table(
	'table_name',
	'distribution_column');

上面的第二个参数从表中选取一个列作为分布列。 它可以是具有本机 PostgreSQL 类型的任何列(整数和文本是最常见的)。 分布列的值确定哪些行进入哪些分片,这就是为什么分布列也称为分片键的原因。

Azure Cosmos DB for PostgreSQL 根据其分片键的使用情况来决定如何运行查询:

查询涉及 运行位置
仅一个分片键 位于保存其分片的工作器节点上
多个分片键 跨多个节点并行化

分片键的选择决定了应用程序的性能和可伸缩性。

  • 每个分片键的数据分布不均匀(也称为数据倾斜)对于性能来说并不最佳。 例如,不要选择一个值表示 50% 数据的列。
  • 具有低基数的分片键可能会影响可伸缩性。 只能使用任意数量的分片,因为有不同的键值。 选择基数在数百到数千之间的键。
  • 联接具有不同分片键的两个大表可能很慢。 跨大型表选择通用分片键。 在并置中了解详细信息。

并置

另一个与分片键密切相关的概念是并置。 已并置由同一分布列值分片的表 - 并置表的分片已存储在同一辅助角色上。

下面是由同一键 site_id 分片的两个表。 他们被并置。

Diagram of tables http_request and http_request_1min colocated by site_id.

Azure Cosmos DB for PostgreSQL 可确保这两个表中具有匹配 site_id 值的行存储在同一工作器节点上。 可以看到,对于这两个表,具有的 site_id=1 行都存储在辅助角色 1 上。 其他站点 ID 也是一样。

并置可帮助优化这些表中的 JOIN。 如果联接 site_id 上的两个表,Azure Cosmos DB for PostgreSQL 可以在工作器节点上本地执行联接,而无需在节点之间混排数据。

分布式架构中的表始终相互共置。

后续步骤