你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
适用于: Azure Database for PostgreSQL 灵活服务器
Azure Database for PostgreSQL 灵活服务器上的弹性群集是 PostgreSQL 的开源 Citus 扩展的托管产品,启用了 PostgreSQL 的水平分片。
虽然 Citus 只是一个扩展,但它连接多个 PostgreSQL 实例。 部署了 Citus 的 Azure Database for PostgreSQL 灵活服务器可将多个 PostgreSQL 实例的管理和配置作为单个资源进行处理。 它还会自动设置节点,并将其告知 Citus 扩展。
灵活服务器上的弹性群集提供基于行和基于架构的两个分片模型。 若要了解详细信息,请查看有关分片模型的开源文档。
体系结构
包含一个或更多个 Azure Database for PostgreSQL 灵活服务器节点的弹性群集。 这些实例会自动相互了解并互相连接,从而形成一个 Citus 群集。 节点必须具有相同的计算层和存储层,可以统一地纵向扩展或缩减到更高或更低层。
弹性群集使用灵活服务器(节点)示例在“无共享”体系结构中相互协调。 与在单个服务器上相比,群集中的节点总共能够容纳的数据和使用的 CPU 核心数都更多。 在该体系结构中,你还可以通过在群集中添加更多节点来缩放数据库。
使用端口 5432 连接到群集会将你放在指定的协调器节点上。 如果使用端口 7432 进行连接,弹性群集还允许使用五元组哈希方法对群集中的连接进行负载均衡。 使用 7432,你仍然可以来到当前指定为协调器的节点上。 对于某些群集范围操作(例如分发表),可能需要通过端口 5432 进行连接。 我们强烈建议在计划执行应用程序架构升级和类似更改时始终在端口 5432 上进行连接。
与 Cosmos DB for PostgreSQL 不同,节点地址不会对外公开。 如果查看 Citus 元数据表(如 pg_dist_node
),则可能会注意到所有节点的 IP 地址都与示例 10.7.0.254
中的相同,但端口编码不同。
select nodeid, nodename, nodeport from pg_dist_node;
nodeid | nodename | nodeport
--------+------------+----------
1 | 10.7.0.254 | 7000
2 | 10.7.0.254 | 7001
(2 rows)
尽管这些节点看起来可能是位于同一台计算机的不同端口上,但在 Azure 的基础结构中,它们位于不同的虚拟机。
要详细了解 Citus,请参阅官方开源项目文档。
默认情况下,使用 Citus 创建的表和架构不会自动在群集之间分布。 你需要确定分片模型,并决定是分发架构,还是使用基于行的分片来分配表数据。
对于分布式表上的每个查询,查询的节点或者将其路由到单个节点,或者跨多个节点将其并行化。 相关决策取决于所需的数据是位于单个节点上还是多个节点上。 使用基于架构的分片时,协调器会将查询直接路由到托管架构的节点。 在基于架构的分片和基于行的分片中,节点都通过查询元数据表来决定执行哪种操作。 这些表会跟踪节点的位置和运行状况,以及跨节点数据的分布情况。
使用其中一个分片模型分发数据后,就可以连接到任何节点以执行 DML(数据修改语言)操作 (SELECT、UPDATE、INSERT、DELETE)。 所有节点都包含查找查询所需数据的元数据,并且能够获取它来回答查询。
DDL(数据定义语言)操作和群集范围操作当前仅限于拥有协调器角色的节点。 确保通过连接到端口 5432 而不是使用端口 7432 来执行 DDL 和群集范围操作。
你可以通过添加新节点并重新平衡其上的数据来横向扩展弹性群集。 重新平衡是一项联机操作,不会阻止正在运行的工作负载。
Shards
前面的部分介绍了分布式表如何存储为工作器节点中的分片。 本部分将进一步介绍有关这些分片的技术细节。
pg_dist_shard
元数据表包含系统中每个分布式表的每个分片的行。 该行将分片标识符 (shardid
) 与哈希空间中的整数范围(shardminvalue
、shardmaxvalue
)匹配。
SELECT * from pg_dist_shard;
logicalrelid | shardid | shardstorage | shardminvalue | shardmaxvalue
---------------+---------+--------------+---------------+---------------
github_events | 102026 | t | 268435456 | 402653183
github_events | 102027 | t | 402653184 | 536870911
github_events | 102028 | t | 536870912 | 671088639
github_events | 102029 | t | 671088640 | 805306367
(4 rows)
如果节点要确定哪个分片包含 github_events
行,它将对行中分布列的值执行哈希算法。 然后此节点检查哪个分片的范围包含此哈希值。 定义范围后,哈希函数的图像就是两者的并查。
分片放置
假设分片 102027 与相应的行关联。 在某个工作器中的 github_events_102027
表中读取或写入此行。 在元数据表中存储的信息后,扩展将确定特定辅助角色是什么。 分片映射到工作器的过程称为分片放置。
节点将查询重写为引用特定表(例如 github_events_102027
)的片段,并在相应工作器上运行这些片段。 下面的查询示例在后台运行,旨在查找分片标识符为 102027 的节点。
SELECT
shardid,
node.nodename,
node.nodeport
FROM pg_dist_placement placement
JOIN pg_dist_node node
ON placement.groupid = node.groupid
AND node.noderole = 'primary'::noderole
WHERE shardid = 102027;
┌─────────┬───────────┬──────────┐
│ shardid │ nodename │ nodeport │
├─────────┼───────────┼──────────┤
│ 102027 │ localhost │ 5433 │
└─────────┴───────────┴──────────┘