你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
重要
新项目不再支持 Azure Cosmos DB for PostgreSQL。 不要将此服务用于新项目。 请改用以下两个服务之一:
将 Azure Cosmos DB for NoSQL 用于分布式数据库解决方案,该方案专为高规模场景设计,并提供 99.999% 的可用性服务级别协议(SLA)、即时自动缩放和跨多个区域的自动故障转移功能。
使用 Azure Database For PostgreSQL 的弹性群集功能,利用开源 Citus 扩展进行 PostgreSQL 的分片。
分片是数据库系统和分布式计算中使用的一种技术,用于在多个服务器或节点之间水平分区数据。 该技术涉及将大型数据库或数据集分解为更小、更易于管理的部分,称为分片。 分片包含数据的子集,所有分片组成完整的数据集。
Azure Cosmos DB for PostgreSQL 提供两种类型的数据分片,即基于行的分片和基于架构的分片。 每种选项都有其自己的分片权衡,使你能够选择最符合应用程序要求的方法。
基于行的分片
Azure Cosmos DB for PostgreSQL 对表进行分片的传统方法是单一数据库,共享架构模型也称为基于行的分片,租户作为同一表内的行共存。 租户是通过定义分布列来确定的,该分布列允许水平拆分表。
基于行是最高效的分片方式。 租户密集打包和分布在群集中的节点之间。 然而,这种方法需要确保架构中的所有表都具有分布列,并且应用程序中的所有查询都按分布列进行筛选。 基于行的分片在 IoT 工作负载和实现硬件使用的最佳利润方面表现出色。
好处:
- 最佳性能
- 每个节点的最佳租户密度
缺点:
- 需要修改架构
- 需要修改应用程序查询
- 所有租户必须共享相同的架构
基于架构的分片
Azure Cosmos DB for PostgreSQL 中的 Citus 12.0 提供基于架构的分片,它是共享数据库、单独的架构模型,架构成为数据库内的逻辑分片。 多租户应用可以使用每个租户的架构来轻松地沿租户维度进行分片。 无需更改查询,应用程序只需进行少量修改即可在切换租户时设置正确的 search_path。 基于架构的分片对于微服务来说是一种理想的解决方案,对于部署应用程序的 ISV 来说也是如此,因为这些应用程序无法进行基于行的分片所需的更改。
好处:
- 租户可以具有异类架构
- 不需要修改任何架构
- 不需要修改应用程序查询
- 与基于行的分片相比,基于架构的分片 SQL 兼容性更高
缺点:
- 与基于行的分片相比,每个节点的租户数更少
分片权衡
| 基于架构的分片 | 基于行的分片 | |
|---|---|---|
| 多租户模型 | 每个租户都有单独的架构 | 具有租户 ID 列的共享表 |
| Citus 版本 | 12.0+ | 所有版本 |
| 与 vanilla PostgreSQL 相比需要额外的步骤 | 无,仅配置更改 | 在每个表上使用 create_distributed_table 按租户 ID 分发和共置表 |
| 租户数目 | 1-1 万 | 1-100 万 |
| 数据建模要求 | 分布式架构之间没有外键 | 每个表以及主键、外键中需要包含租户 ID 列(分布列,也称为分片键) |
| 单节点查询的 SQL 要求 | 每个查询使用单个分布式架构 | 联接和 WHERE 子句应包括 tenant_id 列 |
| 并行跨租户查询 | 否 | 是 |
| 每个租户的自定义表定义 | 是 | 否 |
| 访问控制 | 架构权限 | 架构权限 |
| 跨租户共享数据 | 是,使用引用表(在单独的架构中) | 是,使用引用表 |
| 租户到分片隔离 | 每个租户都有其自己的分片组(按定义) | 可以通过 isolate_tenant_to_new_shard 为特定租户 ID 提供其自己的分片组 |